Каков наилучший способ запланировать задачу отправки электронной почты с помощью 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