C'è un modo semplice per dire a Devise di inviare tutte le e-mail tramite delayed_job?Invio di e-mail differita da dispositivo
risposta
In alternativa, invece di utilizzare il Delayed :: Mailer gemma, si può facilmente implementare e utilizzare il proprio ActionMailer "metodo di consegna", uno che ...
- intercettazioni di consegna di posta da ActionMailer
- memorizza la posta elettronica in una tabella (opzionale)
- crea una ritardata :: lavoro che fa riferimento l'e-mail memorizzati
- 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 ...
- recuperare l'e-mail memorizzati dal database -
email = ::Email.find_by_id(email_id)
- consegnare l'e-mail tramite la gemma mail -
Mail::Message.new(email.message).deliver
Questo è tutto ... spero che questo aiuto!
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
Ha funzionato? Sto cercando la stessa soluzione – AnApprentice
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
Questo mi sembra che il mailer di Delayed gem non è stato caricato. Lo hai specificato in Gemfile, eventualmente lo richiedi in environment.rb – gertas
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
V'è ora il progetto concepire-asincrono che realizza proprio questo:
http://stackoverflow.com/questions/4125564/rails-devise-delay ed-job – Zabba