Как отправлять электронную почту через x часов после регистрации пользователя в Ruby on Rails? - PullRequest
8 голосов
/ 28 декабря 2008

Как мне отправить письмо пользователю, скажем, через 48 часов после регистрации в Ruby on Rails? Спасибо!

Ответы [ 6 ]

6 голосов
/ 28 декабря 2008

Как упоминал Джозеф Дейгл, вам необходимо явно указать точную дату и время регистрации пользователя. После этого вам нужно, чтобы cron запускался каждые определенное количество минут (например, каждый час), проверяя, есть ли какие-либо новые пользователи, время регистрации которых превышает 48 часов, отправляет письмо указанному пользователю и помечает его как уже отправленного так что вы больше не будете писать им по электронной почте.

Что касается фактической отправки почты, проверьте следующую страницу документации: http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer

В нем есть все, что вам нужно знать, чтобы отправлять письма с RoR.

3 голосов
/ 28 декабря 2008

Я рекомендую вам использовать последнюю версию BackgrounDRb для этого. Вы можете прочитать о BackgrounDRb здесь: http://backgroundrb.rubyforge.org/

Чтобы поставить сообщение в очередь для последующей доставки, клиентский код BackgrounDRb (возможно, в обратном вызове after_create вашей модели приложения) может выглядеть примерно так:

MiddleMan(:email_worker).enq_send_email_task(:message => @message, 
  :job_key => "notify1",
  :scheduled_at => Time.now + 48.hours)

Вам потребуется создать работника BackgrounDRb для обработки отправки электронной почты:

# RAILS_ROOT/lib/workers/email_worker.rb
class EmailWorker < BackgrounDRb::MetaWorker
  set_worker_name :email_worker
  def send_email_task(message)
    # ... Code to send the email message 
  end
end

Обратите внимание, что для использования BackgrounDRb таким способом вы должны использовать постоянные очереди заданий, поэтому убедитесь, что вы запустили миграцию, включенную в BackgrounDRb, чтобы настроить таблицу персистентности в вашем приложении.

BackgrounDRb запускается отдельно от Rails (mongrel, apache и т. Д.) С использованием 'script / backgroundrb start', поэтому убедитесь, что вы добавляете демон в любой мониторинг процессов, который вы используете (god, monit и т. Д.) Или что вы создайте для него скрипт /etc/init.d

1 голос
/ 31 декабря 2008

Я написал плагин под названием acts_as_scheduled , который может вам помочь.

acts_as_scheduled позволяет вам управлять запланированные события для ваших моделей.

Хорошим примером этого является планирование обновление RSS-каналов в фоновый процесс с использованием Cron или BackgroundRB.

С актами по расписанию менеджер может просто позвонить "Model.find_next_scheduled ()", чтобы получить следующий элемент из базы данных.

Как бы я подошел к этому, создав контроллер планирования, который будет запрашивать базу данных для next_scheduled, а затем использовать почтовую программу для отправки сообщения. Вы настроили Cron Job для периодического вызова контроллера, используя WGET или CURL . Преимущество подхода Cron / Controller состоит в том, что на сервере не требуется никакой дополнительной инфраструктуры или конфигурации, и вы избегаете сложного многопоточного кода.

1 голос
/ 28 декабря 2008

Вы можете поставить задания в очередь с задержкой, используя async наблюдатель . В идеале, все, что у вас есть, что, как известно, не является мгновенным (или очень близким), должно проходить через что-то подобное.

1 голос
/ 28 декабря 2008

Сначала вам понадобится работающий демон или фоновая служба, которая каждые несколько минут может опрашивать вашу очередь (вероятно, из базы данных).

Алгоритм довольно прост. Запишите время пользовательского события в очереди. Когда демон проверяет этот элемент в очереди и разница во времени превышает 48 часов, подготовьте к отправке электронное письмо.

0 голосов
/ 28 декабря 2008

Я думаю, что я был бы склонен хранить потребность в электронном письме и в самое раннее время, после которого оно должно быть отправлено, где-то отдельно, а затем проанализировать мою задачу. Таким образом, мне нужно только обработать столько записей, сколько отправлено писем, чем каждый раз проверять каждого пользователя, что может быть утомительным или требовать, возможно, иного ненужного индекса. В качестве бонуса, если бы у меня были какие-то другие задачи, выполняемые на какой-то основе, то такая же конструкция была бы полезна с небольшими изменениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...