Подтвердить что ты не робот

Установите заголовок почты Message-ID в Rails3/ActionMailer

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

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

Я могу настроить это в Sendmail или ActionMailer?

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

4b9b3361

Ответ 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]}>"}