Подтвердить что ты не робот

ActionMailer отправляет реальные электронные письма в тестовом режиме! - Как отключить?

Недавно зарегистрированные пользователи моего маленького приложения должны быть одобрены администратором (мной), прежде чем они смогут получить доступ к сайту. Мне удалось создать такие письма в разработке с помощью after_create :send_admin_email в моей модели пользователей, которая отлично работает. Моя проблема в том, что я генерирую несколько пользователей во время моих тестов (используя FactoryGirl), и каждый созданный тестовый пользователь отправляет реальный адрес электронной почты. Запуск моих тестов похож на заливку мелассы в январе, и мне нужно удалить сотни писем, отправленных на мой почтовый ящик. Как отключить это?

Основы действий Майка в Rails Guides говорит: "По умолчанию Action Mailer не отправляет электронные письма в тестовую среду, они просто добавляются в массив ActionMailer:: Base.deliveries."

Кроме того, в config/environments/test.rb у меня есть:

config.action_mailer.delivery_method = :test

Это в дополнение к config/environment.rb, имеющему:

# Configuration for using SendGrid on Heroku
ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => 'app[my app number]@heroku.com',
  :password       => '[something super secret]',
  :domain         => '[let get this party started!.com]',
  :enable_starttls_auto => true
}
ActionMailer::Base.delivery_method = :smtp

Я уверен, что мне не хватает чего-то простого и элементарного. Я искал вокруг, и связанные вопросы и сообщения касаются того, как проверить, действительно ли ActionMailer отправил электронное письмо.

Смиренная благодарность заранее за любые мысли или помощь.

Добавление: следующий ответ на аналогичный вопрос, найденный в Можно ли отключить электронные письма ActionMailer, когда тестирование огурца происходит при разработке? Я смог остановить отправку электронной почты безумие. Тем не менее, мне пришлось добавить ActionMailer::Base.delivery_method = :test в несколько файлов rspec. Есть ли способ, чтобы я мог закрыть это глобально? У кого-нибудь есть мысли о том, что происходит?

4b9b3361

Ответ 1

Итак, я понял это. Наличие строки ActionMailer::Base.delivery_method = :smtp в config/environment.rb переопределяет ActionMailer::Base.delivery_method = :test в config/environment/test.rb.

Итак, удалите эту строку, ActionMailer::Base.delivery_method = :smtp' из config/environment.rb и поместите его в config/environment/production.rb. Это позволяет размещать ActionMailer::Base.delivery_method = :test в config/environment/test.rb и версию, которую вы хотите в config/environment/development.rb. Я сделал development.rb :test, когда я заполнил свою базу данных с помощью Faker и изменил ее на smtp, поэтому я был уверен, что настоящие электронные письма были отправлены в качестве дополнительной проверки.

Примечание. Чтобы эти изменения вступили в силу, необходимо перезагрузить сервер.

Другое примечание: Текущие инструкции SendGrid от Heroku поместили код конфигурации SendGrid Heroku в новую конфигурацию/инициализаторы/почту .rb, который, вероятно, потребует удаления последней строки и размещения нужной версии в каждой конфигурации/средах/[production.rb, development.rb, test.rb]

Ответ 2

Возможно, полезно...

My config/environment.rb сделал не ActionMailer::Base.delivery_method = :smtp, а моя config/environment/test.rb сделала ActionMailer::Base.delivery_method = :test, но Rails по-прежнему доставила почтовые программы во время тестирования.

Я просто добавил в config/environment/test.rb следующее:

config.action_mailer.perform_deliveries = false

Ответ 3

Я столкнулся с аналогичной ситуацией в Rails4.2 (интеграция ActiveJob с ActionMailer), даже если я не писал write_method =: smtp в config/environment.rb.

В моем случае проблема здесь возникла после использования "resque" в качестве фонового рабочего. Наконец, я узнал, что следующая конфигурация была WRONG:

конфигурации/Инициализаторы/active_job.rb:

Rails.application.config.active_job.queue_adapter = :resque   # here is WRONG

... потому что это также привело к тестовому режиму.

Итак, я устанавливаю "queue_adapter =: resque" только в config/environment/{development, production.rb}. Теперь это работает так, как я ожидаю.