在我的 Rails 4 应用程序中,我已经使用观察者将所有外发电子邮件存储在数据库中。在 config/initializers/all_emails_observer.rb 我大致有以下代码:
class AllEmailObserver
def self.delivered_email(message)
sent_email = SentEmail.new(
sender: message.from.join(';'),
recipients: message.to,
subject: message.subject
)
sent_email.body = if message.html_part || message.text_part
message.html_part.blank? ? message.text_part.body.raw_source : message.html_part.body.raw_source
else
message.body.raw_source
end
sent_email.save!
end
end
ActionMailer::Base.register_observer(AllEmailObserver)
现在我需要添加另一个功能,让管理员重新发送电子邮件日志中的任何电子邮件。
我可以立即看到一些解决方案:
- 添加代码以存储所有附件(常规附件和内联附件),然后实现一个生成新电子邮件并重新发送的方法。我现在正在做这件事。
- 存储邮件程序类、邮件程序方法和参数(例如,使用 GlobalId 进行序列化)。当管理员需要重新发送电子邮件时 - 从头开始生成新电子邮件。我不喜欢这种方法,因为理想情况下,我希望重新发送的电子邮件具有与最初发送时完全相同的内容(包括附件)。此后,邮件程序可能会修复错误/错别字,但我确实希望在重新发送电子邮件时所有这些错误和错别字仍然存在。
现在 Rails 4.2 发布并且 ActiveJob 稳定了,我没有找到标准的方法来做到这一点:所有排队的电子邮件在发送后立即被删除(我刚刚检查了 delay_job 后端)。必须有一种方法可以在某个单独的数据库表中保存已完成的邮件程序作业,然后在需要时重新排队该作业。
如果可能的话,我很想重新使用 ActiveJob 的电子邮件序列化机制来实现我的目标,因为我不想在 Rails 6 发布时使用完全改变的观察者 API 重新编写我的观察者。
启用重新发送已发送电子邮件的更好方法是什么?
请注意,我已经在这里查看了类似的问题:
但是,它们都是关于如何存储已发送的电子邮件,而不是关于如何按原样重新发送它们。
谢谢!亚历克斯。