我使用Rails 4.2想要覆盖某个环境中所有ActionMailer邮件程序的to
字段。在这种情况下,我想覆盖Staging中使用的所有邮件程序的to字段。我的目标是使登台环境以与生产完全相同的方式发送邮件,但将其全部转储到测试收件箱中。
我知道有一些服务可以帮助解决这个问题,但我的目标是使用我的生产API将分期交付作为一个全面的测试。
我希望在邮件发布之前我可以使用mixin或其他东西来重置to
字段。
答案 0 :(得分:3)
不确定您使用的是哪个版本的Rails,但您可能会考虑使用新的邮件拦截器来完成此任务。
主要优点是它不会直接使您的ActionMailer类混乱。
http://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails
复制他们的例子:
class SandboxEmailInterceptor
def self.delivering_email(message)
message.to = ['sandbox@example.com']
end
end
配置/初始化/ sandbox_email_interceptor.rb:
ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging?
答案 1 :(得分:1)
最简单的方法是检查正在运行的环境并相应地设置to
字段。例如,简单的密码重置邮件可能看起来像:
class UserMailer < ActionMailer::Base
default from: "support@example.com"
def reset_password(user_id)
@user = User.find(user_id)
@url = reset_password_users_url(token: @user.password_reset_token)
mail(to: @user.email, subject: '[Example] Please reset your password')
end
end
现在检查暂存环境并将所有这些电子邮件路由到admin@example.com
:
class UserMailer < ActionMailer::Base
default from: "support@example.com"
def reset_password(user_id)
@user = User.find(user_id)
@url = reset_password_users_url(token: @user.password_reset_token)
to = Rails.env.staging? ? 'admin@example.com' : @user.email
mail(to: to, subject: '[Example] Please reset your password')
end
end