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

Ted*_*ddy 14 actionmailer email-headers ruby-on-rails-3 rfc5322

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

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

我在Sendmail或ActionMailer中配置它吗?

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

jas*_*ord 19

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

这是我在我的应用程序中执行此操作的方式:

default "Message-ID" => lambda {"<#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}>"}
Run Code Online (Sandbox Code Playgroud)

...从自定义应用程序配置变量中获取域名(并使用SecureRandom.uuid,这比基于时间戳IMO的SHA-2稍微简单一点.)

  • 虽然这基本上是正确的答案,但我认为应该对其进行编辑以包括 @andrewleung 提到的 &lt;&gt; 。否则,它将被忽略。默认“消息 ID”=&gt; lambda {“&lt;#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}&gt;”} (2认同)

Moh*_*vid 7

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

headers['Message-ID'] = "<#{ UUID.generate }@example.com>"
Run Code Online (Sandbox Code Playgroud)

另外你应该注意,根据RFC 2822,message-id应该放在"<"和">"里面


Phi*_*ek_ 7

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

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

使用MailCatcher测试过.


Ted*_*ddy 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
Run Code Online (Sandbox Code Playgroud)

但是,我发现这很难测试,因此我写了一个私有方法并用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
Run Code Online (Sandbox Code Playgroud)

在调用方法之前,我只是简单地调用了该mail方法。这使sent_at从测试中传递参数并验证中的匹配变得容易email.encoded

  • 如果您实际上希望每个消息都具有不同的ID,则需要将默认值设置为lamba。在上面的第一段代码中,它在初始化时计算一次message-ID,并为每条消息使用相同的ID。不好意思,我想在这里提供一些代码,而StackOverflow不允许我格式化它。我将添加另一个答案。 (3认同)