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稍微简单一点.)
我通常更喜欢使用UUID生成message-id.假设你有uuid宝石:
headers['Message-ID'] = "<#{ UUID.generate }@example.com>"
Run Code Online (Sandbox Code Playgroud)
另外你应该注意,根据RFC 2822,message-id应该放在"<"和">"里面
在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测试过.
我想通了。最简单的方法是使用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
。
归档时间: |
|
查看次数: |
7166 次 |
最近记录: |