Как я могу использовать delayed_job на heroku для отправки пакетов электронной почты, которые являются пакетными? - PullRequest
1 голос
/ 22 августа 2010

Я прочитал документацию по работникам и delayed_job и не смог точно следовать, поэтому хотел начать с некоторой стратегии и примера кода.

У меня есть контроллер, который я использую для отправки электронных писем по одному. Теперь каждый день я хочу проверять, какие электронные письма нужно отправлять за день, а затем отправлять их через heroku в виде delayed_job.

Как мне начать подходить к этому? спасибо.

Это то, что я придумаю, основываясь на ответах:

Используя гем «всякий раз», я создал следующий schedule.rb

  every 1.day, :at => '4:30 am' do

    heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS'])
    heroku.set_workers(ENV['HEROKU_APP'], 1)

    Contact.all.each do |contact|
      contact_email = contact.email_today

      unless contact.email_today == "none"
        puts contact.first_name
        puts contact_email.days
        puts contact.date_entered

        Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email)
      end

    end

    heroku.set_workers(ENV['HEROKU_APP'], 0)
  end

Чтобы определить, должен ли я отправлять электронное письмо сегодня или нет, я создал метод для contact.rb:

  def email_today

    next_event_info = self.next_event_info # invokes method for contact

    next_event = next_event_info[:event]
    delay = next_event_info[:delay]

    if next_event.class.name == "Email" && from_today(self, next_event.days) + delay < 0 #helper from_today
      return next_event      
    else
      return "none"
    end

  end

Это выглядит правильно? Я занимаюсь разработкой на windows и развертываю на heroku, так что не знаю, как это проверить ... спасибо!

1 Ответ

3 голосов
/ 23 августа 2010

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

Очевидно, вам также необходимо добавить плагин delayed_job (http://docs.heroku.com/delayed-job). Кроме того, в вашем приложении должен быть запущен хотя бы один работник.

Тогда это просто вопрос работы с почтой из задачи cron rake. Например, если у вас есть почтовик, называемый UserMailer, ваш cron может выглядеть примерно так:

#lib/cron.rb
task :cron => :environment do
  User.all.each do |user|
    Delayed::Job.enqueue UserMailer.deliver_notification(user)
  end
end

Если вы используете только фоновые задачи для отправки этих электронных писем, вы, возможно, могли бы также добавить некоторую логику в свою задачу cron и свои почтовые методы для добавления и удаления рабочих по мере необходимости, что избавит вас от необходимости платить за рабочих пока они не используются.

...