Usando o Gmail para enviar e-mail com o ActionMailer no Rails
Existe uma maneira muito fácil de se enviar e-mails no Rails e usando o Gmail. Nesse pequeno tutorial tentarei explicar como fazer isso funcionar.
Primeiramente é preciso saber que o Gmail utiliza para autenticação de protocolo SMTP (envio de e-mails) o ssl/tls. Essa forma de autenticação não é suportada nativamente pelo ActionMailer. Isso quer dizer que precisaremos de uma ajudinha para podermos enviar e-mails utilizando o Rails e o Gmail.
Essa ajudinha é uma biblioteca que está voando pela Internet (eu não sei quem é o autor e muito menos da onde ela saiu) e nos ajudará com a autenticação. Eu tenho uma cópia dessa biblioteca em meu GitHub, você pode pegá-la aqui.
Com a biblioteca em mãos copie ela para a pasta lib do seu projeto Rails. Provavelmente ficará assim o caminho:
/lib/smtp_tls.rb
Agora abra o arquivo config/environment.rb e lá no fim, bem lá no fim mesmo, adicione o seguinte trecho de código:
ActionMailer::Base.default_content_type = "text/html" ActionMailer::Base.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :authentication => :plain, :user_name => "seuemail@gmail.com", #Você pode usar o Google Apps! :password => 'suasenha' }
Bacana. Está tudo configurado. Agora vamos ver como se fazer no ActionMailer para se enviar um e-mail. Vamos gerar um novo Mailer. Em seu console digite:
ruby script/generate mailer Notificador
Seu novo mailer será gerado. Após a geração, abra ele (app/models/notificador.rb)
Adicione o seguinte método:
def notificar recipients "destinatario@email.com" from "meumail@meuemail.com" subject "Titulo do Email" end
Agora você precisa adicionar uma view com o mesmo nome desse método, assim como se faz com os Controllers. Nese caso, a vew ficaria views/teste/notificar.erb
Nesse arquivo ficará tudo o que você quer enviar ao destinatório. É o corpo do e-mail mesmo. Você pode utilizar variáveis de instância caso queira passar alguma informação para a view, da mesma forma que é feito nos controllers.
Criada a view, basta chamar o mailer nos controllerspara enviar o email da seguinte forma:
Notificador.deliver_notificarRepare que é colocado um deliver_ ali antes do nome do método que setamos. Isso é normal.
Se tudo ocorrer bem seu e-mail será enviado. Porém enviando um e-mail dessa forma irá ter um tempo de request mais demorado.




há 1 mês atrás
Ola, post muito util.
Voce poderia apenas mudar a linha:
“Teste.deliver_notificar” para “Notificador.deliver_notificar”
Pois assim nao teria problema em fazer o exemplo completo, como eu tive.
Valeu!