Отправка писем по интервалам с использованием Ruby on Rails - PullRequest
16 голосов
/ 16 апреля 2010

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

Я назначаю каждому Контакту эту серию электронных писем, называемых Кампанией, где у Кампании есть Электронная почта1, Электронная почта2 и т. Д. У каждого Контакта есть Контактная дата_старт. В каждом письме есть 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, то Контакт1 получает Email 1 (4 / 15-4 / 10 = 5 дней) Если сегодня 4/15, то Контакт2 получил письмо 2 (4/15 - 4/8 = 7 дней).

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

ПРИМЕЧАНИЕ. Вопрос не в использовании ActionMailer. Речь идет о выполнении "математика", а также выполнение. Какое письмо отправлять кому? Я предполагаю, что это связано с какой-то версией Date - Contact [x] .start_date, а затем сравнить с электронной почтой [x] .days, но я не совсем понимаю, как. Спасибо.

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

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

Так что это не «массовая почта» - это действительно автоматизирует отслеживание индивидуальной переписки.

Ответы [ 5 ]

14 голосов
/ 20 апреля 2010

Я бы использовал 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 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 часа) </p>

6 голосов
/ 20 апреля 2010

Я бы создал задачу 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 часа ночи ::1004*.

0 3 * * * app_user cd RAILS_APP_FOLDER && RAILS_ENV=production rake email:send
1 голос
/ 27 декабря 2010

Я использую rufus-планировщик для запланированных обновлений электронной почты и Twitter. Вы должны это проверить.

1 голос
/ 17 апреля 2010

Я думаю, что было бы намного проще и безопаснее (вам не нужно беспокоиться об аутентификации и т. Д.) Создать задачу rake для отправки писем. Также вам не нужно беспокоиться о возможном очень длительном запросе. Просто создайте файл 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.

0 голосов
/ 21 апреля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...