ruby-on-rails - 如何监控actionmailer的状态deliver_later
问题描述
TL;博士
如何跟踪排队的邮件deliver_later
以及它们的传递状态?
细节
deliver_later
我想使用来自动作邮件的异步发送一堆电子邮件。它的工作原理是在邮件中异步发送wait:
并按预期工作。到目前为止,一切都很好。
我现在想提供一些有关已发送邮件状态的状态信息。即一个简单的字符串x/y mails sent
,我可以通过 http 或以后的任何内容进行查询(这不是这个问题的关注点!)。我的期望是我可以轻松访问作业队列或类似的东西,然后我可以在其中注册回调,after_action
但显然没有这样的东西,看起来我需要使用所述回调手工制作,但我找不到单个资源甚至提到了“交货状态”这个话题。似乎世界上没有人对是否以及何时deliver_later
实际发送 oO 邮件感兴趣?我能找到的最接近的事情是如何为单元测试的目的检查这一点,但这绝对不是我想要的。
解决方案
没有数据存储(除了您选择的后台作业系统)来存储有关异步交付的完整性或状态的信息。但是,您可以使用 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)
推荐阅读
- c# - 使用基本身份验证重定向到 HttpWebResponse Uri 的问题
- excel - 我们如何使用 VBA 代码登录 Outlook?
- julia - 如何定义一个 Vector 以使 Julia 中的所有元素都具有相同的类型?
- angular - 使用自定义模块应用primeng
- python - 使用 Python 捕获 HTML 文本的正则表达式
- php - 没有警报消息,Ajax 成功不起作用
- redis - 我可以为 redis zset 定义自定义比较函数吗?
- java - 动态(重新)加载服务提供者模块
- d3.js - 在应用过渡之前停止绘制第一条路径的正确方法是什么?
- python - 如何使用 Python 从 Google 表格中获取特定的单元格值以用于不和谐机器人?