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

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

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

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


person Flackou    schedule 16.02.2009    source источник


Ответы (5)


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

Рельсы 2.x:

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

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

person erik    schedule 16.02.2009
comment
У меня странная проблема: когда я запускаю cd /path/to/app && /usr/local/bin/rake send_daily_mail из командной строки, все работает. Но когда crontab пытается его выполнить, у меня возникает ошибка /usr/local/bin/rake:9:in `require': Нет такого файла для загрузки -- rubygems(LoadError) из /usr/local/bin/rake:9 - person Flackou; 17.02.2009
comment
Задачи Cron выполняются по умолчанию без использования полной среды входа пользователей. У меня работал crontab: */5 * * * * bash --login -c 'cd /path/to/app && rake send_daily_mail' - person wonderfulthunk; 11.01.2011

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

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

scheduler = Rufus::Scheduler.start_new  

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

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

person Mike Woodhouse    schedule 16.02.2009
comment
так? Вы пробовали, что думаете? - person Dan Rosenstark; 07.05.2010

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

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

person salt.racer    schedule 16.02.2009

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

./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, если вы погуглите их, и это должно быть довольно просто понять.

person Alex Wayne    schedule 16.02.2009
comment
Большое спасибо за этот ответ. Можно ли управлять им из определенного файла (например, lib/tasks/send_mail.rb), а не методом модели? - person Flackou; 16.02.2009

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

person Amit K Mathur    schedule 18.02.2009