如何跟踪deliver_later
排队的已排队邮件及其传递状态?
我想使用动作邮件程序中的deliver_later
发送一堆异步的电子邮件。只要邮件是异步发送的,它就可以正常工作,并且wait:
可以正常工作。到目前为止一切顺利。
我现在想提供一些有关已发送邮件状态的状态信息。即一个简单的字符串,例如x/y mails sent
,我可以通过http或以后的查询来查询(不是这个问题!)。我的期望是,我可以轻松地访问作业队列或类似的东西,然后可以在after_action
中注册回调,但是显然没有这样的东西,而且看起来我需要手工使用上述回调,但是我甚至提到“交付状态”主题也找不到单个资源。看来,世界上没有人对何时发送deliver_later
ed邮件感兴趣吗?我能找到的最接近的东西是如何针对单元测试进行检查,但这绝对不是我想要的。
答案 0 :(得分:1)
没有数据存储区(除了您选择的后台作业系统之外)存储有关异步交付的完整性或状态的信息。但是,您可以使用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)
Here's an article that explains a little more about observers