开发者

What's the most elegant way to implement a digest email without reinventing a queueing system?

开发者 https://www.devze.com 2023-04-08 05:20 出处:网络
I have my transactional email system setup & by default people get emails as events happen: class Comment

I have my transactional email system setup & by default people get emails as events happen:

class Comment

  after_create :email_ori开发者_如何学JAVAginal_poster

  def email_original_poster
    UserMailer.delay.notify_author_of_comment self
  end

end

However instead of getting the email as-it-happens, a chunk of my users would prefer a daily or weekly digest.

What's the cleanest most elegant way to implement this?

I've already got delayed_job running but this doesn't really feel like a delayed_job job since I'm queueing data that needs to be acted on rather than actions that need to be executed.

...without reinventing a queueing system

I know that the obvious solution is table of queued_emails and of course I could do that. The reason I'm asking the question is that to do so is reinventing a queueing system. Not only are there lots of queuing systems out there but as this well worded post from Percona points out, it's a good idea not to roll your own:

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

Have you implemented a digest email, did you use delayed_job & what did you learn?


A digest looks like more appropriate to be done as a cron job like. You would still have to control to "who you have sent", to deal with crashes and errors, but the idea is to run, for example, on a daily basis, a custom rake task that craft your mail message including all info in a digest format and them send or queue for sending.


Obviously you shouldn't have to create your own queueing system. I haven't used delayed_job, but I have used resque in conjunction with a nice little gem called resque_mailer that should do exactly what you want. What's nice about resque_mailer is that, once it's set up, you don't have to change how you'd normally send mail: MyMailer.some_mailing({vars}).deliver If for some reason you want to not use the queue to send the mail (send it right away), you just need to add ! after deliver and it'll do just that.

Look into resque (with redis) and resque_mailer, I think it'll do what you want.


In case anyone wants more details on a great way to do this, there's a good overview here (second answer): Sending emails based on intervals using Ruby on Rails

0

精彩评论

暂无评论...
验证码 换一张
取 消