2010-09-17 2 views

risposta

12

In alternativa, invece di utilizzare il Delayed :: Mailer gemma, si può facilmente implementare e utilizzare il proprio ActionMailer "metodo di consegna", uno che ...

  1. intercettazioni di consegna di posta da ActionMailer
  2. memorizza la posta elettronica in una tabella (opzionale)
  3. crea una ritardata :: lavoro che fa riferimento l'e-mail memorizzati
  4. batte un e-mail memorizzati quando il lavoro viene eseguito in ritardo

Fai qualcosa sulla falsariga di:

# 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 

La ritardata :: Job è necessario sarebbe quindi implementare ...

  1. recuperare l'e-mail memorizzati dal database - email = ::Email.find_by_id(email_id)
  2. consegnare l'e-mail tramite la gemma mail - Mail::Message.new(email.message).deliver

Questo è tutto ... spero che questo aiuto!

3

Non ho idea di cosa sia Devise ma immagino che sia una gemma di terze parti che non si desidera modificare. Prova delayed_job_mailer. Puoi estendere i mailer di Devise per mezzo di patch di scimmia per usare delayed_job.

class SomeExistingMailer 
    include Delayed::Mailer 
end 

o se si desidera inviare tutte le email app tramite lavoro ritardata per impostazione predefinita:

# config/initializers/delayed_mailer.rb 
class ActionMailer::Base 
    include Delayed::Mailer 
end 
+1

Ha funzionato? Sto cercando la stessa soluzione – AnApprentice

+0

Ho provato il tuo secondo suggerimento che sarebbe fantastico se funzionasse, ma ho ricevuto un errore "/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: costante non inizializzata Ritardata: : Mailer (NameError) " – AnApprentice

+0

Questo mi sembra che il mailer di Delayed gem non è stato caricato. Lo hai specificato in Gemfile, eventualmente lo richiedi in environment.rb – gertas

2

Ho scoperto che nessuno dei precedenti ha funzionato per me. Sto usando Devise 2.0.4 e Rails 3.2.2 con delayed_job_active_record 0.3.2

Il modo in cui devise parla effettivamente di fare qualcosa di simile nei commenti nel codice è quello di sovrascrivere i metodi nella classe User. Così, ho risolto in questo modo, e funziona perfettamente:

app/modelli/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