Envío de Correos
El componente que se encarga de los envíos de correos en Rails es Action Mailer.
El primer paso para poder enviar correos en Rails es crear un mailer.
Así como los controladores, los mailers involucran varios archivos, así que es mejor utilizar el generador que trae Rails.
Por ejemplo, para crear un mailer llamado UserMailer
que agrupe los correos que les vamos a enviar a los usuarios se utiliza el siguiente comando que crea varios archivos:
El componente principal del mailer es la clase UserMailer
que se se encuentra en el archivo app/mailers/user_mailer.rb
:
Cada método de la clase se va a convertir en un correo. Por ejemplo, creemos un nuevo correo de notificación cuando se publica un nuevo libro:
La primera línea del método new_book
está creando una variable de instancia para la vista. La segunda línea renderiza y envía el correo.
Creando la vista del email
Así como con los controladores, las vistas de los emails deben ir en una ubicación definida y se deben llamar igual al método.
Por ejemplo, para el método new_book
debemos crear un archivo llamado new_book.html.erb
dentro de la carpeta app/views/user_mailer/
:
El layout por defecto se encuentra en app/views/layouts/mailer.html.erb
.
Podemos crear también una versión de texto para los clientes de correo que aún no soportan HTML (aunque la realidad es que hoy en día la mayoría soporta HTML):
Cuando llamas el método new_book
desde books_controller
, Action Mailer va a detectar las dos vistas (HTML y texto) y las va a enviar para que cada cliente de correo decida cuál mostrar.
Invocando el mailer
Para enviar el email desde otra parte de la aplicación invocas el método sobre la clase directamente y lo envías con deliver_now
o deliver_later
. Por ejemplo:
La diferencia entre deliver_now
y deliver_later
es que este último envía el mensaje de forma asincrónica, pero para eso debes tener configurado Active Job.
Configurando el ambiente de desarrollo
En desarrollo no queremos que los emails lleguen realmente a su destino, simplemente saber que están funcionando.
La forma más fácil que hemos encontrado es con una gema llamada Letter Opener que permite visualizar los correos en el navegador.
Para configurar Letter Opener:
Agrega la gema al
Gemfile
:Ejecuta
bundle install
.Configura el modo de envío en
config/environments/development.rb
(busca la línea y asegúrate que quede como la siguiente):
Eso es todo. La próxima vez que se envíe un email se abrirá una nueva pestaña del navegador con el email.
Configurando el ambiente de producción
Lo más recomendado para producción es utilizar un servicio como MailGun, Postmark, SendGrid o uno parecido.
Utilizando URLs en las vistas de los emails
Si vas a incluir vínculos a tu aplicación en los emails es importante que utilices los helpers que terminan en _url
en vez de _path
(es decir, root_url
en vez de root_path
) para que Action Mailer genere toda la URL al sitio.
Sin embargo, lo anterior presenta un problema y es decirle a Rails cuál es el dominio en donde va a estar alojada la aplicación.
Para eso hay varias alternativas pero quizá la más fácil sea configurar cada uno de los ambientes con el host
correspondiente.
Por ejemplo, en config/environments/development.rb
y config/environments/test.rb
:
En config/environments/production.rb
:
Last updated