16

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

我在本地主机上使用 Sendmail 进行邮件传递。

我应该在 Sendmail 或 ActionMailer 中配置它吗?

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

4

5 回答 5

21

Teddy 的回答很好,除了如果你真的希望每条消息都有不同的 ID,你需要将默认设置为 lambda。在他回答的第一个代码块中,它在初始化时计算一次消息 ID,并为每条消息使用相同的 ID。

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

default "Message-ID" => lambda {"<#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}>"}

...域取自自定义应用程序配置变量(并使用 SecureRandom.uuid,这比基于时间戳 IMO 的 SHA-2 更简单一些。)

于 2013-04-19T03:38:55.447 回答
8

我通常更喜欢使用 UUID 生成消息 ID。假设你有 uuid gem:

headers['Message-ID'] = "<#{ UUID.generate }@example.com>"

您还应该注意,根据RFC 2822,消息 ID 应放在“<”和“>”内

于 2012-05-12T22:31:30.707 回答
7

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

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

用 MailCatcher 对此进行了测试。

于 2015-02-03T09:06:39.157 回答
4

我想通了。最简单的方法是使用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_attime 而不是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.

于 2011-07-06T20:54:59.270 回答
4

@jasoncrawford 几乎是对的。问题是 mailgun_domain 属性可能无法在开发环境中使用,因此最好访问 ActionMailer 配置。

default "Message-ID" => lambda {"<#{SecureRandom.uuid}@{ActionMailer::Base.smtp_settings[:domain]}>"}
于 2016-01-12T17:22:52.433 回答