2010-09-17 22 views

Respuesta

12

Como alternativa, en lugar de utilizar el Retraso :: joya Mailer, se puede implementar y utilizar su propio bastante facilidad ActionMailer "Forma de entrega", uno que ...

  1. intercepta entrega de correo de ActionMailer
  2. almacena el correo electrónico en una mesa (opcional)
  3. crea un retardado :: Trabajo que hace referencia al correo electrónico almacenado
  4. entrega el correo electrónico almacenado cuando se ejecuta el trabajo retrasado

hacer algo en la línea de:

# 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 

El Retraso :: trabajo que usted necesita para poner en práctica lo haría entonces ...

  1. recuperar el correo electrónico almacenado en la base de datos - email = ::Email.find_by_id(email_id)
  2. entregar el correo electrónico a través de la gema electrónico - Mail::Message.new(email.message).deliver

eso es todo ... espero que esto ayuda!

3

No tengo idea de qué es Devise pero supongo que es una gema de terceros que no desea modificar. Pruebe delayed_job_mailer. Puede extender los anuncios publicitarios de Devise mono parcheándolos para usar el trabajo demorado.

class SomeExistingMailer 
    include Delayed::Mailer 
end 

o si desea enviar todos los correos electrónicos a través de aplicaciones de trabajo retrasado por defecto:

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

¿Esto terminó funcionando? Estoy buscando la misma solución – AnApprentice

+0

Intenté su segunda sugerencia, que sería increíble si funcionaba, pero me salió un error "/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: constante no inicializada Retrasada: : Mailer (NameError) " – AnApprentice

+0

Esto me parece que la joya de correo retrasada no se ha cargado. ¿Lo especificó en Gemfile, finalmente lo requiere en environment.rb – gertas

2

Descubrí que ninguna de las anteriores funcionó para mí. Estoy usando Devise 2.0.4 y Rails 3.2.2 con retraso_job_activo_registro 0.3.2

La forma en que el diseño realmente habla de hacer algo como esto en los comentarios en el código es anular los métodos en la clase de Usuario. Por lo tanto, lo resolví como tal, y funciona perfectamente:

app/modelos/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 
Cuestiones relacionadas