Установите заголовок почты Message-ID в Rails3/ActionMailer
Я хотел бы изменить заголовок Message-ID
, который находится в заголовке сообщения электронной почты, отправленного из приложения Ruby on Rails v3 с помощью ActionMailer.
Я использую Sendmail на localhost для доставки почты.
Я могу настроить это в Sendmail или ActionMailer?
Где я могу настроить это (если это ActionMailer): файл в папке config/
или файл в папке "app/mailers/folder"?
Ответы
Ответ 1
Я понял это. Самый простой способ - использовать метод 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
.
Ответ 2
Тедди-ответ хорош, за исключением того, что если вы действительно хотите, чтобы каждое сообщение имело другой идентификатор, вам нужно сделать по умолчанию лямбда. В первом блоке кода в его ответе он вычисляет идентификатор сообщения один раз, при инициализации и использует один и тот же для каждого сообщения.
Вот как я это делаю в своем приложении:
default "Message-ID" => lambda {"<#{SecureRandom.uuid}@#{Rails.application.config.mailgun_domain}>"}
... с областью, взятой из настраиваемой переменной конфигурации приложения (и используя SecureRandom.uuid, что немного более прямолинейно, чем SHA-2 на основе временной метки IMO.)
Ответ 3
Обычно я предпочитаю генерировать идентификатор сообщения с помощью UUID. Предполагая, что у вас есть драгоценный камень uuid:
headers['Message-ID'] = "<#{ UUID.generate }@example.com>"
Также следует отметить, что в соответствии с RFC 2822 идентификатор сообщения должен быть помещен внутри "<" и " > "
Ответ 4
В Rails 4+ (или просто Ruby 2.0+) синтаксис следующего действия работает правильно:
default "Message-ID" => ->(v){"<#{Digest::SHA2.hexdigest(Time.now.to_i.to_s)}@yourdomain.com>"}
Протестировано с помощью MailCatcher.
Ответ 5
@jasoncrawford почти прав. Проблема в том, что атрибут mailgun_domain может не работать в среде разработки, поэтому лучше получить доступ к конфигурациям ActionMailer.
default "Message-ID" => lambda {"<#{SecureRandom.uuid}@{ActionMailer::Base.smtp_settings[:domain]}>"}