Как следить за состоянием actionmailer delivery_later - PullRequest
0 голосов
/ 07 ноября 2018

TL; DR

Как отслеживать почтовые сообщения, поставленные в очередь на deliver_later, а также состояние их доставки?

Подробнее

Я хочу отправить несколько электронных писем в асинхронном режиме, используя deliver_later из action mailer. Это работает, поскольку в письмах отправляются асинхронные и wait: работает, как ожидалось. Пока все хорошо.

Теперь я хочу предоставить некоторую информацию о состоянии отправленных писем. То есть простая строка типа x/y mails sent, которую я могу запросить по http или как-нибудь позже (что является , а не проблемой этого вопроса!). Я ожидал, что я смогу легко получить доступ к очереди заданий или что-то в этом роде, где я могу зарегистрировать обратный вызов, как в after_action, но, по-видимому, такого нет, и мне кажется, что мне нужно вручную, используя упомянутые обратные вызовы, но я не могу найти единый ресурс, даже упоминающий тему «состояние доставки». Похоже, что никто в мире не заинтересован, если и когда deliver_later ed письма действительно отправляются oO? Самым близким, что я смог найти, было то, как проверить это для модульных тестов, но это определенно не то, что я хочу.

1 Ответ

0 голосов
/ 07 ноября 2018

Нет хранилища данных (кроме выбранной вами системы фоновых заданий), в котором хранится информация о полноте или состоянии вашей асинхронной доставки. Однако вы можете наблюдать за доставкой почты с помощью шаблона Rails Observer. Если вы хотите отслеживать попытки и статус доставки почты, я бы добавил таблицу в вашу базу данных для каждой доставки.

Отслеживание вызова метода почтовой рассылки для создания доставки:

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

Отслеживание того, что почтовик отправил сообщение (позже):

Вы можете добавить наблюдателя в свою почтовую программу (или все почтовые программы) с помощью register_observer. Класс Observer должен реализовывать self.delivered_email(message), и этот метод будет вызываться после доставки электронной почты. В этот момент вы можете найти запись в своей базе данных и написать на ней метку времени, чтобы пометить ее как «отправленную».

Вот пример того, как это может выглядеть:

Это непроверенный код, он может работать не так, как написано

# your mailer class
class NotifierMailer < ApplicationMailer
  after_action :record_delivery

  private

  def record_delivery
    # create an identifier for this mail message and add it 
    # to the headers of the mail message
    headers['X-Delivery-Id'] = SecureRandom.uuid
    # write a database record to track that this email is to be sent
    MailDelivery.create(uuid: headers['X-Delivery-Id'])
  end
end

# an observer class
class MailDeliveryObserver
  def self.delivered_email(message)
    delivery = MailDelivery.find_by(uuid: message.headers['X-Delivery-Id'])
    delivery&.touch(:sent_at)
  end
end

# in application.rb
# NotifierMailer can be any mailer
NotifierMailer.register_observer(MailDeliveryObserver)

Вот статья, которая объясняет немного больше о наблюдателях

И некоторые текущие документы Rails по наблюдателям

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...