Как пойти об отправке электронного письма x спустя часы после того, как пользователь подписывается в Ruby on Rails?

Попробуйте

npm install @types/node --save-dev

и в файле tsconfig добавьте: -

 {
  "compilerOptions": {
    "types": ["node"]
 }

}

8
задан Joseph Daigle 28 December 2008 в 05:46
поделиться

6 ответов

Как Joseph Daigle упомянул, необходимо, очевидно, записать точную дату и время зарегистрированного пользователя. После этого Вам нужен крон, выполняющий каждое определенное число минут (каждый час, например) проверяющий, чтобы видеть, существуют ли какие-либо новые пользователи, регистрационное время которых больше, чем 48 часов, отправьте почту упомянутому пользователю и отметьте того пользователя, как уже послано по электронной почте, таким образом, Вы не посылаете им по электронной почте снова.

Согласно фактической почтовой отправке, проверьте следующую страницу документации: http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer

Это имеет все, что необходимо знать для отправки писем с RoR.

6
ответ дан 5 December 2019 в 14:07
поделиться

Сначала Вы испытываете необходимость в рабочем демоне или фоновом сервисе, который может опросить Вашу очередь (вероятно, от в базе данных) каждые несколько минут.

Алгоритм довольно прост. Запишите время пользовательского события в очереди. Когда демон проверяет, что объект в очереди и разница во времени больше, чем 48 часов, подготовьте электронную почту для отправки.

1
ответ дан 5 December 2019 в 14:07
поделиться

Я рекомендую использовать последнюю версию BackgrounDRb для обработки этого. Можно читать о BackgrounDRb здесь: http://backgroundrb.rubyforge.org/

Для организации очередей сообщения для более поздней доставки клиентский код BackgrounDRb (в after_create обратном вызове прикладной модели, возможно) мог выглядеть примерно так:

MiddleMan(:email_worker).enq_send_email_task(:message => @message, 
  :job_key => "notify1",
  :scheduled_at => Time.now + 48.hours)

Необходимо было бы создать рабочего BackgrounDRb для обработки отправки электронного письма:

# RAILS_ROOT/lib/workers/email_worker.rb
class EmailWorker < BackgrounDRb::MetaWorker
  set_worker_name :email_worker
  def send_email_task(message)
    # ... Code to send the email message 
  end
end

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

BackgrounDRb запускается отдельно с направляющих (полукровка, апач, и т.д.) использующий 'script/backgroundrb запускаются', поэтому удостоверьтесь, что Вы добавляете демона к любому контролю процесса, который Вы используете (бог, monit, и т.д.) или что Вы создаете/etc/init.d сценарий для него.

3
ответ дан 5 December 2019 в 14:07
поделиться

Можно поставить задания в очередь с задержкой с помощью асинхронного наблюдателя. Идеально, что-либо, что Вы имеете, который, как известно, не мгновенен (или очень близко к нему) все время, должно перейти через что-то как этот.

1
ответ дан 5 December 2019 в 14:07
поделиться

Я записал плагин, названный acts_as_scheduled, который может выручить Вас.

acts_as_scheduled позволяет Вам управлять запланированными событиями для своих моделей.

Хороший пример этого планирует обновление Каналов RSS в фоновом процессе с помощью Крона или BackgroundRB.

С acts_as_scheduled Ваш менеджер по расписанию может просто назвать "Модель find_next_scheduled ()" для захвата следующего объекта от базы данных.

Как я приблизился бы, это путем создания контроллера планирования, который будет запрашивать базу данных для next_scheduled и затем использовать почтовую программу для отправки сообщения. Вы настраивают Задание Крона для вызова контроллера периодически с помощью WGET или ЗАВИХРЕНИЯ. Преимущество подхода Крона/Контроллера состоит в том, что никакая дальнейшая инфраструктура или конфигурация не требуются на сервере, и Вы избегаете сложного кода поточной обработки.

1
ответ дан 5 December 2019 в 14:07
поделиться

Я думаю, что был бы склонен сохранить потребность в электронной почте и самое раннее время, после которого она должна быть отправлена, куда-нибудь отделиться, затем иметь мою things-do задачу, смотрят на это. Тем путем я только должен обработать столько же записей, сколько существуют электронные письма, которые будут отправлены, вместо того, чтобы исследуют каждого пользователя каждый раз, который или стал бы утомительным или потребовал бы иначе, вероятно, ненужного индекса. В качестве награды, если бы у меня были другие задачи, которые будут выполнены на своего рода записанное в дневник основание, то та же конструкция была бы полезна с небольшой модификацией.

0
ответ дан 5 December 2019 в 14:07
поделиться
Другие вопросы по тегам:

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