Action mailer nos permite enviar emails desde nuestra aplicación usando mailer clases y vistas. Mailers funcionan muy parecido a los controladores, heredan de ActionMailer::Base
y se ubican en la carpeta app/mailers
.
Vamos a crear un mailer para nuestra app que nos ayude enviando correos de notificacíón cuando un usuario a sido registrado o eliminado.
Al igual que los controladores o modelos, rails cuenta con un generador de mailers, para generar un mailer con metodos de envio predefinidos welcome_email
y farewell_email
usamos el generador mailer asi:
$rails g mailer UserMailer welcome_email farewell_email
Este generador creara lo siguiente:
-
Una clase
UserMailer
ubicada enapp/mailers
con los metodos welcome_email y farewell_email, que sera donde manejaremos la lógica del envio de los diferentes correos de usuario.class UserMailer < ApplicationMailer def welcome_email end def farewell_email end end
-
2 vistas por cada uno de los métodos, una con extensión
.text.erb
y la otra con extensión.html.erb
que se ubicarán en la carpetaapp\views\user_mailer
, y que serán utilizadas como plantillas para el contenido de los emails a enviar.
En las diferentes vistas generadas escribimos el contenido que queremos sea enviado en el mensaje, por ejemplo en la vista welcome_email.html.erb
podriamos poner algo como:
<h1> Bienvenido a nuestra grandiosa app!!</h1>
<div>
<p> <%=@gretting%> <%=@user.name %> </p>
<br>
Ahora haces parte de nuestra familia.
</div>
En la vista welcome_email.text.erb
pondriamos el mismo mensaje pero en texto plano (sin utilizar html), algo como:
Bienvenido a nuestra grandioasa app!!
<%=@gretting%>, <%=@user.name %>
Ahora haces parte de nuestra familia.
Podemos configurar nuestro correo personal de gmail o usar una herramienta de envio de correos como mailgun.
Si vamos a utilizar gmail, es necesario permitir el acceso de aplicaciones menos seguras aquí.
En el archivo config/environments/development.rb
, configuramos el proveedor de correo de siguiente manera:
-
Para Gmail:
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.gmail.com', port: 587, domain: 'gmail.com', user_name: 'your@gmail.com', password: '******', #password de gmail authentication: 'plain', enable_starttls_auto: true }
-
Para Mailgun:
config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'smtp.mailgun.org', port: 587, domain: 'sandbox36046003a43b47b78647dfefdd8de94b.mailgun.org', #dominio configurado en mailgun user_name: 'postmaster@sandbox36046003a43b47b78647dfefdd8de94b.mailgun.org', password: '6451d5794a06f1e448592240bef43de1-c8e745ec-be6d6731', authentication: 'plain', enable_starttls_auto: true }
En el mailer user_mailer.rb
agregamos el código necesario para que nuestra lógica de envio de correo funcione.
En este caso, queremos enviar un mensaje de bienvenida cada vez que un usuario sea creado en nuestra app, para lograrlo simplemente agregamos el siguiente código al método welcome_email
def welcome_email user
@greeting = "Hola"
@user = user
mail to: @user.email, subject: 'Libraryapp te de la bienvenida ' + @user.name
end
En el caso del email de despedida procedemos de manera similar pero en el método farewell_email
def farewell_email user
@user = user
mail to: @user.email, subject: 'Hasta pronto ' + @user.name
end
Como queremos enviar correos de bienvenida y despedida a nuestros usuarios, debemos llamar a los métodos que hemos creado anteriormente, desde las acciones apropiadas del controlador usuarios (app/controllers/v1/user_controller
), asi:
Para enviar un correo de bienvenida, agregamos el método welcome_email
de nuestro mailer desde la acción create y pasamos como atributo el usuario creado.
def create
@user = User.new(user_params)
if @user.save
UserMailer.welcome_email(@user).deliver_now
render json: @user, status: :created, location: v1_user_url(@user)
else
render json: @user.errors, status: :unprocessable_entity
end
end
En el caso de correo de despedida, llamamos el método farewell_email
de nuestro mailer desde la acción destroy y pasamos como atributo el usuario eliminado.
def destroy
@user.destroy
UserMailer.farewell_email(@user).deliver_now
end
El método deliver_now
le dice a rails que envie el correo inmediatamente y que el flujo de ejecución de la aplicación debe esperar a que esto se ejecute.
Como los mailers están integrados con Active Job, podemos enviar emails por fuera del flujo de ejecución del programa usando el método deliver_later
, asi el usuario no tiene que esperar que el email se envié y el servicio puede ser más rápido.