Каков наилучший способ запланировать задачу отправки электронной почты с Ruby on Rails? - PullRequest
10 голосов
/ 16 февраля 2009

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

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

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

Ответы [ 5 ]

13 голосов
/ 16 февраля 2009

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

Рельсы 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, если ваше приложение по умолчанию находится в режиме разработки.

7 голосов
/ 16 февраля 2009

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

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

scheduler = Rufus::Scheduler.start_new  

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

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

2 голосов
/ 17 февраля 2009

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

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

1 голос
/ 16 февраля 2009

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

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

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

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

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

0 голосов
/ 18 февраля 2009

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

...