在Rails3 / ActionMailer中设置Message-ID邮件头

时间:2011-07-06 14:47:11

标签: ruby-on-rails-3 actionmailer email-headers rfc5322

我想使用ActionMailer更改从Ruby on Rails v3应用程序发送的电子邮件标题部分中的Message-ID标题。

我在localhost上使用Sendmail进行邮件传递。

我是在Sendmail还是ActionMailer中配置它?

我在哪里配置它(如果它是ActionMailer):config/文件夹中的文件或app / mailers /文件夹中的文件?

5 个答案:

答案 0 :(得分:19)

Teddy的答案很好,除非你真的希望每条消息都有不同的ID,你需要将默认值设为lambda。在他的答案中的第一个代码块中,它在init处计算一次消息ID,并为每条消息使用相同的消息ID。

以下是我在我的应用中执行此操作的方式:

default "Message-ID" => lambda {"<#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}>"}

...从自定义app配置变量中获取域名(并使用SecureRandom.uuid,这比基于IMO时间戳的SHA-2更直接。)

答案 1 :(得分:7)

我通常更喜欢使用UUID生成message-id。假设你有uuid宝石:

headers['Message-ID'] = "<#{ UUID.generate }@example.com>"

此外,您应该注意,根据RFC 2822,message-id应放在“&lt;”中和“&gt;”

答案 2 :(得分:7)

在Rails 4+(或者只是Ruby 2.0+)中,下面的语法正常工作:

default "Message-ID" => ->(v){"<#{Digest::SHA2.hexdigest(Time.now.to_i.to_s)}@yourdomain.com>"}

使用MailCatcher进行测试。

答案 3 :(得分:5)

我想出来了。最简单的方法是使用邮件程序类文件顶部的default方法。

示例:

require 'digest/sha2'
class UserMailer < ActionMailer::Base
  default "Message-ID"=>"#{Digest::SHA2.hexdigest(Time.now.to_i.to_s)}@yourdomain.com"

  # ... the rest of your mailer class
end

但是,我发现这很难测试,因此我编写了一个私有方法并使用了sent_at时间代替Time.now

def message_id_in_header(sent_at=Time.now)
  headers["Message-ID"] = "#{Digest::SHA2.hexdigest(sent_at.to_i.to_s)}@yourdomain.com"
end

我在调用mail方法之前简单地调用了该方法。这样便于从我的测试中传递sent_at参数,并在email.encoded中验证匹配。

答案 4 :(得分:3)

@jasoncrawford几乎是对的。问题是mailgun_domain属性可能无法在开发环境中使用,因此最好访问ActionMailer配置。

default "Message-ID" => lambda {"<#{SecureRandom.uuid}@{ActionMailer::Base.smtp_settings[:domain]}>"}