Я хотел бы смочь отправить строку электронных писем в решительном интервале различным получателям.
Я присваиваю каждому Контакту этот ряд электронных писем, названных Кампанией, где Кампания имеет 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 также.
Примечание: намерение состоит в том, что физическое лицо, возможно, должно запланировать отдельное продолжение на последовательной основе. Вместо того, чтобы иметь необходимость помнить, когда продолжить, какая электронная почта, с кем, она просто следовала бы за предопределенной кампанией и послала бы за тем человеком.
Таким образом, это не "массовая рассылка" - это действительно автоматизирует продолжение для отдельной корреспонденции.
Я бы использовал 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 часа)
Я думаю, было бы намного проще и безопаснее (вам не нужно беспокоиться об аутентификации и т. Д.) Создать задачу с граблями для отправки электронные письма. Также вам не нужно беспокоиться о возможно очень долгом запросе. Просто создайте файл 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.
Я бы создал задачу 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
Я использую гем ar_mailer
http://seattlerb.rubyforge.org/ar_mailer/
http://github.com/adzap/ar_mailer
http://blog.segment7.net/articles / 2006/08/15 / ar_mailer