Отправка писем на основе интервалов с использованием Ruby on Rails
Я хотел бы иметь возможность отправлять строки писем с определенным интервалом различным получателям.
Я назначаю каждому контакту эту серию писем, которые называются Кампанией, где Кампания имеет Email1, Email2 и т.д. У каждого контакта есть Contact.start_date. Каждый Email имеет email.days, в котором хранится количество дней с даты начала контакта для отправки электронной почты.
Например: Email1.days = 5, Email2.days = 7, Email3.days = 11.
Contact1.start_date = 4/10/2010; contact2.start_date = 4/08/2010
ЕСЛИ сегодня 4/15, тогда Contact1 получает электронную почту 1 (4/15-4/10 = 5 дней)
ЕСЛИ сегодня 4/15, затем Contact2 получил электронную почту 2 (4/15 - 4/8 = 7 дней).
Какое хорошее действие нужно выполнять каждый день, используя задание cron, которое затем будет следовать этим правилам, чтобы отправлять электронные письма с помощью ActionMailer?
ПРИМЕЧАНИЕ. Вопрос заключается не в использовании ActionMailer. Речь идет о "математике", а также об исполнении. Какой адрес электронной почты отправить кому? Я предполагаю, что это связано с некоторой версией Date - Contact [x].start_date, а затем сравнивается с электронной почтой [x].days, но я не совсем понимаю, как это сделать. Спасибо.
Мне бы хотелось узнать, использовать ли date.today и time.now.
Примечание: цель состоит в том, что отдельному лицу может потребоваться запланировать индивидуальное наблюдение на постоянной основе. Вместо того, чтобы помнить, когда следует следить за тем, с чьей электронной почтой с ним, он просто будет следовать заранее определенной кампании и отправлять для этого человека.
Таким образом, это не "массовая почта" - это действительно автоматизирует отслеживание индивидуальной корреспонденции.
Ответы
Ответ 1
Я использовал бы DelayedJob для этого (при условии, что вы не отправляете большое количество электронных писем в день, то есть 100 тысяч в день и т.д. )
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:
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 часа)
Ответ 2
Я бы создал задачу 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 для вызова этой задачи рейка каждый день в 3 часа.:
0 3 * * * app_user cd RAILS_APP_FOLDER && RAILS_ENV=production rake email:send
Ответ 3
Я думаю, что было бы намного проще и безопаснее (вам не нужно беспокоиться об аутентификации и т.д.), чтобы создать задачу рейка для отправки электронных писем. Также вам не нужно беспокоиться о возможно очень длинном запросе. Просто создайте файл 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.
Ответ 4
Я использую rufus-scheduler для запланированных обновлений электронной почты и twitter. Вы должны проверить это.
Ответ 5
Я использую ar_mailer gem
http://seattlerb.rubyforge.org/ar_mailer/
http://github.com/adzap/ar_mailer
http://blog.segment7.net/articles/2006/08/15/ar_mailer