Какой самый элегантный способ реализовать дайджест электронной почты без переизобретения системы очередей? - PullRequest
6 голосов
/ 29 сентября 2011

У меня настроена транзакционная система электронной почты, и по умолчанию люди получают электронные письма по мере того, как происходят события:

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, это хорошая идея, чтобы не создавать свои собственные:

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

ЕстьВы внедрили дайджест-письмо, использовали ли вы delayed_job и что вы узнали?

Ответы [ 3 ]

2 голосов
/ 04 октября 2011

Дайджест выглядит более подходящим для выполнения, например, для cron. Вы все равно должны были бы контролировать «кого вы отправили», чтобы справляться со сбоями и ошибками, но идея состоит в том, чтобы, например, ежедневно запускать пользовательские грабли, которые обрабатывают ваше почтовое сообщение, включая всю информацию в дайджест формат и их отправка или очередь на отправку.

1 голос
/ 06 августа 2012

Если кому-то нужна более подробная информация об отличном способе сделать это, здесь есть хороший обзор (второй ответ): Отправка электронных писем по интервалам с использованием Ruby on Rails

1 голос
/ 29 сентября 2011

Очевидно, вам не нужно создавать свою собственную систему очередей.Я не использовал delayed_job, но я использовал resque в сочетании с миленьким драгоценным камнем resque_mailer , который должен делать именно то, что вы хотите.Что хорошо в resque_mailer, так это то, что после его настройки вам не нужно менять способ обычной отправки почты: MyMailer.some_mailing({vars}).deliver Если по какой-то причине вы не хотите использовать очередь для отправки почты (отправьте ее сразу же)), вам просто нужно добавить!после доставки, и он будет делать именно это.

Посмотрите в resque (с redis) и resque_mailer, я думаю, что он будет делать то, что вы хотите.

...