首页 > 解决方案 > 如何监控actionmailer的状态deliver_later

问题描述

TL;博士

如何跟踪排队的邮件deliver_later以及它们的传递状态?

细节

deliver_later我想使用来自动作邮件的异步发送一堆电子邮件。它的工作原理是在邮件中异步发送wait:并按预期工作。到目前为止,一切都很好。

我现在想提供一些有关已发送邮件状态的状态信息。即一个简单的字符串x/y mails sent,我可以通过 http 或以后的任何内容进行查询(这不是这个问题的关注点!)。我的期望是我可以轻松访问作业队列或类似的东西,然后我可以在其中注册回调,after_action但显然没有这样的东西,看起来我需要使用所述回调手工制作,但我找不到单个资源甚至提到了“交货状态”这个话题。似乎世界上没有人对是否以及何时deliver_later实际发送 oO 邮件感兴趣?我能找到的最接近的事情是如何为单元测试的目的检查这一点,但这绝对不是我想要的。

标签: ruby-on-railsrubyactionmailerrails-activejob

解决方案


没有数据存储(除了您选择的后台作业系统)来存储有关异步交付的完整性或状态的信息。但是,您可以使用 Rails 观察者模式观察邮件的传递。如果您想跟踪邮件投递的尝试和状态,我会在您的数据库中为每次投递添加一个表。

跟踪调用了一个邮件方法来创建一个传递:

您可以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 文档


推荐阅读