2010-12-21 16 views
5

He estado tratando de encontrar la forma de enviar correo diferido utilizando el método de trabajo retardado con carriles 3. He intentado casi todas las combinaciones de posibilidades posibles que se me ocurren - Puedo hacer que el correo se ejecute en segundo plano, simplemente no puedo retrasar el envío a un tiempo futuro. La tabla delayed_jobs en el PP borra las tareas, el registro dice 'enviado', el procesador de tareas delayed_job recoge la tarea & dice enviados sin fallo ... pero el correo es o bien:Rails 3/delayyed_job - Se busca: Ejemplo básico de correo retrasado

  • enviaron inmediatamente o
  • simplemente no llega

si intento enviarlo en el futuro.

Si alguien pudiera ofrecer un ejemplo escueto de una barandilla 3 de trabajo retardado que envía correo en el futuro, estaría muy agradecido. Estoy seguro de que mucha gente hace esto, así que sospecho que me estoy perdiendo algo obvio. Uno (de un sinnúmero) combinaciones He tratado a continuación:

delayed_job: 2.1.2 rieles: 3.0.3 actionmailer: 3.0.3

controlador:

class TestmailerController < ApplicationController 
    def index 
    Testmailer.delay.test_mail 
    end 

end 

Mailer:

class Testmailer < ActionMailer::Base 
    def test_mail 
    mail(:to => '([email protected]', :from => '(removedforprivacy)@gmail.com', :subject => 'Testing Delayed Job', :content_type => 'text/plain').deliver 
    end 
    handle_asynchronously :test_mail, :run_at => Proc.new { 2.minutes.from_now } 


end 

parte electrónico correspondiente de config/ambientes/development.rb:

# Don't care if the mailer can't send 
    config.action_mailer.raise_delivery_errors = true 

    # Print deprecation notices to the Rails logger 
    config.active_support.deprecation = :log 

    config.action_mailer.default_url_options = { :host => 'localhost:3000' } 

    ActionMailer::Base.smtp_settings = { 
    :address => "smtp.gmail.com", 
    :port => 587, 
    :domain => "gmail.com", 
    :user_name => "(removedforprivacy)", 
    :password => "(removedforprivacy)", 
    :authentication => "plain", 
    :enable_starttls_auto => true 
    } 

comando de empleo:

rake jobs:work 

Respuesta

13

Estoy de acuerdo con Andrea - yo estaba teniendo este problema exacto, y después de cambiar mi base de datos de desarrollo local SQLite a MySQL, que se puede ejecutar código como

Emailer.delay({:run_at => 5.minutes.from_now}).welcome(@user) 

y envía el correo electrónico 5 minutos más tarde. Tenga en cuenta que puede necesitar un retraso mayor de cinco minutos (en caso de rareza de zona horaria) para asegurarse de que esté funcionando.

+0

¿sabes cómo lograr esto sin el método de demora. Quiero usar el método handle_async ... Me gusta poder hacer que un método se demore en todos los lugares llamados, en lugar de cambiar a todos los que llaman. – baash05

1

Tanto utilizando el método y el establecimiento de .delayhandle_asynchronously :test_mail es redundante. Intente eliminar el método .delay de su código. utilizar simplemente

Testmailer.test_mail # without .deliver due to a delayed_job issue 

Sin embargo, me encontré con algunas pruebas de la configuración y al usar sqlite, run_at simplemente se ignora (no sé por qué), pero cuando se utiliza mysql2 todo funciona bien.

1

Encontré en Rails 3 con mongoid que quitar la línea handle_asynchronously hace que funcione. Estaba teniendo todo tipo de problemas, y parecía que delayyed_job no reconocía ningún objeto dentro de mi clase de Emailer. Al eliminar handle_asinnchronously lo corrigió.

Cuestiones relacionadas