Como enviar email com Rails

De Wiki Locaweb
Ir para: navegação, pesquisa

Para utilizar as versões atualizadas do Rails sua hospedagem deve estar servidor em Linux AS-5
Siga o processo abaixo para identificar o servidor que está atualmente :

  • Acesse o Painel de Controle e entre com seu login e senha;
  • Em Hospedagem de Sites, clique em 'Gerenciar hospedagem;
  • Estando desta forma : Plataforma: Linux CentOS ou superior poderá utilizar , sendo inferior é necessário que solicite a migração de servidor via * HelpDesk


Exemplo funciona em versão Rails 2.1.1

Para criar a aplicação nesta versão veja o seguinte artigo : Aplicações Rails em versão específica


Right-arrow-32.png O primeiro passo é criar a aplicação:

rails _2.1.1_ email

Right-arrow-32.png Depois entre no diretório da aplicação que você criou (no nosso exemplo, é 'email').

cd email

Right-arrow-32.png Configure o banco de dados editando o arquivo: config/database.yml

production: 
adapter: '''mysql'''<br>
encoding: '''utf8'''<br>
database: '''nomedabase   #Coloque aqui o usuário da base de dados'''<br>
username: '''usuariobase  #Coloque aqui o usuário da base de dados'''<br>
password: '''senha da base'''<br>
host: '''IP do servidor MYSQL ou mysql01.dominio (Não use "localhost" pois o servidor de banco está separado do web)'''<br>
test: production<br>
development: production<br>

Right-arrow-32.png Caso ainda não tenha uma base MySQL ativa em sua hospedagem ou se quiser ativar uma nova base específica para sua aplicação rails, consulte esse artigo Ativando uma base MySQL inclusa no plano


Right-arrow-32.png Adicionar um arquivo arquivo em sua estrutura  : lib/smtp_tls.rb

require "openssl"
require "net/smtp"
 
Net::SMTP.class_eval do
private
def do_start(helodomain, user, secret, authtype)
raise IOError, 'SMTP session already started' if @started
check_auth_args user, secret, authtype if user or secret
 
sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
@socket = Net::InternetMessageIO.new(sock)
@socket.read_timeout = 60 #@read_timeout
@socket.debug_output = STDERR #@debug_output
 
check_response(critical { recv_response() })
do_helo(helodomain)
 
raise 'openssl library not installed' unless defined?(OpenSSL)
starttls
ssl = OpenSSL::SSL::SSLSocket.new(sock)
ssl.sync_close = true
ssl.connect
@socket = Net::InternetMessageIO.new(ssl)
@socket.read_timeout = 60 #@read_timeout
@socket.debug_output = STDERR #@debug_output
do_helo(helodomain)
 
authenticate user, secret, authtype if user
@started = true
ensure
unless @started
# authentication failed, cancel connection.
@socket.close if not @started and @socket and not @socket.closed?
@socket = nil
end
end
 
def do_helo(helodomain)
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end
 
def starttls
getok('STARTTLS')
end
 
def quit
begin
getok('QUIT')
rescue EOFError
end
end
end


Right-arrow-32.png Agora, vamos adicionar os códigos abaixo no arquivo /home/LOGIN_DE_FTP/rails_apps/APLICACAO/config/environment.rb depois do último end. OBSERVAÇÃO:Os dados para a autenticação, são o usuário e senha de FTP

require 'smtp_tls'
 
ActionMailer::Base.default_content_type = "text/html"
ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.smtp_settings = {
:address => "localhost",
:port => 587,
:authentication => :login,
:domain => "dominio",
:user_name => "userftp",
:password => "senha"
}

Right-arrow-32.png Seguindo, vamos gerar o mailer:

script/generate mailer Emailer

Right-arrow-32.png Editar/criar o nosso model: app/models/emailer.rb Obs : Altere a variável de instância @recipients com o email no qual deseja receber a mensagem.

class Emailer < ActionMailer::Base
   ActionMailer::Base.delivery_method = :sendmail
   ActionMailer::Base.sendmail_settings = {
    :location       => '/usr/sbin/sendmail',
    :arguments      => '-i -t -f EMAIL@SEUDOMINIO.COM' #após o parâmetro -f coloque um email@seudominio
}
 
  def contact(from, subject, message, name, sent_at = Time.now)
    @subject = subject # Titulo do email
    @recipients = seuemail@dominio # Destino do email
    @from = from # origem do email
    @reply_to = from # Responder email para '''(Novidade do rails 2.1)'''
    @sent_on = sent_at # Data do email
 
# Dados para a view
 
    @body["name"] = name
    @body["title"] = subject
    @body["email"] = from
    @body["message"] = message
    @headers = {}
  end
end

Right-arrow-32.png Criar um controller chamado Emailers:

script/generate controller emailers

Right-arrow-32.png Dentro dele vamos adicionar o método send_email: app/controllers/emailers_controller.rb

class EmailersController < ApplicationController
def send_email
    if request.post?
      from = params[:from]
      subject = params[:subject]
      message = params[:message]
      name = params[:name]
 
      if !from.blank? and !subject.blank? and !message.blank? and !name.blank?
        Emailer.deliver_contact(from, subject, message, name)
        return if request.xhr?
        render :text => 'O email foi enviado com sucesso'
      else
        @form_error = 'Nao foi enviado o email'
      end
    end
  end
end

Right-arrow-32.png Criar a view para o nosso novo método do controller: app/views/emailers/send_email.html.erb

<% form_tag :action => 'send_email' do %>
  <table border="0">
   <tr>
     <th>Nome:</th> 
      <td><%= text_field_tag :name %></td>
    </tr>
<tr>
    <th>Email:</th>
     <td><%= text_field_tag :from %></td>
</tr>
<tr>
<th>Assunto:</th>
<td><%= text_field_tag :subject %></td>
</tr>
</table>
 
<%= text_area_tag :message %> <p />
 
<%= submit_tag "Enviar" %>
<% end %>

Right-arrow-32.png Reinicializar a aplicação :

touch tmp/restart.txt

Right-arrow-32.png Agora para testar use o endereço: http://dominio/emailers/send_email


Veja também

Links

Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Ferramentas
Criar um livro