Gibt es eine einfache Möglichkeit, Devise mitzuteilen, alle E-Mails über delayed_job zu senden?Senden einer verzögerten E-Mail-Nachricht vom Gerät
Antwort
Alternativ kann anstelle der Verwendung des Delayed :: Mailer Juwel, können Sie ganz einfach implementieren und Ihre eigenen verwenden Action „Versandmethode“, eine, die ...
- fängt Postversand von Action
- speichert die E-Mail in einer Tabelle (optional)
- erzeugt eine verzögerte :: Job, der die gespeicherten E-Mail verweist
- die gespeicherte E-Mail liefert, wenn das verzögerte Job
entlang der Linien von etwas tun ausgeführt wird:
# 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
Die Verzögerte :: Job müssen Sie würde dann implementieren ...
- Abrufen der gespeicherten E-Mail aus der Datenbank -
email = ::Email.find_by_id(email_id)
- die E-Mail über das Mail-Juwel liefern -
Mail::Message.new(email.message).deliver
, dass es ... diese Hilfe hoffen!
Ich habe keine Ahnung, was Devise ist, aber ich denke, es ist ein Edelstein von Drittanbietern, den Sie nicht ändern möchten. Versuchen Sie delayed_job_mailer. Sie können Devise-Mailer durch Affe-Patches erweitern, um delayed_job zu verwenden.
class SomeExistingMailer
include Delayed::Mailer
end
oder wenn Sie alle App-E-Mails über verzögerte Job standardmäßig senden möchten:
# config/initializers/delayed_mailer.rb
class ActionMailer::Base
include Delayed::Mailer
end
Hat das am Ende funktioniert? Ich bin auf der Suche nach der gleichen Lösung – AnApprentice
Ich habe Ihren 2. Vorschlag versucht, das wäre toll, wenn es funktioniert, aber einen Fehler bekommen "/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: nicht initialisierte Konstante Verzögert: : Mailer (NameError) " – AnApprentice
Das scheint mir, dass Delayed mailer gem nicht geladen wurde. Haben Sie es in Gemfile angegeben, benötigen Sie es eventuell in environment.rb – gertas
Ich fand, dass keiner der oben genannten für mich arbeitete. Ich benutze Devise 2.0.4 und Rails 3.2.2 mit delayed_job_active_record 0.3.2
Die Art, wie devise tatsächlich darüber spricht, etwas in den Kommentaren im Code zu tun, besteht darin, die Methoden in der User-Klasse zu überschreiben. So löste ich es wie so, und es funktioniert perfekt:
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
Es gibt jetzt die devise-Asynchron-Projekt, das erreicht genau das:
http://stackoverflow.com/questions/4125564/rails-devise-delay ed-job – Zabba