我们希望在登台服务器上测试电子邮件功能,但我们不希望不小心向客户发送电子邮件。
所以,我希望发送电子邮件到“anything@corporation.com”工作,但发送到“anything@customer.com”的电子邮件被禁止。
我可以进入我的所有控制器并输入代码,如果电子邮件包含我们的域或环境是prod,则只会触发“传递”方法。但是,这看起来有点像kludgey。我想在应用程序中做到这一点。
答案 0 :(得分:6)
使用Mail gem的应用程序(包括rails> = 3.0项目)可以使用safety_mailer gem。指定允许发送电子邮件的域(或域集或魔术词),并静默删除所有其他域的电子邮件。
https://github.com/cluesque/safety_mailer
将gem添加到您的Gemfile中,指定要包含它的组(可能不是生产)。
gem "safety_mailer", :group => :development
不要忘记捆绑安装来安装
在您的环境文件config / environments / development.rb中配置它,以及一些正则表达式。
config.action_mailer.delivery_method = :safety_mailer
SafetyMailer::Config.allowed_matchers = [ /mydomain.com/, /mytestacct@gmail.com/, /super_secret_test/ ]
...现在,发送电子邮件至anyone@mydomain.com,mytestacct @ gmail.com,bob + super_secret_test @ yahoo.com全部发送 和电子邮件发送给其他收件人(如复制到测试服务器的生产数据库中的真实用户)被禁止。
答案 1 :(得分:2)
以下是拦截器的示例:
创建初始值设定项/config/initializers/mailer_config.rb
:
require 'staging_mail_interceptor'
ActionMailer::Base.register_interceptor(StagingMailInterceptor) if [test here if on staging server]
文件/lib/staging_mail_interceptor.rb
包含拦截器,您可以在其中发送消息之前对其进行修改。在我的情况下,我标记主题并将所有邮件重定向到我的个人电子邮件。你可以在这里放置代码来过滤域名:
class StagingMailInterceptor
def self.delivering_email(message)
message.subject = "TEST #{message.to} - #{message.subject}"
message.to = 'test@corporation.com'
end
end
答案 2 :(得分:1)
Modify the delivery_method
option用于您的暂存环境 - 这比在您的控制器中放入代码,然后不得不将其删除,因为您只需修改设置并将其更改回来就不那么麻烦了。 p>
delivery_method
- 定义投放方式。可能的值为:smtp
(默认),:sendmail
,:test
和:file
。
在这种情况下,您可能希望使用:test
或:file
。 :file
会将电子邮件的内容转储到文件中,这样您就可以确保按照预期的方式呈现电子邮件,插入正确的名称等,而无需实际发送电子邮件。互联网。
通常情况下,您不需要确保ActionMailer实际上会发送电子邮件 - 确实如此,并且它是一个经过良好测试的模块。
如果您确实需要进行全栈测试,另一种解决方案是仅修改收件人列表以进行暂存。如果您要将电子邮件发送到通讯组列表,请将其指向其他分发列表以进行暂存。如果您要从数据库发送电子邮件列表,请暂时删除(或标记为非活动状态)您不想发送的电子邮件地址。