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:
- Action Mailer Basics – Ruby on Rails Guides (guia oficial principal para funcionamento, implementação e teoria). URL: https://guides.rubyonrails.org/action_mailer_basics.html
- How to Send Emails in Ruby on Rails using SMTP and Email API (exemplos práticos de envio com attachments e HTML). URL: https://mailtrap.io/blog/ruby-on-rails-send-email/
- Ruby on Rails Action Mailer Configuration with Gmail (configuração com SMTP como Gmail). URL: https://akladyous.medium.com/ruby-on-rails-action-mailer-configuration-6d0cfc00b871
- The Complete Guide to Action Mailer in Ruby on Rails (guia completo sobre templates, jobs e melhores práticas). URL: https://blog.mystrika.com/action-mailer-ruby-on-rails/
- Action Mailer Basics – Ruby on Rails Guides (versão 7.1) (versão anterior do guia para comparações históricas). URL: https://guides.rubyonrails.org/v7.1/action_mailer_basics.htm