Установите почтовый заголовок Message-ID в Rails3 / ActionMailer - PullRequest
14 голосов
/ 06 июля 2011

Я хотел бы изменить заголовок Message-ID, который находится в части заголовка электронного письма, отправленного из приложения Ruby on Rails v3 с помощью ActionMailer.

Я использую Sendmail на localhost для доставки почты.

Настраивается ли это в Sendmail или ActionMailer?

Где я могу настроить это (если это ActionMailer): файл в папке config/ или файл в app / mailers / folder?

Ответы [ 5 ]

19 голосов
/ 19 апреля 2013

Ответ Тедди хорош, за исключением того, что если вы хотите, чтобы каждое сообщение имело другой идентификатор, вам нужно сделать лямбду по умолчанию.В первом блоке кода в своем ответе он вычисляет идентификатор сообщения один раз, при инициализации, и использует один и тот же для каждого сообщения.

Вот как я делаю это в своем приложении:

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

... с доменом, взятым из пользовательской переменной конфигурации приложения (и с использованием SecureRandom.uuid, который немного более прост, чем SHA-2 на основе временной метки IMO.)

7 голосов
/ 03 февраля 2015

В Rails 4+ (или только в Ruby 2.0+) следующий синтаксис работает правильно:

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

Протестировано с MailCatcher.

7 голосов
/ 13 мая 2012

Я обычно предпочитаю генерировать идентификатор сообщения с UUID. Предположим, у вас есть драгоценный камень uuid:

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

Также следует отметить, что в соответствии с RFC 2822 идентификатор сообщения должен быть помещен внутри "<" и ">"

5 голосов
/ 07 июля 2011

Я понял это.Самый простой способ сделать это - использовать метод 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.

3 голосов
/ 12 января 2016

@ Джейсон Кроуфорд почти прав. Проблема в том, что атрибут mailgun_domain может быть недоступен в среде разработки, поэтому лучше получить доступ к настройкам ActionMailer.

default "Message-ID" => lambda {"<#{SecureRandom.uuid}@{ActionMailer::Base.smtp_settings[:domain]}>"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...