根据环境覆盖 ActionMailer 中的字段

Override to field in ActionMailer based on environment

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

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

我希望我可以使用 mixin 或其他东西在邮件程序启动之前重置 to 字段。

最简单的方法是检查哪个环境是 运行 并相应地设置 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

不确定您使用的 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

config/initializers/sandbox_email_interceptor.rb:

ActionMailer::Base.register_interceptor(SandboxEmailInterceptor) if Rails.env.staging?