我想使用ActionMailer更改从Ruby on Rails v3应用程序发送的电子邮件标题部分中的Message-ID
标题。
我在localhost上使用Sendmail进行邮件传递。
我是在Sendmail还是ActionMailer中配置它?
我在哪里配置它(如果它是ActionMailer):config/
文件夹中的文件或app / mailers /文件夹中的文件?
答案 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]}>"}