2010-09-17 5 views

Antwort

12

Alternativ kann anstelle der Verwendung des Delayed :: Mailer Juwel, können Sie ganz einfach implementieren und Ihre eigenen verwenden Action „Versandmethode“, eine, die ...

  1. fängt Postversand von Action
  2. speichert die E-Mail in einer Tabelle (optional)
  3. erzeugt eine verzögerte :: Job, der die gespeicherten E-Mail verweist
  4. 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 ...

  1. Abrufen der gespeicherten E-Mail aus der Datenbank - email = ::Email.find_by_id(email_id)
  2. die E-Mail über das Mail-Juwel liefern - Mail::Message.new(email.message).deliver

, dass es ... diese Hilfe hoffen!

3

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 
+1

Hat das am Ende funktioniert? Ich bin auf der Suche nach der gleichen Lösung – AnApprentice

+0

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

+0

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

2

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