Попробуйте
npm install @types/node --save-dev
и в файле tsconfig добавьте: -
{
"compilerOptions": {
"types": ["node"]
}
}
Как Joseph Daigle упомянул, необходимо, очевидно, записать точную дату и время зарегистрированного пользователя. После этого Вам нужен крон, выполняющий каждое определенное число минут (каждый час, например) проверяющий, чтобы видеть, существуют ли какие-либо новые пользователи, регистрационное время которых больше, чем 48 часов, отправьте почту упомянутому пользователю и отметьте того пользователя, как уже послано по электронной почте, таким образом, Вы не посылаете им по электронной почте снова.
Согласно фактической почтовой отправке, проверьте следующую страницу документации: http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer
Это имеет все, что необходимо знать для отправки писем с RoR.
Сначала Вы испытываете необходимость в рабочем демоне или фоновом сервисе, который может опросить Вашу очередь (вероятно, от в базе данных) каждые несколько минут.
Алгоритм довольно прост. Запишите время пользовательского события в очереди. Когда демон проверяет, что объект в очереди и разница во времени больше, чем 48 часов, подготовьте электронную почту для отправки.
Я рекомендую использовать последнюю версию 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 сценарий для него.
Можно поставить задания в очередь с задержкой с помощью асинхронного наблюдателя. Идеально, что-либо, что Вы имеете, который, как известно, не мгновенен (или очень близко к нему) все время, должно перейти через что-то как этот.
Я записал плагин, названный acts_as_scheduled, который может выручить Вас.
acts_as_scheduled позволяет Вам управлять запланированными событиями для своих моделей.
Хороший пример этого планирует обновление Каналов RSS в фоновом процессе с помощью Крона или BackgroundRB.
С acts_as_scheduled Ваш менеджер по расписанию может просто назвать "Модель find_next_scheduled ()" для захвата следующего объекта от базы данных.
Как я приблизился бы, это путем создания контроллера планирования, который будет запрашивать базу данных для next_scheduled и затем использовать почтовую программу для отправки сообщения. Вы настраивают Задание Крона для вызова контроллера периодически с помощью WGET или ЗАВИХРЕНИЯ. Преимущество подхода Крона/Контроллера состоит в том, что никакая дальнейшая инфраструктура или конфигурация не требуются на сервере, и Вы избегаете сложного кода поточной обработки.
Я думаю, что был бы склонен сохранить потребность в электронной почте и самое раннее время, после которого она должна быть отправлена, куда-нибудь отделиться, затем иметь мою things-do задачу, смотрят на это. Тем путем я только должен обработать столько же записей, сколько существуют электронные письма, которые будут отправлены, вместо того, чтобы исследуют каждого пользователя каждый раз, который или стал бы утомительным или потребовал бы иначе, вероятно, ненужного индекса. В качестве награды, если бы у меня были другие задачи, которые будут выполнены на своего рода записанное в дневник основание, то та же конструкция была бы полезна с небольшой модификацией.