Отправка отложенного письма от устройства - PullRequest
7 голосов
/ 17 сентября 2010

Есть ли простой способ сообщить Devise об отправке всей электронной почты с помощью delayed_job?

Ответы [ 4 ]

12 голосов
/ 30 ноября 2010

В качестве альтернативы, вместо использования гема Delayed :: Mailer, вы можете довольно легко реализовать и использовать собственный метод доставки ActionMailer, который ...

  1. перехватывает доставку почты из ActionMailer
  2. хранит электронную почту в таблице (необязательно)
  3. создает Delayed :: Job, которая ссылается на сохраненную электронную почту
  4. доставляет сохраненную электронную почту при задержкезадание выполнено

Сделайте что-то вроде:

# in config/application.rb
ActionMailer::Base.add_delivery_method :queued, Mail::QueuedDelivery

# in config/environment.rb (or one of the config/environments/*.rb files)
config.action_mailer.delivery_method = :queued # ie. Mail::QueuedDelivery

# in lib/mail/queued_delivery.rb
module Mail
  class QueuedDelivery

    def initialize(values = {})
      # (optional)
    end

    def deliver!(mail)
      email = Email.create!(:delivery_handler => mail.delivery_handler.name, :message => mail.to_s)
      Delayed::Job.enqueue Jobs::Email::DeliverEmail.new(email.id)
    end

  end # class QueueDelivery
end # module Mail

Задержка :: Задание, которое вам нужно реализовать, затем ...

  1. восстановить сохраненную электронную почту из базы данных - email = ::Email.find_by_id(email_id)
  2. доставить электронную почту с помощью почтового самоцвета - Mail::Message.new(email.message).deliver

Вот и все ... надеюсь, это поможет!

3 голосов
/ 18 сентября 2010

Я понятия не имею, что такое Devise, но я думаю, что это сторонний драгоценный камень, который вы не хотите изменять. Попробуйте delayed_job_mailer . Вы можете расширить почтовые программы Devise, исправив их, чтобы использовать delayed_job.

class SomeExistingMailer
  include Delayed::Mailer
end

или если вы хотите отправить все электронные письма приложения по отложенному заданию по умолчанию:

# config/initializers/delayed_mailer.rb
class ActionMailer::Base
  include Delayed::Mailer
end
2 голосов
/ 15 марта 2012

Я обнаружил, что ничего из вышеперечисленного не работает для меня.Я использую Devise 2.0.4 и Rails 3.2.2 с delayed_job_active_record 0.3.2

На самом деле devise говорит о том, как сделать что-то подобное в комментариях в коде, - переопределить методы класса User.Таким образом, я решил это так, и он отлично работает:

app / models / User.rb

def send_on_create_confirmation_instructions
  Devise::Mailer.delay.confirmation_instructions(self)
end
def send_reset_password_instructions
  Devise::Mailer.delay.reset_password_instructions(self)
end
def send_unlock_instructions
  Devise::Mailer.delay.unlock_instructions(self)
end
0 голосов
/ 20 ноября 2013

Сейчас существует проект devise-async, который достигает именно этого:

...