Usando ActionMailer no Localhost
Alguns anos atrás eu escrevi um gist bem bacana pra configurar o envio de emails num ambiente local Unix, para facilitar o teste de envio de emails.
Caso você esteja usando Windows, sem problemas, tenho um gist pra você também.
Baseado nisso, vamos criar um mailer multi ambiente no Rails, usando ActionMailer
, que fará os envios locais usando o postfix
para development
, e que pode usar qualquer outra configuração para production
(incluindo serviços como SendGrid, SendinBlue, Amazon SES, Mandrill, Mailgun, etc).
Ou seja, podemos testar localmente nossos emails do Rails sem precisar usar um serviço externo.
Antes de Começar
Vou considerar que você já está com o postfix
funcionando de acordo com o gist mencionado acima.
Configuração
Vamos começar escrevendo um initializer, config/initializers/email.rb
com o seguinte conteúdo:
# config/initializers/email.rb
email_config = Rails.application.config_for :email
ActionMailer::Base.default_options = {
from: email_config[:from]
}
ActionMailer::Base.raise_delivery_errors = email_config[:raise_delivery_errors]
ActionMailer::Base.smtp_settings = {
user_name: email_config[:user_name],
password: email_config[:password],
domain: email_config[:domain],
address: email_config[:address],
port: email_config[:port],
authentication: email_config[:authentication],
enable_starttls_auto: email_config[:enable_starttls_auto],
perform_deliveries: email_config[:perform_deliveries],
delivery_method: email_config[:delivery_method]
}
unless email_config[:perform_deliveries]
ActionMailer::Base.perform_deliveries = false
end
Aí colocamos os valores para essas configurações em /config/email.yml
:
production:
# Some prod config here
development:
raise_delivery_errors: true
domain: localhost
perform_deliveries: true
test:
delivery_method: test
Testando no Rails Console
Assumindo que você já tenha um email de activation_instructions
para usuários, você pode testar usando o método deliver_now
no rails console
:
UserMailer.activation_instructions(@user).deliver_now
Cuidados Adicionais
O método Rails.application.config_for
não tem suporte a seção common
no arquivo yml
.
Se você estiver usando outro método de initialização que tenha suporte a seção common
, é melhor então:
- limpar os valores de
authentication
,user_name
epassword
- mudar o valor de
enable_starttls_auto
parafalse
e - ter certeza que o valor de
port
é25
Exemplo:
common:
# Common config here
production:
# Some prod specific config here
development:
perform_deliveries: true
port: 25
authentication:
user_name:
password:
enable_starttls_auto: false
domain: localhost
address: localhost
test:
delivery_method: test
Outras Configurações
Se você quiser mais opções para incluir em seu initializer, como por exemplo um valor padrão para reply_to
, veja todas na documentação do Action Mailer Configuration.