Отправка электронных писем на основе интервалов с помощью Ruby on Rails

Я хотел бы смочь отправить строку электронных писем в решительном интервале различным получателям.

Я присваиваю каждому Контакту этот ряд электронных писем, названных Кампанией, где Кампания имеет Email1, Email2, и т.д. Каждый Контакт имеет Контакт start_date. Каждая электронная почта имеет email.days, который хранит количество дней начиная с даты начала Контакта для отправки электронного письма.

Например: Email1.days=5, Email2.days=7, Email3.days=11.

Contact1.start_date = 10.04.2010; contact2.start_date = 08.04.2010

ЕСЛИ сегодня 4/15, то Contact1 получает электронное письмо 1 (15-04.04.10 = 5 дней), ЕСЛИ сегодня 4/15, то Contact2 получил электронное письмо 2 (4/15 - 4/8 = 7 дней).

Что хорошее действие должно выполнять каждый день с помощью задания крона, которое затем следовало бы этим правилам отослать почтовое использование ActionMailer?

Примечание: Вопрос не об использовании ActionMailer. Это о выполнении "математики", а также выполнения. Который электронная почта отправить, к кого? Я предполагаю, что это имеет отношение к некоторой версии Даты - Контакт [x] .start_date, и затем сравните с электронной почтой [x] .days, но я не точно ясен как. Спасибо.

Я хотел бы руководство на том, использовать ли date.today по сравнению с time.now также.

Примечание: намерение состоит в том, что физическое лицо, возможно, должно запланировать отдельное продолжение на последовательной основе. Вместо того, чтобы иметь необходимость помнить, когда продолжить, какая электронная почта, с кем, она просто следовала бы за предопределенной кампанией и послала бы за тем человеком.

Таким образом, это не "массовая рассылка" - это действительно автоматизирует продолжение для отдельной корреспонденции.

16
задан Timothy T. 27 April 2010 в 00:25
поделиться

4 ответа

Я бы использовал DelayedJob для этого (при условии, что вы не отправляете большое количество электронных писем в день, т. Е. Сотни тысяч в день и т. д.)

class Email < ActiveRecord::Base
  belongs_to :campaign
  after_create :schedule_email_dispatch

  def schedule_email_dispatch
    send_at(campaign.created_at + self.days.days, :send_email)
  end

  def send_email
  end
end

Запуск воркеров с помощью задачи с граблями:

rake jobs:work

Каждый раз, когда создается новый объект электронной почты, в очередь добавляется отложенное задание. Через правильный интервал электронное письмо будет отправлено работником.

@campaign = Compaign.new(...)
@campaign.emails.build(:days => 1)
@campaign.emails.build(:days => 2)
@campaign.save # now the delay

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

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

Если вы хотите использовать подход cron, сделайте следующее:

class Email < ActiveRecord::Base
  def self.dispatch_emails
    # find the emails due for dispatch
    Email.all(:conditions => ["created_at <= DATE_SUB(?, INTERVAL days DAY)", 
             Time.now]).each do |email|
      email.send_email
    end
  end
end

В этом решении большая часть обработки выполняется БД.

Добавьте файл email.rake в каталог lib / tasks :

task :dispatch_emails => :environment do
  Email.dispatch_emails
end

Настройте cron для регулярного выполнения rake dispatch_emails (в вашем случае < 24 часа)

14
ответ дан 30 November 2019 в 22:02
поделиться

Я думаю, было бы намного проще и безопаснее (вам не нужно беспокоиться об аутентификации и т. Д.) Создать задачу с граблями для отправки электронные письма. Также вам не нужно беспокоиться о возможно очень долгом запросе. Просто создайте файл RAILS_ROOT / lib / tasks / email.rake

namespace :email do 
  desc "Sends scheduled emails"
  task :send_scheduled => :enviroment do 
    Email.send_scheduled_emails
  end
end

и RAILS_ROOT / app / email.rb

class Email < ActiveRecord::Base      
   # ...

   def self.send_scheduled_emails 
     #send your emails ...
   end
end

. Затем создайте задание cron

0 0 * * * user cd /your/rails/app/ && RAILS_ENV=production rake emais:send_scheduled

для отправки писем каждую ночь в 12:00.

1
ответ дан 30 November 2019 в 22:02
поделиться

Я бы создал задачу rake в RAILS_ROOT / lib / tasks / email.rake

namespace :email do
  desc "send emails to contacts"
  task :send do
    Email.all.each do |email|
      # if start_date is a datetime or timestamp column
      contacts = Contact.all(:conditions => ["DATE(start_date) = ?", email.days.days.ago.to_date])
      # if start_date is a date column
      contacts = Contact.all(:conditions => { :start_date => email.days.days.ago.to_date })
      contacts.each do |contact|
        #code to send the email
      end
    end
  end
end

Затем я бы использовал cronjob для вызова этой задачи rake каждый день в 3 часа ночи:

0 3 * * * app_user cd RAILS_APP_FOLDER && RAILS_ENV=production rake email:send
6
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: