Envío de Correos con ActionMailer en Rails

Clase 31 de 36Curso de Introducción a Ruby on Rails

Resumen

¿Qué es el ActionMailer en Rails?

En el mundo de Ruby on Rails, el ActionMailer es un módulo esencial que te permite enviar correos electrónicos a los usuarios de manera automática. Esta herramienta es fundamental para notificar a los participantes cuando, por ejemplo, se ha creado una nueva tarea en nuestra aplicación. Antes de empezar a utilizar ActionMailer, es importante que repases los datos necesarios y tengas tu entorno de desarrollo listo para seguir adelante.

¿Cómo crear un Mailer en Rails?

Para comenzar a enviar correos electrónicos, primero debemos generar un Mailer. Utilizaremos el conocido generador de Rails, rails generate, parametrizado con mailer. Esto generará la estructura de directorios y archivos necesaria para la creación del email. En este caso, llamaremos al sistema de emails ParticipantMailer. Al usar el comando, se crean varios directorios y archivos, entre ellos, el archivo principal ParticipantMailer, donde desarrollaremos la lógica del envío del correo.

rails generate mailer ParticipantMailer

¿Cómo editar el archivo del Mailer?

Dentro del archivo ParticipantMailer, podemos crear métodos como si fueran acciones de un controlador. Dichos métodos están asociados a vistas que renderizarán el email. Vamos a crear un método llamado new_tasks_email que, mediante variables, transmitirá información a la vista.

class ParticipantMailer < ApplicationMailer
  def new_tasks_email(user, task)
    @user = user
    @task = task
    mail(to: @user.email, subject: 'Nueva tarea asignada')
  end
end

¿Cómo invocar el Mailer desde el modelo de tarea?

Es fundamental llamar al Mailer una vez que una nueva tarea ha sido creada. Para lograr esto, utilizamos un callback after_create en el modelo Task. Este callback llamará al método de envío de correo electrónico que hemos definido.

class Task < ApplicationRecord
  after_create :send_email

  private

  def send_email
    participants = self.participants + [self.owner]
    participants.each do |user|
      ParticipantMailer.with(user: user, task: self).new_tasks_email.deliver_later
    end
  end
end

¿Cómo crear una vista para el email?

La vista del correo es la estructura HTML que se enviará a los usuarios. Utilizamos el archivo new_tasks_email.html.haml para definir el contenido del correo.

%h1 Hola, #{@user.email}
%p Tienes una nueva tarea:
%ul
  %li= "Nombre: #{@task.name}"
  %li= "Descripción: #{@task.description}"
  %li= "Categoría: #{@task.category.name}"
  %li= "Ver tarea en el siguiente enlace: #{link_to 'Ver tarea', task_path(@task)}"

Previsualización de correos con Letter Opener

Para comprobar y previsualizar los correos sin necesidad de enviar mensajes reales, utilizamos la gema letter_opener. Esta gema permite abrir los correos en el navegador, otorgando un entorno seguro para pruebas y ajustes.

Configuración de Letter Opener

  1. Agrega letter_opener al grupo de desarrollo en tu Gemfile:

    group :development do
      gem 'letter_opener'
    end
    
  2. Configura el entorno de desarrollo en config/environments/development.rb:

    Rails.application.configure do
      config.action_mailer.delivery_method = :letter_opener
      config.action_mailer.perform_deliveries = true
      config.action_mailer.raise_delivery_errors = true
      config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
    end
    

Asegúrate de instalar la gema y reiniciar el servidor:

bundle install
rails server

Ahora, puedes crear una nueva tarea desde la interfaz de tu aplicación y verificar que los correos se generen correctamente en el navegador, gracias a letter_opener. Esto no solo facilita la vista previa, sino también la detección de errores y pruebas de estilo en tus correos electrónicos.

¡Sigue adelante, profundiza en tus conocimientos de Rails y descubre todo lo que ActionMailer puede ofrecerte!