在不重新设置排队系统的情况下实施摘要电子邮件的最优雅方式是什么?

我有交易电子邮件系统设置,默认情况下,人们会在事件发生时收到电子邮件:

class Comment after_create :email_original_poster def email_original_poster UserMailer.delay.notify_author_of_comment self end end 

然而,不是收到电子邮件,我的一大部分用户更喜欢每日或每周摘要。

实现这一目标最干净最优雅的方法是什么?

我已经运行了delayed_job ,但这并不像是一个delayed_job工作,因为我正在排队需要执行操作的数据而不是需要执行的操作。

…没有重新发明排队系统

我知道明显的解决方案是queued_emails表,当然我可以这样做。 我问这个问题的原因是这样做是重新发明一个排队系统。 不仅有很多排队系统,但正如Percona这篇措辞好的post所指出的那样,最好不要自己动手:

http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

你有没有实现摘要邮件,你使用了delayed_job吗?你学到了什么?

摘要看起来更适合像cron这样的工作。 你仍然需要控制“你发送的人”来处理崩溃和错误,但是想法是每天运行一个自定义的rake任务来制作你的邮件消息,包括所有信息。摘要格式,它们发送或排队发送。

显然你不应该创建自己的排队系统。 我没有使用delayed_job,但我已经将resque与一个名为resque_mailer的漂亮小gem一起使用,它应该完全符合您的要求。 resque_mailer的好处在于,一旦设置完毕,您就不必改变通常发送邮件的方式: MyMailer.some_mailing({vars}).deliver如果由于某种原因你不想使用队列发送邮件(立即发送),你只需要添加! 交付后,它会做到这一点。

看看resque(使用redis)和resque_mailer,我认为它会做你想要的。

如果有人想要更好的方法来做这个,那么这里有一个很好的概述(第二个答案): 使用Ruby on Rails基于间隔发送电子邮件