Correio Elegante com Rails(Action Mailer na prática)

Vou apresentar o Action Mailer de forma estruturada, como se fosse uma apresentação. Vou cobrir a história e motivação, como ele se integra ao ecossistema do Rails, a teoria por trás e, por fim, um guia passo a passo para implementação. História: Por Que o Action Mailer Foi Criado? O…

Vou apresentar o Action Mailer de forma estruturada, como se fosse uma apresentação. Vou cobrir a história e motivação, como ele se integra ao ecossistema do Rails, a teoria por trás e, por fim, um guia passo a passo para implementação.


História: Por Que o Action Mailer Foi Criado?

O Ruby on Rails foi lançado em 2004 por David Heinemeier Hansson (DHH), e o Action Mailer foi introduzido nas versões iniciais do framework, por volta de 2005, já na Rails 0.9 ou 1.0. Na época, aplicações web precisavam enviar emails para notificações, confirmações de cadastro, resets de senha, etc., mas em Ruby puro ou frameworks mais simples, isso envolvia código manual e bagunçado, usando bibliotecas como Net::SMTP diretamente.

O Action Mailer foi criado para resolver isso de forma “Rails-like”: elegante, produtiva e seguindo o princípio de “convenção sobre configuração”. Ele permite tratar emails como “ações” semelhantes a controllers HTTP, com views para renderizar o conteúdo. Isso integra perfeitamente ao MVC (Model-View-Controller) do Rails, tornando o envio de emails parte natural do fluxo da aplicação. Antes da versão 2.0 do Rails, ele fazia parte do core junto com outros componentes como Action Pack e Action Web Service (este último foi removido depois). Hoje, é um dos dois componentes de email no Rails (o outro é Action Mailbox, para receber emails, introduzido no Rails 6 em 2019).

Em resumo, o objetivo era abstrair a complexidade de emails (headers, attachments, multipart) e permitir envios assíncronos, integrando com gems como Mail.


Como o Action Mailer Funciona no Ecossistema do Rails

No ecossistema Rails, o Action Mailer é um módulo que estende o framework para lidar com emails de saída. Ele se integra assim:

  • Semelhante a Controllers: Mailers herdam de ActionMailer::Base e funcionam como controllers, mas em vez de renderizar HTML para browsers, renderizam emails. Você define “ações” (métodos) que criam mensagens de email.
  • Integração com Views: Usa templates ERB em app/views para o corpo do email (HTML e texto plano), suportando layouts, partials e variáveis de instância, igual a Action View.
  • Configuração e Entrega: Configurado em config/environments/*.rb, com opções como SMTP (ex: Gmail, SendGrid) ou Sendmail. Suporta envios síncronos (deliver_now) ou assíncronos via Active Job (deliver_later), que usa queues como Sidekiq ou Resque para não bloquear a resposta HTTP.
  • Outras Integrações:
    • Active Record: Tipicamente chamado de models ou controllers, ex: após criar um usuário, envie um email de boas-vindas.
    • Action Mailbox: Complementa para fluxos bidirecionais (enviar e receber).
    • Previews e Testes: No desenvolvimento, previews em /rails/mailers para visualizar emails sem enviar; testes com assert_emails.
  • Fluxo Geral: Um controller aciona o mailer, que renderiza views, constrói o email com o gem Mail e entrega via o método configurado. É “wrapper” em torno do Mail gem, adicionando conveniências Rails.

Isso torna o Rails um framework full-stack para apps que precisam de comunicação por email, como e-commerces ou SaaS.


Teoria: Conceitos Fundamentais

Em teoria, o Action Mailer segue o padrão de design do Rails:

  • Mailers: Classes que herdam de ActionMailer::Base (ou ApplicationMailer para defaults). Cada método é uma “ação” que retorna um objeto Mail::Message.
  • Views e Layouts: Templates em app/views/nome_do_mailer/acao.html.erb e .text.erb para multipart emails (HTML + texto). Layouts em app/views/layouts/mailer.html.erb para elementos comuns.
  • Parâmetros: Usa params como controllers, para passar dados (ex: usuário).
  • Headers e Attachments: Definidos no método mail(to: …, subject: …); attachments via attachments[‘file.pdf’] = File.read(‘path’).
  • Entrega:
    • Síncrona: Bloqueia até enviar.
    • Assíncrona: Integra com Active Job para queues.
  • Configurações Chave:
    • delivery_method: :smtp, :sendmail, etc.
    • smtp_settings: Endereço, porta, autenticação.
    • default_options: From padrão, etc.
  • Segurança e Melhores Práticas: Use credentials ou dotenv para senhas (não hardcode); teste com Mailcatcher ou Letter_opener em dev; evite envios em massa sem queues.

Desde Rails 5.1, mailers “parametrizados” permitem passar params como controllers.


Passo a Passo: Como Implementar o Action Mailer

Vamos implementar um exemplo simples: Enviar um email de boas-vindas após cadastro de usuário.

Passo 1: Gerar o Mailer

bin/rails generate mailer UserMailer welcome_email

Isso cria:

  • app/mailers/user_mailer.rb
  • app/views/user_mailer/welcome_email.html.erb e .text.erb
  • Testes em test/mailers/

Edite app/mailers/application_mailer.rb para defaults:

class ApplicationMailer < ActionMailer::Base
  default from: '[email protected]'
  layout 'mailer'
end

Passo 2: Definir a Ação no Mailer

Em app/mailers/user_mailer.rb:

class UserMailer < ApplicationMailer
  def welcome_email
    @user = params[:user] # Passado via params    mail(to: @user.email, subject: 'Bem-vindo ao Meu Site!')
  end
end

Passo 3: Criar as Views

Em app/views/user_mailer/welcome_email.html.erb:

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Bem-vindo, <%= @user.name %>!</h1>
    <p>Seu email: <%= @user.email %>. Obrigado por se cadastrar!</p>
  </body>
</html>

Passo 4: Configurar o Envio de Emails

Em config/environments/development.rb (para dev, use SMTP ou Mailcatcher):

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address: 'smtp.gmail.com',
  port: 587,
  user_name: Rails.application.credentials.dig(:gmail, :username),
  password: Rails.application.credentials.dig(:gmail, :password),
  authentication: 'plain',
  enable_starttls_auto: true
}
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

Adicione credentials com rails credentials:edit ou arquivo ENV.

Passo 5: Chamar o Mailer na Aplicação

Em um controller, ex: UsersController após criar usuário:

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.with(user: @user).welcome_email.deliver_later  # Assíncrono
      redirect_to @user, notice: 'Usuário criado! Email enviado.'
    else
      render :new
    end
  end
end

Pronto! Agora sua app envia emails


Fontes de Texto e Guias:


Repositório

https://github.com/devFelipeAlmeida/mailer_project

0 Comentário