19
Enviar e-mail com o rails 2.1 utilizando serviços SMTP do gmail
Filed Under (Ruby on Rails links, Tutorial) by marcos on 19-08-2008
Tagged Under : e-mail, gmail, rails, Ruby on Rails links, Send email, smtp
Uma duvida muito comum que aparece com as pessoas que estão estudando rails (Foi o meu caso :D) é enviar e-mail através da sua aplicação, seja para validar cadastro, notificação de usuário.. e inúmeros outros motivos que aparecem (Só não utilizar para enviar SPAM!!).
Vamos iniciar criando nossa aplicação:
$ rails email
Caso tenha funcionado o rails cria o projeto dentro dos padrões MVC:
Vamos configurar o banco de dados.. caso ao contrários.. nossa aplicação não funciona. Para isso edite o arquivo db/database.yml, e adicione o código abaixo (Caso for banco de dados MySQL)
adapter: mysql
encoding: utf8
database: email
username: root
password:
host: localhost
development
development
Não se esqueça de criar o banco de dados tambem:
Para nós podermos utilizar o serviço de smtp do gmail é necessário adicionar o arquivo lib/smtp_tls.rb devido ao fato do gmail usar TLS.
Net::SMTP.class_eval do
private
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
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end
getok('STARTTLS')
end
begin
getok('QUIT')
rescue EOFError
end
end
end
Adicionar os códigos abaixo no arquivo config/environment.rb
Rails::Initializer.run do |config|
# (...) Não apague o conteúdo dentro do |config|
end
ActionMailer::Base.default_content_type = "text/html"
ActionMailer::Base.smtp_settings = { :address => "smtp.gmail.com",
:port => 587,
:authentication => :plain,
:domain => "mycompany.com",
:user_name => "seuemail@gmail.com",
:password => 'suasenha'
}
Não esqueça de habilitar o acesso via SMTP/POP dentro do gmail.. pois por padrão vem desabilitado.
Agora vamos criar o nosso mailer:
Agora vamos editar o nosso model: app/models/emailer.rb
@subject = subject # Titulo do email
@recipients = 'seuemail@gmail.com' # 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
# view
@body["name"] = name
@body["title"] = subject
@body["email"] = from
@body["message"] = message
@headers = {}
end
end
Vamos criar agora a view para o contact: app/views/emailer/contact.html.erb
Para verificar se tudo está funcionando. vamos criar um controller chamado Emailers:
Dentro dele vamos adicionar o método send_email: app/controllers/emailers_controller.rb
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 = 'Não foi enviado o email'
end
end
end
end
Só falta agora criar a view para o nosso novo método do controller: app/views/emailers/send_email.html.erb
Agora para testar: http://localhost:3000/emailers/send_email
É isso.. até a proxima



Nossa morzão entendi tudo desse negocio de mandar email pelo rails….mor ta bonituuuu o teu blog gostei bastantão
Beijao
O Garoto tem futuro
Muito bom, parabens