在Rails 3中的邮件拦截器中设置标头

时间:2012-10-15 15:27:08

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

我想为所有邮件设置标头值。我想在拦截器中执行它,这样我就不必为所有邮件重复代码了。

如果我在邮件程序功能中执行此操作,代码将如下所示,

headers['X-Mailgun-Campaign-Id'] = "1234"

但是如何使用拦截器实现相同的目标?

2 个答案:

答案 0 :(得分:5)

我在ActionMailer拦截器中设置自定义标头时遇到了类似的问题。邮件中使用的标准语法不起作用:

def self.delivering_email(message)
  message.headers['X-Mailgun-Campaign-Id'] = "1234"
end

...但源代码中提到的这种哈希样式语法确实有效:

def self.delivering_email(message)
  message.headers 'X-Mailgun-Campaign-Id' => "1234"
end

答案 1 :(得分:1)

如果有人发现这个寻找相同的答案,那就是如何覆盖拦截器中的现有标头,这就是我最终使用的内容。

message.header.fields.select{|f| f.name == 'X-Custom-Header' }
                     .each{|f| message.header.fields.delete(f) }

// these two following lines work equivalently in Rails 4:
message.headers['X-Custom-Header'] = "1234"
message.header 'X-Custom-Header' => "1234"

标头内部存储在数组中,而不是哈希,因此为了“覆盖”,您必须先完全删除标头。否则你的“覆盖”实际上只会添加另一个具有相同名称的标题,而且很难知道如何在另一端处理它。