2

我想为所有邮件设置一个标题值。我想在拦截器中执行此操作,这样我就不必为所有邮件重复代码。

如果我在 mailer 函数中执行此操作,代码将如下所示,

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

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

4

2 回答 2

8

我在 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
于 2012-12-10T03:31:54.157 回答
3

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

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"

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

于 2015-09-16T01:54:59.990 回答