Перенаправить все исходящие письма на один адрес для тестирования - PullRequest
6 голосов
/ 09 декабря 2010

В Ruby on Rails я нахожусь в ситуации, когда я хотел бы, чтобы мое приложение (в определенной среде тестирования) перехватывало все исходящие электронные письма, сгенерированные приложением, и вместо этого отправляло их на другой тестовый адрес (возможно, такжеизменив тело, сказав: «Первоначально отправлено: ...»).

Я вижу, что в ActionMailer есть несколько хуков для наблюдения или перехвата почты, но я не хочу раскручивать собственное решение, если есть более простой способсделать это.Предложения?

Ответы [ 4 ]

11 голосов
/ 09 декабря 2010

Мы успешно используем гем sanitize_email .Он отправляет всю электронную почту на указанный вами адрес и добавляет тему к исходному получателю.Похоже, что он делает именно то, что вы хотите, и сделал электронные письма QA-IN быстрым для нас.

1 голос
/ 18 ноября 2018

Rails 3.0.9 +

Теперь это очень просто сделать с перехватчиками Action Mailer .

Перехватчики позволяют легко изменять адрес получения, тему,и другие детали исходящей почты.Просто определите ваш перехватчик, затем зарегистрируйте его в файле init.

lib / sandbox_mail_interceptor.rb

# Catches outgoing mail and redirects it to a safe email address.
module SandboxMailInterceptor

  def self.delivering_email( message )
    message.subject = "Initially sent to #{message.to}: #{message.subject}"
    message.to = [ ENV[ 'SANDBOX_EMAIL' ] ]
  end
end

config / init / mailers.rb

require Rails.root.join( 'lib', 'sandbox_mail_interceptor' )

if [ 'development', 'staging' ].include?( Rails.env )
  ActionMailer::Base.register_interceptor( SandboxMailInterceptor )
end

Вы также можете отменить перехватчик в любое время, если, например, вам нужно проверить исходное письмо без вмешательства перехватчика.

Mail.unregister_interceptor( SandboxMailInterceptor )

# Test the original, unmodified email.

ActionMailer::Base.register_interceptor( SandboxMailInterceptor )
1 голос
/ 20 августа 2014

Старый вопрос, но первый удар по Google ...

В конце концов я решил эту проблему другим способом, используя (ab) delivery_method = :sendmail, этот эффект просто направляет электронное письмо на что-то исполняемое; предполагается, что это sendmail, но на самом деле это может быть что угодно.

В вашем config/environments/development.rb вы можете сделать что-то вроде:

YourApp::Application.configure do
    # [...]
    config.action_mailer.delivery_method = :sendmail
    config.action_mailer.sendmail_settings = {
        location: "#{Rails.root}/script/fake-sendmail",
        arguments: 'martin+rails@arp242.net',
    }
end

А потом сделать script/fake-sendmail:

#!/bin/sh
sendmail -if fake_sendmail@example.com "$1" < /dev/stdin

(не забудьте сделать этот исполняемый файл!)

Родственное решение (которое я предпочитаю) - просто добавить его в файл mbox; это потребовало очень мало настроек.

config/environments/development.rb выглядит аналогично:

YourApp::Application.configure do
    # [...]
    config.action_mailer.delivery_method = :sendmail
    config.action_mailer.sendmail_settings = {
        location: "#{Rails.root}/script/fake-sendmail",
        arguments: "'#{Rails.root}/tmp/mail.mbox'",
    }
end

И script/fake-sendmail теперь выглядит так:

#!/bin/sh
echo "From FAKE-SENDMAIL $(date)" >> "$1"
cat /dev/stdin >> "$1"
echo >> "$1"

Откройте файл mbox с помощью $any почтового клиента ...

Это очень простой метод, который, кажется, работает довольно хорошо. Некоторые подробности можно найти здесь (я автор этой страницы).

1 голос
/ 09 декабря 2010

Обычно в тестах вы проверяете ActionMailer :: Base.deliveries, который является массивом объектов TMail для писем, отправленных через ваше приложение.В тестовой среде настройки по умолчанию таковы, что ничего не доставляется, просто поместите в этот массив.

Я также рассмотрю использование email_spec в ваших тестах.Гораздо удобнее, чем накатывать собственные функции тестирования.Между использованием email_spec, вспомогательных функций capybara и веб-шагов, а также factory_girl, это около 80% площади поверхности приложения для тестирования в большинстве моих приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...