如何在rails 3上拦截ActionMailer的消息?

时间:2011-09-01 15:53:49

标签: ruby-on-rails ruby-on-rails-3 actionmailer

我正在尝试拦截我的rails(3.0.10)应用中的消息以修改正文。虽然我能够找到一些关于如何做到这一点的信息,但似乎已经发生了变化,现在使用旧方法已经不再适用了。

我使用的代码如下:

class Hook
  def self.delivering_email(message)
    message.subject = 'Hook changed the subject'
  end
end

ActionMailer::Base.register_interceptor(Hook)

发送电子邮件后,主题不会被更改!

我还发现a tweet表示在消息上使用deliver方法时没有调用拦截器,但是premailer-rails3 gem使用了我使用的相同方法并且它在那里工作(插件特别提到它适用于deliver方法)!

我在这里没有想法,所以是什么导致了我的问题?

2 个答案:

答案 0 :(得分:5)

听起来这可能是一个操作顺序问题。

您是否考虑过将您引用的整个代码块放在config/initializers/mail_hook.rb等初始值设定项中?

如果预编译插件有效,我唯一能想到的就是在应用初始化过程中注册了拦截挂钩。

答案 1 :(得分:5)

参见RailsCast或AsciiCast第206集

http://railscasts.com/episodes/206-action-mailer-in-rails-3

http://asciicasts.com/episodes/206-action-mailer-in-rails-3

第一集的相关部分,

<强> /lib/development_mail_interceptor.rb

class DevelopmentMailInterceptor
  def self.delivering_email(message)
    message.subject = "[#{message.to}] #{message.subject}"
    message.to = "eifion@asciicasts.com"
  end
end

<强> /config/initializers/setup_mail.rb

Mail.register_interceptor(DevelopmentMailInterceptor) if Rails.env.development?