Envío de Correos en Rails con ActionMailer y Background Jobs

Clase 31 de 33Curso de Creación de APIs con Ruby on Rails

Resumen

Configura y envía correos en Rails con Action Mailer, integrándolo con Active Job para tareas en background. Aprende a generar el mailer, definir el método con mail(to:, subject:), crear la vista .text.erb con variables de instancia y probar en desarrollo con letter_opener. Además, comprende cuándo usar deliver_now o deliver_later, y cómo ejecutar pruebas desde la Rails console.

¿Cómo generar un mailer con Rails y definir el correo?

Para enviar el reporte al usuario que lo solicitó, se usa el generador de Action Mailer. En aplicaciones con API (sin módulo de vistas), el generador no crea plantillas automáticamente.

  • Ejecuta el generador del mailer.
  • Define un método con los parámetros necesarios: usuario, post y reporte.
  • Usa el DSL del mailer con mail para establecer destinatario y asunto.
rails g mailer post_report
# app/mailers/post_report_mailer.rb
class PostReportMailer < ApplicationMailer
  def post_report(user, post, report)
    @post = post
    @report = report
    mail(to: user.email, subject: "Post #{post.id}: reporte de post")
  end
end

Puntos clave: - Generador variable según tipo de app: en Rails completo genera vistas; en API no. - Parámetros: se pasa el usuario para el email y el post/reporte para el contenido. - Asunto personalizable: incluye el ID del post para contexto claro.

¿Cómo crear la vista .text.erb y compartir datos?

El correo se renderiza con una plantilla cuyo nombre coincide con el método del mailer. En entorno API, debes crearla manualmente.

  • Crea la carpeta del mailer en views.
  • Nombra el archivo exactamente como el método del mailer con extensión .text.erb.
  • Usa variables de instancia definidas en el mailer.
<!-- app/views/post_report_mailer/post_report.text.erb -->
Post id: <%= @post.id %>
Título: <%= @post.title %>

Buenas prácticas y errores comunes: - Coincidencia de nombres: método y archivo deben coincidir. - Extensión correcta: usar .text.erb, no .txt.erb. - Variables de instancia: define @post y @report en el mailer para usarlas en el template.

¿Cómo se invoca desde un background job?

Cuando ya estás dentro de un background job, no necesitas otra cola para el correo.

PostReportMailer.post_report(user, post, report).deliver_now
  • deliver_now: envía inmediatamente; ideal si ya estás en un job.
  • deliver_later: encola con Active Job automáticamente.

¿Cómo probar con letter_opener, la consola y Active Job?

En desarrollo, letter_opener permite ver el correo en el navegador sin servicios externos. Alternativamente, Rails imprime el correo en el log de desarrollo.

  • Agrega la gema en el grupo de desarrollo e instala.
  • Configura el delivery method de Action Mailer.
  • Prueba desde la Rails console.
# Gemfile (grupo development)
gem 'letter_opener'
bundle install
# config/environments/development.rb
config.action_mailer.delivery_method = :letter_opener

Prueba del flujo en consola:

# Generar el reporte y enviarlo
y = User.first
p = Post.first
r = PostReport.generate(p)
PostReportMailer.post_report(y, p, r).deliver_now

Notas de depuración vistas en el proceso: - Errores por paréntesis o comas faltantes pueden romper la generación del reporte. - Si el template no se encuentra, verifica el nombre del archivo y la extensión .text.erb. - Sin letter_opener, el contenido del correo aparece en el log de desarrollo.

¿Cómo encolar y ejecutar con Active Job?

Comprueba que el job encola y el thread pool lo ejecuta.

# Encolar el trabajo en segundo plano con los IDs
PostReportJob.perform_later(User.first.id, Post.first.id)
  • Mensaje de “enqueued” confirma que está en la cola.
  • El thread pool de Rails toma el job y lo ejecuta tras un breve tiempo.

Acciones clave en el flujo: - Generar mailer y método con mail(to:, subject:). - Crear template .text.erb y pasar variables de instancia. - Elegir entre deliver_now y deliver_later según el contexto. - Probar con letter_opener y la Rails console. - Encolar con Active Job y validar la ejecución del job.

¿Te gustaría que revisemos casos de uso, manejo de errores o estructura del reporte para mejorar tu implementación? Cuéntame en los comentarios qué parte quieres profundizar.