Skip to content

Instantly share code, notes, and snippets.

@Juandkpa
Created October 7, 2018 16:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Juandkpa/7da71271f2db3f83b144fcfd51f5c710 to your computer and use it in GitHub Desktop.
Save Juandkpa/7da71271f2db3f83b144fcfd51f5c710 to your computer and use it in GitHub Desktop.
Rails Mailers

Rails Mailers

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.

Usando 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.

Creando mailer controller

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 en app/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 carpeta app\views\user_mailer, y que serán utilizadas como plantillas para el contenido de los emails a enviar.

Personalizando mensajes

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.

Configurando proveedor de correo

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 
    }

Definiendo la lógica del envío de correo

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

Enviando correo en las acciones deseadas

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment