如何配置Rails以在暂存时禁用发送真实电子邮件?

我正在使用Heroku,电子邮件不会在开发中发送出去,而是在生产中正确发送。 我想在Heroku上运行一个单独的暂存实例,但不希望发送电子邮件(只是发送到日志)。

test.rb中的这一行告诉ActionMailer不要发送电子邮件:

config.action_mailer.delivery_method = :test 

相反,它们在ActionMailer :: Base.deliveries数组中累积。

您需要为应用程序设置暂存环境,并将Heroku配置为在暂存实例上使用该环境。

使用Mail gem的应用程序(包括rails> = 3.0项目)可以使用safety_mailer gem。 指定允许发送的电子邮件中的域(或域集或魔术字),并以静默方式删除发送给所有其他域的电子邮件。

https://github.com/cluesque/safety_mailer

将gem添加到Gemfile ,指定要包含它的组(可能不是生产)。

 gem "safety_mailer", :group => :development 

不要忘记bundle install来安装

在您的环境文件config/environments/development.rb配置它,以及一些正则表达式。

 config.action_mailer.delivery_method = :safety_mailer config.action_mailer.safety_mailer_settings = { allowed_matchers: [ /mydomain.com/, /mytestacct@gmail.com/, /super_secret_test/ ], delivery_method: :smtp, delivery_method_settings: { :address => "smtp.mydomain.com", :port => 25, :domain => "mydomain.com", :authentication => :plain, :user_name => "mydomain_mailer@mydomain.com", :password => "password" } } 

…现在,发送电子邮件至anyone@mydomain.com,mytestacct @ gmail.com,bob + super_secret_test @ yahoo.com全部收到并发送电子邮件给其他收件人(例如您复制到测试服务器的生产数据库中的真实用户)被压制了。

您可能对mailtrap.io感兴趣( 免责声明:我与此产品有关联)。 它是测试开发和生产中的电子邮件交付的完美工具。 您所要做的就是在临时环境配置中将mailtrap.io设置为smtp服务器:

  config.action_mailer.smtp_settings = { :address => "mailtrap.io", :port => 2525, :authentication => :plain, :user_name => "LOGIN", :password => "PASSWORD" } 

拥有在暂存环境中发送的所有测试电子邮件将存储在mailtrap中以供查看和共享。 但不会将它们发送到真实地址。 您也可以在开发中使用它。 顺便说一下 – 它是完全免费的!

把它放在你的environment.rb文件中

 config.action_mailer.delivery_method = :test 

它应该停止向邮件服务器发送邮件,我认为有一个:日志选项,但我还没有尝试过。

我看到人们建议使用Mailtrap.io。 调试邮件的另一个好选择。 使用非常简单。

我们使用maildev ,您可以在本地安装。 非常适合开发和登台环境,易于安装在各种技术堆栈中。

取决于您的选择

  • 如果您想要一种方便的方式接收电子邮件进行调试等,我建议https://github.com/fgrehm/letter_opener_web ,这将在本地保存电子邮件,并提供一个URL来浏览已发送的电子邮件。 外面没有发送电子邮件,您可以在浏览器中非常方便地查看输出

  • 如果您希望能够使用电子邮件客户端打开电子邮件文件,则应为ActionMailer选择:file适配器(在config/environments/your_env.rbconfig/environments/your_env.rb

  • 如果你想要一个类似于生产的真实环境,我建议配置一个电子邮件拦截器,将TO / CC / BCC重写为你选择的真实邮箱,这样你就可以保留并测试你原来的ActionMailer适配器

     if Rails.env.staging? class TestEmailsInterceptor def self.delivering_email(mail) mail.to = ['My Test Box '] # remove bcc, cc, etc. end end ActionMailer::Base.register_interceptor(TestEmailsInterceptor) end