2016-10-13 4 views
6

У меня есть то, что я считаю рабочей настройкой для отправки электронной почты через Delayed_Job. Тем не менее, я не получил свое тестовое электронное письмо, и не стоит ждать, пока произойдет еще больше с задержкой дней. Мне нужно выяснить:Отправка электронной почты с Delayed_Job

  1. Что не так, что сообщение электронной почты не отправлено.
  2. Как протестировать его без ожидания дней за раз.

Я новичок в Delayed_Job, поэтому прощайте ошибки новичка.

Вот модель, которая включает в себя метод send_reminder_emails. Они были полностью функциональны без .delay(run_at: self.mail_date) бита, так по крайней мере, я знаю, что много работает:

class Reminder < ActiveRecord::Base 
    belongs_to :user 
    before_save :create_mail_date 
    after_save :send_reminder_emails 
    extend FriendlyId 
    friendly_id :name, use: [:slugged, :finders] 

    def create_mail_date 
    @schedule = IceCube::Schedule.new(self.date) 
    case self.repeating 
    when "Weekly" 
     @schedule.add_recurrence_rule(
      IceCube::Rule.weekly 
     ) 
    when "Monthly" 
     @schedule.add_recurrence_rule(
      IceCube::Rule.monthly.day_of_month(self.date.mon) 
     ) 
    when "Yearly" 
     @schedule.add_recurrence_rule(
      IceCube::Rule.yearly.day_of_year(self.date.yday) 
     ) 
    end 
    if self.repeating 
     self.date = @schedule.next_occurrence(Time.now) 
    end 
    self.mail_date = self.date - 7.days 
    end 

    private 

    def send_reminder_emails 
     if self.reminder 
     ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self).deliver_now 
     self.create_mail_date 
    end 
    end 
    handle_asynchronously :send_reminder_emails 

end 

ссылки на schedule находятся через Ice_Cube драгоценный камень, и все даты материала было проверено с помощью моей консоли и работают. Вот мой reminder_mailer.rb:

class ReminderMailer < ApplicationMailer 
    default from: "[email protected]" 

    def reminder_send(user, reminder) 
    @user = user 
    @reminder = reminder 

    mail(to: user.email, subject: "Reminder! #{reminder.name} is fast approaching!") 
    end 
end 

Я установил Delayed_Job шаг за шагом от их риого для Rails 4. Любой помощи получает отложенную часть этой почтовой программы сглажена ценится!

+0

Что вы получаете, когда запускаете 'Delayed :: Job.all' в консоли rails. – dnsh

+0

@Dinesh, я получаю 'NameError: uninitialized constant Delayed от (pry): 12: in' __pry __ ''Я чувствую, что это плохой знак. – Liz

+0

Есть ли git repo для этого? –

ответ

4

Когда вы отправляете письма с использованием отложенной работы, при инициализации delayed_job для почтовой программы не нужно добавлять «доставить» или «доставить». Таким образом,

ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self) 

сам будет работать.

Преобразуйте свой «self.mail_date», чтобы указать время, в которое вы хотите отправить почту. Передача только даты не будет работать. В основном run_at должен указывать дату и время.

Пожалуйста, проверьте «» delayed_job ссылку GitHub под заголовком «Rails 3 ПОЧТООТПРАВИТЕЛЕЙ» https://github.com/collectiveidea/delayed_job

+0

Спасибо, что поймал этот надзор. Элементы теперь появляются в моей консоли, когда я делаю 'Delayed :: Job.all'. Тем не менее, 'run_at' по-прежнему остается время, когда элемент входит в очередь, а не' mail_date' из базы данных. Мысли? – Liz

+0

Параметр run_at используется для передачи «Время», а не «Дата». Задержка задания никогда не может быть назначена на дату, но только на время.Я думаю, вы можете запустить задание с задержкой только для записей, дата которых является текущей датой выполнения задания. И передайте время для выполнения в параметре «run_at». надеюсь это поможет. Будет оценена поддержка моего ответа. :) –

+0

По таким вопросам, как [это] (http://stackoverflow.com/questions/39713242/make-delayed-job-run-at-specific-date-time), похоже, что это должно быть возможно ... – Liz

7

Вы можете использовать активное задание для отправки почты с помощью планирования задания в определенное время.

Active Job - это среда для объявления рабочих мест и их запуска на различных серверах очереди. Этими заданиями могут быть все, начиная от регулярно запланированных сборов, до выставления счетов, до почтовых рассылок. Все, что можно нарезать на небольшие части работы и работать параллельно, действительно.

Для запуска и выполнения заданий на производстве вам необходимо настроить серверную очередь, то есть вам нужно решить, какая библиотека для сторонних разработчиков должна использовать Rails. Рельсы сами по себе предоставляют только систему обработки в процессе, которая сохраняет только рабочие места в ОЗУ. Если процесс завершился с ошибкой или машина была сброшена, то все выдающиеся задания будут потеряны с исходным кодом async по умолчанию. Это может быть хорошо для небольших приложений или некритических заданий, но большинству производственных приложений нужно будет выбрать постоянный бэкэнд.

Активное задание имеет встроенные адаптеры для нескольких серверов очереди (Sidekiq, Resque, Delayed Job и другие).Чтобы получить уточненный список адаптеров см Документация по API для ActiveJob::QueueAdapters.

Однажды после настройки очередей адаптеров, а затем создать задание для отправки почты

class RemainderMailerJob < ApplicationJob 
    queue_as :default 

    def perform(user, remainder) 
    ReminderMailer.reminder_send(user, reminder).deliver 
    end 
end 

Для отправки почты на определенное время вам нужно поставить в очередь задание и выполнить его в определенное время. Если вам нужно отправить почту через 7 дней, тогда позвоните в этот фрагмент кода, где вам нужно.

RemainderMailerJob.set(wait: 1.week).perform_later(user, remainder) 

Сейчас эта Работа будет выполняться после 1 недели, в свою очередь, вызывает почтовую программу в то время, так что ваши письма будут отправлены на определенный день.

Если бы вы знали конкретные даты времени, то вы можете использовать

RemainderMailerJob.set(wait_untill: <Specific date>).perform_later(user, remainder) 

Если у вас есть какие-либо сомнения относительно активной работы любезно см Active Job Basics

+0

Я ценю ваш невероятно тщательный ответ. Проблема в том, что я пытаюсь отправить ее на дату, определенную базой данных, а не на то, когда задание поставлено в очередь. Я не могу использовать что-то вроде «wait: 1.week», потому что это может быть неделя или месяц или день. Имеет ли это смысл? – Liz

+0

@Liz Вы можете использовать 'GuestsCleanupJob.set (wait_until: ) .perform_later (guest)' –

+0

@Liz Я внесли изменения в ответ, посмотрите на него. –

0

Я видел это происходит, когда защита атрибут неправильно. (Обычно на устаревших приложениях, которые оставляли некоторый kludge при обновлении версии rails.)

Посмотрите, можете ли вы установить поле с консоли: Delayed::Job.new(run_at: 1.year.from_now). Если нет, это преступник, и вам нужно будет найти причину в своем приложении.

Если это работает, нам по-прежнему необходимо проверить, является ли это проблемой приложения или ошибкой DJ. Создайте новое минимальное приложение для рельсов с помощью только таблицы delayed_job и попытайтесь воспроизвести это. Если вы не можете, то в вашем приложении есть что-то еще странное.