我想Message-ID
使用 ActionMailer 更改从 Ruby on Rails v3 应用程序发送的电子邮件的标题部分中的标题。
我在本地主机上使用 Sendmail 进行邮件传递。
我应该在 Sendmail 或 ActionMailer 中配置它吗?
我在哪里配置它(如果是 ActionMailer):文件config/
夹中的文件或 app/mailers/ 文件夹中的文件?
我想Message-ID
使用 ActionMailer 更改从 Ruby on Rails v3 应用程序发送的电子邮件的标题部分中的标题。
我在本地主机上使用 Sendmail 进行邮件传递。
我应该在 Sendmail 或 ActionMailer 中配置它吗?
我在哪里配置它(如果是 ActionMailer):文件config/
夹中的文件或 app/mailers/ 文件夹中的文件?
Teddy 的回答很好,除了如果你真的希望每条消息都有不同的 ID,你需要将默认设置为 lambda。在他回答的第一个代码块中,它在初始化时计算一次消息 ID,并为每条消息使用相同的 ID。
这是我在我的应用程序中执行此操作的方式:
default "Message-ID" => lambda {"<#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}>"}
...域取自自定义应用程序配置变量(并使用 SecureRandom.uuid,这比基于时间戳 IMO 的 SHA-2 更简单一些。)
我通常更喜欢使用 UUID 生成消息 ID。假设你有 uuid gem:
headers['Message-ID'] = "<#{ UUID.generate }@example.com>"
您还应该注意,根据RFC 2822,消息 ID 应放在“<”和“>”内
在 Rails 4+(或只是 Ruby 2.0+)中,以下语法正常工作:
default "Message-ID" => ->(v){"<#{Digest::SHA2.hexdigest(Time.now.to_i.to_s)}@yourdomain.com>"}
用 MailCatcher 对此进行了测试。
我想通了。最简单的方法是使用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 而不是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
.
@jasoncrawford 几乎是对的。问题是 mailgun_domain 属性可能无法在开发环境中使用,因此最好访问 ActionMailer 配置。
default "Message-ID" => lambda {"<#{SecureRandom.uuid}@{ActionMailer::Base.smtp_settings[:domain]}>"}