Rails3全局标头包含

时间:2010-12-29 11:10:37

标签: ruby-on-rails

我有一些ActionMailer类可以发送大量的电子邮件....我希望在这个Rails应用程序发送的每封电子邮件中全局包含一个标题:

以下是手动包含标题的方法:

class GeneralNotification < ActionMailer::Base

    def test_email(emails)
        subject "Welcome to my email!"
        recipients "somebody@somewhere.com"
        from "chad@awesome.com"

        headers(
            "X-SMTPAPI" => '{"category": "Test Category"}'
        )
    end

end

我希望全局包含X-SMTPAPI标头,而不修改每个邮件程序方法..

最好的方法是什么?

谢谢!

乍得

3 个答案:

答案 0 :(得分:2)

ActionMailer::Base.default "X-SMTPAPI" => '{"category": "Test Category"}'

这将 NOT 工作:

config.action_mailer.default "X-SMTPAPI" => '{"category": "Test Category"}' # DOES NOT WORK

答案 1 :(得分:1)

遗憾的是,您似乎没有使用Rails 3,它有一个新的ActionMailer::Base.default方法,您可以使用它在application.rb中设置它。 编辑:我没注意到你说它是标题中的第3轨。在这种情况下,请将其添加到config / application.rb中的配置块:

config.action_mailer.default "X-SMTPAPI" => '{"category": "Test Category"}'

对于Rails 2.x,你有两个选择;使用action_mailer_callbacks之类的插件在初始化程序中定义一个before_filter样式调用来设置标题,或者使用猴子路径动作管理器来使它做你想做的事。我担心,这两种解决方案都不是特别优雅。

Here's一个很好的例子,有人想要做同样的事情,以及你如何修补AM,但是使用from地址而不是标题。

答案 2 :(得分:0)

您可以定义一个超类来定义此方法以简单地设置标题:

class MailBase < ActionMailer::Base
  def test_email
    # sendgrid headers go here
  end
end

然后你让你的类继承自这个类:

class MailSub < MailBase
  def test_email
    # email stuff goes here
    super
  end
 end

此处super方法调用将调用超类中的test_email方法,从而添加Sendgrid标头。