Каков наилучший способ запланировать задачу отправки электронной почты с помощью Ruby on Rails?

Я хотел бы запланировать ежедневную задачу: каждый день в 7 часов утра я хочу отправить электронное письмо (без вмешательства человека).

Я работаю над инфраструктурой RoR, и мне интересно, что это лучший способ сделать это?

Я слышал о BackgrounDRB, планировщике OpenWFEru или вещах, основанных на Cron, но я новичок и не понимаю, какой из них сделан для моей потребности.

Ответ 1

Другой вариант - создать задачу rake, выполняемую заданием cron. Для этого создайте файл some_file.rake и поместите его в папку lib/tasks. Ваш файл может выглядеть так:

Rails 2.x:

task :send_daily_mail, :needs => :environment do
    Model.send_daily_mail
end

Rails 3.x:

task :send_daily_mail => :environment do
    Model.send_daily_mail
end

Затем используйте cron, чтобы выполнить его так часто, как вам нравится:

cd /path/to/app && /usr/bin/rake send_daily_mail

Обратите внимание, что вам может потребоваться поставить RAILS_ENV=production в ваш crontab, если ваше приложение находится в режиме разработки по умолчанию.

Ответ 2

Я был впечатлен (и планировал попробовать) rufus-scheduler gem обсуждался в этом сообщении в блоге

Он описывает что-то вроде этого:

scheduler = Rufus::Scheduler.start_new  

scheduler.every("1m") do  
   DailyDigest.send_digest!  
end 

.. который выглядит довольно простой. Интересно, как легко было бы добавить конфигурацию на основе HTML?

Ответ 3

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

Я использую его, и я очень доволен этим.

Ответ 4

Добавьте метод класса к одной из ваших моделей, которые будут обрабатывать это для вас. Теперь попробуйте выполнить этот метод с помощью бегуна script

./script/runner "MyModel.send_daily_mail" RAILS_ENV=production

Убедитесь, что все работает нормально. Если это так, нам нужно сделать команду универсальной, правильно настроив путь к проекту.

cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production

Теперь измените на любой случайный directiry и запустите эту команду. Если он работает правильно, запустите crontab -e и вставьте в него команду, чтобы ежедневно запускаться в 7 утра. Есть тонны объяснения о формате cron там, если вы Google для них и должны быть довольно простыми, чтобы выяснить.

Ответ 5

Пойдите с задачей рейка и заданием cron, как уже сказал принятый ответ. Однако учтите, что обновление самого файла cron является ручной задачей. Это может быть хорошо, если вы не меняете его во время разработки. В противном случае, как вы можете позволить Capistrano сделать это за вас: http://push.cx/2008/deploying-crontab-with-your-rails-app