banner

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 e password
  • mudar o valor de enable_starttls_auto para false 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.