我想改变在使用ActionMailer发送电子邮件时,位于邮件头部的Message-ID
标头。
我在本地主机上使用Sendmail进行邮件传送。
我该在Sendmail还是ActionMailer中进行配置?
如果是在ActionMailer中配置,我应该在config/
文件夹中的文件还是在app/mailers/文件夹中的文件中进行配置?
我想改变在使用ActionMailer发送电子邮件时,位于邮件头部的Message-ID
标头。
我在本地主机上使用Sendmail进行邮件传送。
我该在Sendmail还是ActionMailer中进行配置?
如果是在ActionMailer中配置,我应该在config/
文件夹中的文件还是在app/mailers/文件夹中的文件中进行配置?
Teddy的回答很好,但是如果你真的想让每个消息都有不同的ID,就需要将默认值设置为lambda函数。在他回答的第一段代码中,它只在初始化时计算了一次message-ID,并在每个消息中使用了相同的ID。
这是我在我的应用程序中所做的方式:
default "Message-ID" => lambda {"<#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}>"}
使用从自定义应用程序配置变量中获取的域名(并使用SecureRandom.uuid,这比基于时间戳的SHA-2更直观,我个人认为。)
我通常更喜欢使用UUID生成消息ID。假设您已经安装了uuid gem:
headers['Message-ID'] = "<#{ UUID.generate }@example.com>"
此外,根据RFC 2822规定,邮件的message-id应该被放在"<"和">"之间。
require 'securerandom'
,然后跟上SecureRandom.uuid
。 - chrisczdefault "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.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]}>"}
1.9.3-p484
中,我不得不在 lambda 函数中添加|v|
以避免异常:wrong number of arguments (1 for 0)
。 - sorensMail::Message
具有message_id
属性(文档),您可以编写default message_id: -> { "my@id.com" }
。尖括号会自动添加。 - undefined