ActionMailer在测试模式下发送真实的电子邮件! - 如何关闭?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActionMailer在测试模式下发送真实的电子邮件! - 如何关闭?相关的知识,希望对你有一定的参考价值。

新用户注册我的小应用程序必须得到管理员(我)的批准才能访问该网站。我已经成功地使用我的用户模型中的after_create :send_admin_email在开发中生成此类电子邮件,这非常有用。我的问题是我在测试期间(使用FactoryGirl)生成了多个用户,并且每个创建的测试用户都会发送一封真实的电子邮件。运行我的测试就像在1月份浇糖蜜,我必须删除发送到我收件箱的数百封电子邮件。我怎么把它关掉?

Action Mailer Basics中的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's get this party started!.com]',
  :enable_starttls_auto => true
}
ActionMailer::Base.delivery_method = :smtp

我确信我错过了一些简单而基本的东西。我已经搜索了相关问题和帖子处理如何测试ActionMailer实际发送电子邮件。

对任何想法或帮助提前谦卑的感激。

附录:在回答Is it possible to turn off ActionMailer emails when cucumber testing is happening on development?发现的类似问题后,我能够阻止电子邮件发送疯狂。不过,我不得不将ActionMailer::Base.delivery_method = :test添加到几个rspec文件中。有没有办法可以在全球范围内关闭它?有人对发生的事情有任何想法吗?

答案

所以我已经明白了。在config / environment.rb中使用ActionMailer::Base.delivery_method = :smtp行会覆盖config / environments / test.rb中的ActionMailer::Base.delivery_method = :test

因此,从config / environment.rb中删除该行ActionMailer::Base.delivery_method = :smtp'并将其放在config / environments / production.rb中。这允许您将ActionMailer::Base.delivery_method = :test放在config / environments / test.rb中,并在config / environments / development.rb中放置所需的版本。当我使用Faker填充我的数据库并将其更改为:test时,我制作了development.rb smtp,因此我确信真正的电子邮件是作为附加检查发送的。

注意:必须重新启动服务器才能使这些更改生效。

另一个注意事项:Heroku's current SendGrid Instructions将SendGrid Heroku配置代码放入新的config / initializers / mail.rb文件中,该文件可能需要删除其最后一行并在每个config / environments / [production.rb,development.rb,test中放置所需的版本.RB]

另一答案

也许有用......

我的config / environment.rb不包含ActionMailer::Base.delivery_method = :smtp,我的config / environments / test.rb确实包含ActionMailer::Base.delivery_method = :test,但Rails在测试时仍然提供邮件。

我只是将以下内容添加到config / environments / test.rb来修复:

config.action_mailer.perform_deliveries = false
另一答案

即使我没有在config / environment.rb中编写delivery_method =:smtp,我在Rails4.2(ActiveJob与ActionMailer的集成)中遇到了类似的情况。

就我而言,这里的问题发生在使用“resque”作为后台工作者之后。最后,我发现以下配置错误:

配置/初始化/ active_job.rb:

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

...因为它也影响了测试模式。

所以,我只在config / environments / {development,production.rb}中设置“queue_adapter =:resque”。现在,这正如我所料。

以上是关于ActionMailer在测试模式下发送真实的电子邮件! - 如何关闭?的主要内容,如果未能解决你的问题,请参考以下文章

使用 rspec 进行 ActionMailer 测试 [关闭]

使用设计跳过开发中的确认电子邮件

设计不通过ActionMailer发送电子邮件

使用 ActionMailer 的电子邮件注册确认

如何使用 Actionmailer/Ruby on Rails 发送具有多个动态 smtp 的电子邮件

通过电子邮件发送ActionMailer中的当前用户 - Rails 5