拦截器 register_interceptor

邮件真正地发送之前想做点什么?-- 使用拦截器。

为了"开发和测试尽量的接近生产环境"和"知道发送出去的邮件真正的样子"等目的,我们希望在非生产环境下,能够查看邮件发送情况。

解决方案:

  • (开发、测试)用邮件预览 gem

我们可以使用 mailcatcher 或 letter_opener 等 gem 实现。

  • (生产)只发送到特定的邮箱

比如,我们注册一些特殊账号或邮箱,然后发送给我们自己。

  • 用拦截器

也就是下面要介绍的。

注册拦截器。举例一(可指定条件):

if Rails.env.development?
  ActionMailer::Base.register_interceptor(DevelopmentMailInterceptor)
end

注册拦截器。举例二(没有加载的话,需要先加载):

require 'whitelist_interceptor'
ActionMailer::Base.register_interceptor(WhitelistInterceptor)

注册拦截器。举例三(没有加载的话,需要先加载):

require 'environment_interceptor'
ActionMailer::Base.register_interceptor(EnvironmentInterceptor)

上述代码,一般放在 config/application.rb 或 config/environments/file_name.rb 或 config/initializers/file_name.rb 文件里。

实现 delivering_email. 举例一(在最后时刻替换掉要发送到的邮箱):

class DevelopmentMailInterceptor
  def self.delivering_email message
    message.subject = "[#{message.to}] #{message.subject}"
    message.to = "overwrite_to@example.com"
  end
end

实现 delivering_email. 举例二(白名单,群发公司邮箱):

class WhitelistInterceptor
  def self.delivering_email message
    unless message.to.join(' ') =~ /(@yourcompany.com)/i
      message.subject = "#{message.to} #{message.subject}"
      message.to = ENV['NOTIFICATIONS_EMAIL']
    end
  end
end

实现 delivering_email. 举例三(非生产环境时,标明发邮件所在的运行环境):

class EnvironmentInterceptor
  def self.delivering_email message
    unless Rails.env.production?
      message.subject = "[#{Rails.env.capitalize}] #{message.subject}"
    end
  end
end

上述代码,一般放在 lib/file_name.rb 文件里。

上面大概思路已经给出,实际项目如何使用可以自行决定。

最后更新于