1 O que é o Action Mailer?
O Action Mailer permite que você envie e-mails a partir de sua aplicação usando classes de mailer e visualizações.
1.1 Mailers são semelhantes a Controllers
Eles herdam de ActionMailer::Base
e ficam em app/mailers
. Mailers também funcionam de forma muito semelhante aos controllers. Alguns exemplos de semelhanças são enumerados abaixo. Mailers têm:
- Ações e também visualizações associadas que aparecem em
app/views
. - Variáveis de instância que são acessíveis nas visualizações.
- A capacidade de utilizar layouts e partials.
- A capacidade de acessar um hash de parâmetros.
2 Enviando E-mails
Esta seção fornecerá um guia passo a passo para criar um mailer e suas visualizações.
2.1 Passo a passo para gerar um Mailer
2.1.1 Crie o Mailer
$ bin/rails generate mailer User
create app/mailers/user_mailer.rb
create app/mailers/application_mailer.rb
invoke erb
create app/views/user_mailer
create app/views/layouts/mailer.text.erb
create app/views/layouts/mailer.html.erb
invoke test_unit
create test/mailers/user_mailer_test.rb
create test/mailers/previews/user_mailer_preview.rb
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "[email protected]"
layout 'mailer'
end
# app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
end
Como você pode ver, você pode gerar mailers da mesma forma que usa outros geradores com o Rails.
Se você não quiser usar um gerador, você pode criar seu próprio arquivo dentro de app/mailers
, apenas certifique-se de que ele herda de ActionMailer::Base
:
class MyMailer < ActionMailer::Base
end
2.1.2 Edite o Mailer
Mailers têm métodos chamados "ações" e eles usam visualizações para estruturar seu conteúdo. Onde um controller gera conteúdo como HTML para enviar de volta ao cliente, um Mailer cria uma mensagem para ser entregue por e-mail.
app/mailers/user_mailer.rb
contém um mailer vazio:
class UserMailer < ApplicationMailer
end
Vamos adicionar um método chamado welcome_email
, que enviará um e-mail para o endereço de e-mail registrado do usuário:
class UserMailer < ApplicationMailer
default from: '[email protected]'
def welcome_email
@user = params[:user]
@url = 'http://example.com/login'
mail(to: @user.email, subject: 'Bem-vindo ao Meu Site Fantástico')
end
end
Aqui está uma breve explicação dos itens apresentados no método anterior. Para uma lista completa de todas as opções disponíveis, por favor, dê uma olhada mais adiante na seção Lista completa de atributos configuráveis pelo usuário do Action Mailer.
- O método
default
define valores padrão para todos os e-mails enviados a partir deste mailer. Neste caso, usamos para definir o valor do cabeçalho:from
para todas as mensagens nesta classe. Isso pode ser substituído em cada e-mail. - O método
mail
cria a mensagem de e-mail real. Usamos para especificar os valores dos cabeçalhos como:to
e:subject
por e-mail.
2.1.3 Crie uma Visualização de Mailer
Crie um arquivo chamado welcome_email.html.erb
em app/views/user_mailer/
. Este será o modelo usado para o e-mail, formatado em HTML:
html+erb
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Bem-vindo ao exemplo.com, <%= @user.name %></h1>
<p>
Você se cadastrou com sucesso no exemplo.com,
seu nome de usuário é: <%= @user.login %>.<br>
</p>
<p>
Para fazer login no site, basta seguir este link: <%= @url %>.
</p>
<p>Obrigado por se juntar a nós e tenha um ótimo dia!</p>
</body>
</html>
Vamos também criar uma parte de texto para este e-mail. Nem todos os clientes preferem e-mails em HTML,
então enviar ambos é uma boa prática. Para fazer isso, crie um arquivo chamado
welcome_email.text.erb
em app/views/user_mailer/
:
Bem-vindo ao exemplo.com, <%= @user.name %>
===============================================
Você se cadastrou com sucesso no exemplo.com,
seu nome de usuário é: <%= @user.login %>.
Para fazer login no site, basta seguir este link: <%= @url %>.
Obrigado por se juntar a nós e tenha um ótimo dia!
Quando você chamar o método mail
agora, o Action Mailer detectará os dois templates
(texto e HTML) e automaticamente gerará um e-mail multipart/alternative
.
2.1.4 Chamando o Mailer
Mailers são apenas outra forma de renderizar uma view. Em vez de renderizar uma view e enviá-la através do protocolo HTTP, eles a enviam através dos protocolos de e-mail. Por causa disso, faz sentido que o seu controller instrua o Mailer a enviar um e-mail quando um usuário for criado com sucesso.
Configurar isso é simples.
Primeiro, vamos criar um scaffold para User
:
$ bin/rails generate scaffold user name email login
$ bin/rails db:migrate
Agora que temos um modelo de usuário para trabalhar, vamos editar o arquivo
app/controllers/users_controller.rb
, fazendo com que ele instrua o UserMailer
a enviar
um e-mail para o usuário recém-criado, editando a ação create e inserindo uma
chamada para UserMailer.with(user: @user).welcome_email
logo após o usuário ser salvo com sucesso.
Vamos enfileirar o e-mail para ser enviado usando deliver_later
, que é
suportado pelo Active Job. Dessa forma, a ação do controller pode continuar sem
esperar o envio ser concluído.
class UsersController < ApplicationController
# ...
# POST /users or /users.json
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
# Diga ao UserMailer para enviar um e-mail de boas-vindas após salvar
UserMailer.with(user: @user).welcome_email.deliver_later
format.html { redirect_to(@user, notice: 'Usuário criado com sucesso.') }
format.json { render json: @user, status: :created, location: @user }
else
format.html { render action: 'new' }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# ...
end
NOTA: O comportamento padrão do Active Job é executar jobs via o adaptador :async
.
Então, você pode usar deliver_later
para enviar e-mails de forma assíncrona.
O adaptador padrão do Active Job executa jobs com uma thread pool em processo.
Isso é adequado para ambientes de desenvolvimento/teste, pois não requer
nenhuma infraestrutura externa, mas não é adequado para produção, pois descarta
jobs pendentes ao reiniciar.
Se você precisa de um backend persistente, você precisará usar um adaptador do Active Job
que tenha um backend persistente (Sidekiq, Resque, etc).
Se você quiser enviar e-mails imediatamente (de um cronjob, por exemplo), basta chamar
deliver_now
:
class SendWeeklySummary
def run
User.find_each do |user|
UserMailer.with(user: user).weekly_summary.deliver_now
end
end
end
Qualquer par chave-valor passado para with
se torna os params
para a ação do mailer. Portanto, with(user: @user, account: @user.account)
torna params[:user]
e params[:account]
disponíveis na ação do mailer. Assim como os controladores têm params.
O método welcome_email
retorna um objeto ActionMailer::MessageDelivery
que pode ser instruído a deliver_now
ou deliver_later
para enviar-se. O objeto ActionMailer::MessageDelivery
é um invólucro em torno de um Mail::Message
. Se você quiser inspecionar, alterar ou fazer qualquer outra coisa com o objeto Mail::Message
, você pode acessá-lo com o método message
no objeto ActionMailer::MessageDelivery
.
2.2 Codificação automática de valores de cabeçalho
O Action Mailer lida com a codificação automática de caracteres multibyte dentro de cabeçalhos e corpos.
Para exemplos mais complexos, como definir conjuntos de caracteres alternativos ou texto de auto-codificação primeiro, consulte a biblioteca Mail.
2.3 Lista completa dos métodos do Action Mailer
Existem apenas três métodos que você precisa para enviar praticamente qualquer mensagem de email:
headers
- Especifica qualquer cabeçalho no email que você deseja. Você pode passar um hash de nomes de campo de cabeçalho e pares de valores, ou pode chamarheaders[:nome_do_campo] = 'valor'
.attachments
- Permite adicionar anexos ao seu email. Por exemplo,attachments['nome-do-arquivo.jpg'] = File.read('nome-do-arquivo.jpg')
.mail
- Cria o próprio email. Você pode passar cabeçalhos como um hash para o métodomail
como um parâmetro.mail
criará um email - seja texto simples ou multipart - dependendo dos modelos de email que você definiu.
2.3.1 Adicionando anexos
O Action Mailer torna muito fácil adicionar anexos.
Passe o nome do arquivo e o conteúdo e o Action Mailer e o gem Mail adivinharão automaticamente o
mime_type
, definirão aencoding
e criarão o anexo.attachments['nome-do-arquivo.jpg'] = File.read('/caminho/para/nome-do-arquivo.jpg')
Quando o método mail
for acionado, ele enviará um email multipart com um anexo, devidamente aninhado, sendo o nível superior multipart/mixed
e a primeira parte sendo um multipart/alternative
contendo as mensagens de email em texto simples e HTML.
NOTA: O Mail codificará automaticamente em Base64 um anexo. Se você quiser algo diferente, codifique seu conteúdo e passe o conteúdo codificado e a codificação em um Hash
para o método attachments
.
Passe o nome do arquivo e especifique cabeçalhos e conteúdo e o Action Mailer e o Mail usarão as configurações que você passar.
conteudo_codificado = SpecialEncode(File.read('/caminho/para/nome-do-arquivo.jpg')) attachments['nome-do-arquivo.jpg'] = { mime_type: 'application/gzip', encoding: 'SpecialEncoding', content: conteudo_codificado }
NOTA: Se você especificar uma codificação, o Mail assumirá que seu conteúdo já está codificado e não tentará codificá-lo em Base64.
2.3.2 Criando anexos inline
O Action Mailer 3.0 torna os anexos inline, que envolviam muita manipulação nas versões anteriores à 3.0, muito mais simples e triviais como deveriam ser.
Primeiro, para informar ao Mail para transformar um anexo em um anexo inline, basta chamar
#inline
no método attachments dentro do seu Mailer:def welcome attachments.inline['imagem.jpg'] = File.read('/caminho/para/imagem.jpg') end
Em seguida, em sua visualização, você pode simplesmente referenciar
attachments
como um hash e especificar qual anexo você deseja mostrar, chamandourl
nele e passando o resultado para o métodoimage_tag
: ```html+erbOlá, esta é a nossa imagem
<%= image_tag attachments['image.jpg'].url %> ```
Como esta é uma chamada padrão para
image_tag
, você pode passar um hash de opções após a URL do anexo, assim como faria para qualquer outra imagem:<p>Olá, esta é a nossa imagem</p> <%= image_tag attachments['image.jpg'].url, alt: 'Minha Foto', class: 'fotos' %>
2.3.3 Enviando Email para Vários Destinatários
É possível enviar email para um ou mais destinatários em um único email (por exemplo,
informando todos os administradores sobre um novo cadastro) definindo a lista de emails na chave :to
.
A lista de emails pode ser um array de endereços de email ou uma única string
com os endereços separados por vírgulas.
class AdminMailer < ApplicationMailer
default to: -> { Admin.pluck(:email) },
from: '[email protected]'
def novo_cadastro(usuario)
@usuario = usuario
mail(subject: "Novo Cadastro de Usuário: #{@usuario.email}")
end
end
O mesmo formato pode ser usado para definir destinatários em cópia (Cc:) e cópia oculta
(Bcc:), usando as chaves :cc
e :bcc
, respectivamente.
2.3.4 Enviando Email com Nome
Às vezes, você deseja mostrar o nome da pessoa em vez de apenas o endereço de email
quando ela recebe o email. Você pode usar email_address_with_name
para
isso:
def email_de_boas_vindas
@usuario = params[:usuario]
mail(
to: email_address_with_name(@usuario.email, @usuario.nome),
subject: 'Bem-vindo ao Meu Site Fantástico'
)
end
A mesma técnica funciona para especificar um nome de remetente:
class UserMailer < ApplicationMailer
default from: email_address_with_name('[email protected]', 'Notificações da Empresa Exemplo')
end
Se o nome for uma string vazia, apenas o endereço será retornado.
2.4 Visualizações de Mailer
As visualizações de mailer estão localizadas no diretório app/views/nome_da_classe_mailer
.
A visualização de mailer específica é conhecida pela classe porque seu nome é o mesmo que o
método do mailer. No nosso exemplo acima, a visualização de mailer para o
método email_de_boas_vindas
estará em app/views/user_mailer/email_de_boas_vindas.html.erb
para a versão HTML e email_de_boas_vindas.text.erb
para a versão de texto simples.
Para alterar a visualização de mailer padrão para sua ação, você faz algo como:
class UserMailer < ApplicationMailer
default from: '[email protected]'
def email_de_boas_vindas
@usuario = params[:usuario]
@url = 'http://example.com/login'
mail(to: @usuario.email,
subject: 'Bem-vindo ao Meu Site Fantástico',
template_path: 'notificacoes',
template_name: 'outra')
end
end
Neste caso, ele procurará os templates em app/views/notificacoes
com o nome
outra
. Você também pode especificar um array de caminhos para template_path
, e eles
serão pesquisados em ordem.
Se você deseja mais flexibilidade, também pode passar um bloco e renderizar templates específicos ou até mesmo renderizar inline ou texto sem usar um arquivo de template:
class UserMailer < ApplicationMailer
default from: '[email protected]'
def email_de_boas_vindas
@usuario = params[:usuario]
@url = 'http://example.com/login'
mail(to: @usuario.email,
subject: 'Bem-vindo ao Meu Site Fantástico') do |format|
format.html { render 'outro_template' }
format.text { render plain: 'Renderizar texto' }
end
end
end
Isso renderizará o template 'outro_template.html.erb' para a parte HTML e
usará o texto renderizado para a parte de texto. O comando de renderização é o mesmo usado
dentro do Action Controller, então você pode usar todas as mesmas opções, como
:text
, :inline
, etc.
Se você deseja renderizar um template localizado fora do diretório padrão app/views/nome_do_mailer/
, você pode aplicar o prepend_view_path
, assim:
```ruby
class UserMailer < ApplicationMailer
prepend_view_path "custom/path/to/mailer/view"
# Isso tentará carregar o template "custom/path/to/mailer/view/welcome_email" def welcome_email # ... end end ```
Você também pode considerar usar o método append_view_path
.
2.4.1 Caching de Visualização de Email
Você pode realizar o cache de fragmentos nas visualizações de email, assim como nas visualizações de aplicativos, usando o método cache
.
<% cache do %>
<%= @company.name %>
<% end %>
E para usar esse recurso, você precisa configurar sua aplicação com isso:
config.action_mailer.perform_caching = true
O cache de fragmentos também é suportado em emails multipartes. Leia mais sobre o cache no guia de cache do Rails.
2.5 Layouts do Action Mailer
Assim como as visualizações de controladores, você também pode ter layouts de mailer. O nome do layout
precisa ser o mesmo do seu mailer, como user_mailer.html.erb
e
user_mailer.text.erb
para serem automaticamente reconhecidos pelo seu mailer como um
layout.
Para usar um arquivo diferente, chame layout
no seu mailer:
class UserMailer < ApplicationMailer
layout 'awesome' # use awesome.(html|text).erb como o layout
end
Assim como nas visualizações de controladores, use yield
para renderizar a visualização dentro do
layout.
Você também pode passar uma opção layout: 'nome_do_layout'
para a chamada de renderização dentro
do bloco de formato para especificar layouts diferentes para formatos diferentes:
class UserMailer < ApplicationMailer
def welcome_email
mail(to: params[:user].email) do |format|
format.html { render layout: 'my_layout' }
format.text
end
end
end
Irá renderizar a parte HTML usando o arquivo my_layout.html.erb
e a parte de texto
com o arquivo user_mailer.text.erb
usual, se existir.
2.6 Visualizando Emails
As visualizações do Action Mailer fornecem uma maneira de ver como os emails são exibidos visitando uma
URL especial que os renderiza. No exemplo acima, a classe de visualização para
UserMailer
deve ser chamada UserMailerPreview
e localizada em
test/mailers/previews/user_mailer_preview.rb
. Para ver a visualização de
welcome_email
, implemente um método que tenha o mesmo nome e chame
UserMailer.welcome_email
:
class UserMailerPreview < ActionMailer::Preview
def welcome_email
UserMailer.with(user: User.first).welcome_email
end
end
Então a visualização estará disponível em http://localhost:3000/rails/mailers/user_mailer/welcome_email.
Se você alterar algo em app/views/user_mailer/welcome_email.html.erb
ou no mailer em si, ele será recarregado e renderizado automaticamente para que você possa
ver o novo estilo instantaneamente. Uma lista de visualizações também está disponível
em http://localhost:3000/rails/mailers.
Por padrão, essas classes de visualização ficam em test/mailers/previews
.
Isso pode ser configurado usando a opção preview_paths
. Por exemplo, se você
quiser adicionar lib/mailer_previews
a ele, você pode configurá-lo em
config/application.rb
:
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
2.7 Gerando URLs nas Visualizações do Action Mailer
Ao contrário dos controladores, a instância do mailer não possui nenhum contexto sobre a
solicitação de entrada, então você precisará fornecer o parâmetro :host
você mesmo.
Como o :host
geralmente é consistente em toda a aplicação, você pode configurá-lo
globalmente em config/application.rb
:
config.action_mailer.default_url_options = { host: 'example.com' }
Devido a esse comportamento, você não pode usar nenhum dos ajudantes *_path
dentro de
um email. Em vez disso, você precisará usar o ajudante associado *_url
. Por exemplo,
em vez de usar
<%= link_to 'welcome', welcome_path %>
Você precisará usar:
<%= link_to 'welcome', welcome_url %>
Ao usar a URL completa, seus links agora funcionarão em seus emails.
2.7.1 Gerando URLs com url_for
url_for
gera uma URL completa por padrão em templates.
Se você não configurou a opção :host
globalmente, certifique-se de passá-la para
url_for
.
<%= url_for(host: 'example.com',
controller: 'welcome',
action: 'greeting') %>
2.7.2 Gerando URLs com Rotas Nomeadas
Clientes de e-mail não possuem contexto web e, portanto, os caminhos não possuem uma URL base para formar endereços web completos. Assim, você sempre deve usar a variante *_url
dos auxiliares de rota nomeada.
Se você não configurou a opção :host
globalmente, certifique-se de passá-la para o auxiliar de URL.
<%= user_url(@user, host: 'example.com') %>
NOTA: links não-GET
requerem rails-ujs ou
jQuery UJS, e não funcionarão em templates de mailer. Eles resultarão em requisições GET
normais.
2.8 Adicionando Imagens em Visualizações de Action Mailer
Ao contrário dos controladores, a instância do mailer não possui nenhum contexto sobre a solicitação recebida, portanto, você precisará fornecer o parâmetro :asset_host
você mesmo.
Como o :asset_host
geralmente é consistente em toda a aplicação, você pode configurá-lo globalmente em config/application.rb
:
config.asset_host = 'http://example.com'
Agora você pode exibir uma imagem dentro do seu e-mail.
<%= image_tag 'image.jpg' %>
2.9 Enviando E-mails Multipartes
O Action Mailer enviará automaticamente e-mails multipartes se você tiver templates diferentes para a mesma ação. Portanto, para o nosso exemplo UserMailer
, se você tiver welcome_email.text.erb
e welcome_email.html.erb
em app/views/user_mailer
, o Action Mailer enviará automaticamente um e-mail multipartes com as versões HTML e texto configuradas como partes diferentes.
A ordem das partes inseridas é determinada pelo :parts_order
dentro do método ActionMailer::Base.default
.
2.10 Enviando E-mails com Opções de Entrega Dinâmicas
Se você deseja substituir as opções de entrega padrão (por exemplo, credenciais SMTP) ao enviar e-mails, você pode fazer isso usando delivery_method_options
na ação do mailer.
class UserMailer < ApplicationMailer
def welcome_email
@user = params[:user]
@url = user_url(@user)
delivery_options = { user_name: params[:company].smtp_user,
password: params[:company].smtp_password,
address: params[:company].smtp_host }
mail(to: @user.email,
subject: "Please see the Terms and Conditions attached",
delivery_method_options: delivery_options)
end
end
2.11 Enviando E-mails sem Renderização de Template
Pode haver casos em que você deseja pular a etapa de renderização do template e fornecer o corpo do e-mail como uma string. Você pode fazer isso usando a opção :body
. Nesses casos, não se esqueça de adicionar a opção :content_type
. Caso contrário, o Rails usará text/plain
como padrão.
class UserMailer < ApplicationMailer
def welcome_email
mail(to: params[:user].email,
body: params[:email_body],
content_type: "text/html",
subject: "Already rendered!")
end
end
3 Callbacks do Action Mailer
O Action Mailer permite que você especifique um before_action
, after_action
e
around_action
para configurar a mensagem, e before_deliver
, after_deliver
e
around_deliver
para controlar a entrega.
Callbacks podem ser especificados com um bloco ou um símbolo para um método na classe do mailer, semelhante aos controladores.
Você pode usar um
before_action
para definir variáveis de instância, preencher o objeto de e-mail com padrões ou inserir cabeçalhos e anexos padrão.
class InvitationsMailer < ApplicationMailer
before_action :set_inviter_and_invitee
before_action { @account = params[:inviter].account }
default to: -> { @invitee.email_address },
from: -> { common_address(@inviter) },
reply_to: -> { @inviter.email_address_with_name }
def account_invitation
mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
end
def project_invitation
@project = params[:project]
@summarizer = ProjectInvitationSummarizer.new(@project.bucket)
mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})"
end
private
def set_inviter_and_invitee
@inviter = params[:inviter]
@invitee = params[:invitee]
end
end
Você pode usar um
after_action
para fazer uma configuração semelhante a umbefore_action
, mas usando variáveis de instância definidas na ação do seu mailer.Usar um callback
after_action
também permite que você substitua as configurações do método de entrega atualizandomail.delivery_method.settings
.
class UserMailer < ApplicationMailer
before_action { @business, @user = params[:business], params[:user] }
after_action :set_delivery_options,
:prevent_delivery_to_guests,
:set_business_headers
def feedback_message
end
def campaign_message
end
private
def set_delivery_options
# Você tem acesso à instância do mail,
# às variáveis de instância @business e @user aqui
if @business && @business.has_smtp_settings?
mail.delivery_method.settings.merge!(@business.smtp_settings)
end
end
def prevent_delivery_to_guests
if @user && @user.guest?
mail.perform_deliveries = false
end
end
def set_business_headers
if @business
headers["X-SMTPAPI-CATEGORY"] = @business.code
end
end
end
Você pode usar um
after_delivery
para registrar o envio da mensagem.Os callbacks do Mailer interrompem o processamento adicional se o corpo for definido como um valor diferente de
nil
.before_deliver
pode interromper comthrow :abort
.
4 Usando os Helpers do Action Mailer
O Action Mailer herda de AbstractController
, então você tem acesso à maioria
dos mesmos helpers que você tem no Action Controller.
Também existem alguns métodos auxiliares específicos do Action Mailer disponíveis em
ActionMailer::MailHelper
. Por exemplo, eles permitem acessar a instância do mailer
a partir da sua view com mailer
, e acessar a mensagem como message
:
<%= stylesheet_link_tag mailer.name.underscore %>
<h1><%= message.subject %></h1>
5 Configuração do Action Mailer
As seguintes opções de configuração são melhores definidas em um dos arquivos de ambiente (environment.rb, production.rb, etc...)
Configuração | Descrição |
---|---|
logger |
Gera informações sobre a execução do envio de emails, se disponível. Pode ser definido como nil para desativar o registro. Compatível tanto com o Logger padrão do Ruby quanto com o Log4r . |
smtp_settings |
Permite configuração detalhada para o método de entrega :smtp :
|
sendmail_settings |
Permite substituir as opções para o método de entrega :sendmail .
|
raise_delivery_errors |
Se erros devem ser levantados caso o email não seja entregue. Isso só funciona se o servidor de email externo estiver configurado para entrega imediata. Padrão: true . |
delivery_method |
Define um método de entrega. Os valores possíveis são:
|
perform_deliveries |
Determina se os envios são realmente realizados quando o método deliver é invocado na mensagem do Mail. Por padrão, eles são realizados, mas isso pode ser desativado para ajudar nos testes funcionais. Se esse valor for false , o array deliveries não será preenchido mesmo se o delivery_method for :test . |
deliveries |
Mantém um array com todos os emails enviados pelo Action Mailer com o método de entrega :test . Mais útil para testes unitários e funcionais. |
delivery_job |
A classe de job usada com deliver_later . Padrão: ActionMailer::MailDeliveryJob . |
deliver_later_queue_name |
O nome da fila usada com o delivery_job padrão. Padrão: a fila padrão do Active Job. |
default_options |
Permite definir valores padrão para as opções do método mail (:from , :reply_to , etc.). |
Para uma descrição completa das possíveis configurações, consulte o Configurando o Action Mailer em nosso guia Configurando Aplicações Rails.
5.1 Exemplo de Configuração do Action Mailer
Um exemplo seria adicionar o seguinte ao seu arquivo config/environments/$RAILS_ENV.rb
apropriado:
config.action_mailer.delivery_method = :sendmail
# Padrão:
# config.action_mailer.sendmail_settings = {
# location: '/usr/sbin/sendmail',
# arguments: %w[ -i ]
# }
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.default_options = { from: '[email protected]' }
5.2 Configuração do Action Mailer para o Gmail
O Action Mailer usa a gem Mail e aceita uma configuração similar. Adicione isso ao seu arquivo config/environments/$RAILS_ENV.rb
para enviar via Gmail:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
port: 587,
domain: 'example.com',
user_name: '<username>',
password: '<password>',
authentication: 'plain',
enable_starttls: true,
open_timeout: 5,
read_timeout: 5 }
Se você estiver usando uma versão antiga da gem Mail (2.6.x ou anterior), use enable_starttls_auto
em vez de enable_starttls
.
NOTA: O Google bloqueia logins de aplicativos que considera menos seguros. Você pode alterar suas configurações do Gmail aqui para permitir as tentativas. Se sua conta do Gmail tiver autenticação em duas etapas ativada, você precisará definir uma senha de aplicativo e usá-la em vez de sua senha regular.
6 Testando o Mailer
Você pode encontrar instruções detalhadas sobre como testar seus mailers no guia de testes.
7 Interceptando e Observando Emails
O Action Mailer fornece ganchos nos métodos de observação e interceptação do Mail. Isso permite que você registre classes que são chamadas durante o ciclo de vida de entrega de e-mails enviados.
7.1 Interceptando Emails
Os interceptadores permitem que você faça modificações nos e-mails antes de serem entregues aos agentes de entrega. Uma classe de interceptador deve implementar o método ::delivering_email(message)
, que será chamado antes do envio do e-mail.
class SandboxEmailInterceptor
def self.delivering_email(message)
message.to = ['[email protected]']
end
end
Antes que o interceptador possa fazer seu trabalho, você precisa registrá-lo usando a opção de configuração interceptors
. Você pode fazer isso em um arquivo de inicialização como config/initializers/mail_interceptors.rb
:
Rails.application.configure do
if Rails.env.staging?
config.action_mailer.interceptors = %w[SandboxEmailInterceptor]
end
end
NOTA: O exemplo acima usa um ambiente personalizado chamado "staging" para um servidor semelhante a produção, mas para fins de teste. Você pode ler Criando Ambientes Rails para obter mais informações sobre ambientes Rails personalizados.
7.2 Observando Emails
Os observadores permitem que você tenha acesso à mensagem de e-mail depois que ela foi enviada. Uma classe de observador deve implementar o método :delivered_email(message)
, que será chamado após o envio do e-mail.
class EmailDeliveryObserver
def self.delivered_email(message)
EmailDelivery.log(message)
end
end
Semelhante aos interceptadores, você deve registrar os observadores usando a opção de configuração observers
. Você pode fazer isso em um arquivo de inicialização como config/initializers/mail_observers.rb
:
Rails.application.configure do
config.action_mailer.observers = %w[EmailDeliveryObserver]
end
Feedback
Você é incentivado a ajudar a melhorar a qualidade deste guia.
Por favor, contribua se encontrar algum erro de digitação ou factual. Para começar, você pode ler nossa contribuição à documentação seção.
Você também pode encontrar conteúdo incompleto ou desatualizado. Por favor, adicione qualquer documentação ausente para o principal. Certifique-se de verificar Guias Edge primeiro para verificar se os problemas já foram corrigidos ou não no branch principal. Verifique as Diretrizes dos Guias do Ruby on Rails para estilo e convenções.
Se por algum motivo você encontrar algo para corrigir, mas não puder corrigi-lo você mesmo, por favor abra uma issue.
E por último, mas não menos importante, qualquer tipo de discussão sobre a documentação do Ruby on Rails é muito bem-vinda no Fórum oficial do Ruby on Rails.