Отправка отложенного письма с устройства

Есть ли простой способ заставить Devise отправлять всю электронную почту через delayed_job?


person Neil Middleton    schedule 17.09.2010    source источник


Ответы (4)


В качестве альтернативы, вместо того, чтобы использовать гем 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

Delayed::Job, который вам нужно реализовать, будет...

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

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

person pvandenberk    schedule 30.11.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
person gertas    schedule 18.09.2010
comment
Я попробовал ваше второе предложение, которое было бы замечательно, если бы оно сработало, но получило ошибку /Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: неинициализированная константа Delayed::Mailer (NameError) - person AnApprentice; 08.11.2010
comment
Мне кажется, что гем Delayed mailer не был загружен. Вы указали это в Gemfile, в конечном итоге потребуется в environment.rb - person gertas; 09.11.2010

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

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

приложение/модели/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
person hrdwdmrbl    schedule 14.03.2012

Теперь есть проект devise-async, который достигает именно этого:

person John Bachir    schedule 20.11.2013