根据环境覆盖ActionMailer中的字段

时间:2015-02-06 23:45:02

标签: ruby-on-rails ruby actionmailer

我使用Rails 4.2想要覆盖某个环境中所有ActionMailer邮件程序的to字段。在这种情况下,我想覆盖Staging中使用的所有邮件程序的to字段。我的目标是使登台环境以与生产完全相同的方式发送邮件,但将其全部转储到测试收件箱中。

我知道有一些服务可以帮助解决这个问题,但我的目标是使用我的生产API将分期交付作为一个全面的测试。

我希望在邮件发布之前我可以使用mixin或其他东西来重置to字段。

2 个答案:

答案 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