2014-02-10 2 views
0

Можно ли вызвать ActionMailer из задания cron? Мы используем Rails 3.Вызов ActionMailer из задания cron в Rails 3?

В идеале, задание cron запускает скрипт для чтения пользователей из базы данных, передает эти пользователи и некоторые переменные классу ActionMailer для запуска электронной почты.

Возможно ли это в Rails 3.2.12?

ответ

5

Да, это возможно. Вы можете использовать задачу для вызова с помощью команды rake. Ваша задача может быть что-то вроде этого:

# lib/tasks/cron.rake 
namespace :cron do 
    desc "Send account emails" 
    task deliver_emails: :environment do 
    accounts_for_delivery = Account.where(condition: true) 
    # ... whatever logic you need 

    accounts_for_delivery.each do |account| 
     Postman.personalized_email_for(account).deliver 
    end 
    end 
end 

И ваша почтовая программа и соответствующий вид может выглядеть следующим образом:

# app/mailers/postman.rb 
class Postman < ActionMailer::Base 
    def personalized_email_for(account) 
    @account = account 
    mail to: account.email 
    end 
end 
# app/views/postman/personalized_email_for.text.haml 
= @account.inspect 

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

# config/schedule.rb 
every 6.hours do 
    rake 'cron:deliver_email' 
end 

Так что теперь определение cronjob связаны приложения. Он хорошо работает с Capistrano между развертываниями. Вы также можете передавать переменные в свою задачу или выполнять системные команды.

+0

Очень простые и прямые направления. Спасибо! Отлично работает для меня ... – prodigerati

0

Если все остальное не удается, вы можете просто создать нормальное действие контроллера и позволить cronjob вызвать его с помощью завитка.

В противном случае любой скрипт в вашей папке сценариев приложений Rails можно запустить с rails runner script/myscript.rb из командной строки и иметь полный доступ ко всем функциям Rails.

0

Вы можете использовать rails r (rails runner), чтобы запустить скрипт в вашем приложении rails. Он запускает его, загружая в полный контекст вашего приложения rails, прежде чем делать это, поэтому доступны все ваши модели и т. Д. Я использую его много. Например,

rails r utilities/some_data_massaging_script.rb 

От cron вам, очевидно, необходимо будет предоставить полный путь к вашему приложению.

Старомодный способ должен был иметь что-то вроде:

require "#{File.dirname(__FILE__)}/../config/environment.rb" 

в верхней части вашего сценария (регулировки относительного немного пути в зависимости от уровня подкаталог вашего скрипта в вашем приложении, конечно) а затем просто запустите свой скрипт с помощью ruby, но rails r делает это ненужным.

Смежные вопросы