2010-12-21 5 views
5

Ich habe versucht, herauszufinden, wie verzögerte E-Mail mit delayed_job mit Schienen 3 zu senden. Ich habe so ziemlich jede Kombination von realisierbaren Möglichkeiten ausprobiert - Ich kann die Mail im Hintergrund laufen lassen, ich kann es einfach nicht bekommen, um das Senden auf eine zukünftige Zeit zu verzögern. Die delayed_jobs Tabelle in der db löscht die Aufgaben, sagt das Protokoll ‚geschickt‘, der delayed_job Task-Prozessor abholt die Aufgabe & sagt ohne Fehler gesendet ... aber die E-Mail ist entweder:Rails 3/delayed_job - Gesucht: Grundlegendes Beispiel für verzögerte E-Mail

  • sofort gesendet oder
  • kommt einfach nicht

wenn ich versuche, in der Zukunft zu senden.

Wenn jemand ein bloßes Beispiel für eine Schiene 3 delayed_job anbieten könnte, die in der Zukunft Mail sendet, würde ich wirklich dankbar sein. Ich bin mir sicher, dass viele Leute das tun, also vermute ich, dass ich etwas Offensichtliches vermisse. Ein (unzähliger) Kombinationen Ich habe unten versucht:

delayed_job: 2.1.2 Schienen: 3.0.3 Action: 3.0.3

Controller:

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 

relevant Mail-Teil von config/Umgebungen/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 
    } 

Job-Befehl:

rake jobs:work 

Antwort

13

ich mit andrea zustimmen - ich genau dieses Problem hatte, und nach meiner lokalen Entwicklung Datenbank von SQLite zu MySQL wechseln, kann ich Code wie

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

und sendet die E-Mail 5 Minuten später ausgeführt werden. Beachten Sie, dass Sie möglicherweise eine größere Verzögerung als fünf Minuten benötigen (im Falle von Zeitzonenverwirrung), um sicher zu sein, dass es funktioniert.

+0

wissen Sie, wie Sie dies ohne die Verzögerungsmethode erreichen. Ich möchte die Methode handle_async ... verwenden. Ich mag es, eine Methode in allen aufgerufenen Orten verzögern zu können, anstatt alle Anrufer zu ändern. – baash05

1

beide mit dem Verfahren und .delayhandle_asynchronously :test_mail Einstellung ist redundant. Versuchen Sie, die .delay Methode aus Ihrem Code zu entfernen. verwenden Sie einfach

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

Allerdings lief ich einige Test auf Ihre Konfiguration und wenn SQLite verwenden, wird run_at einfach ignoriert (weiß nicht warum), aber bei der Verwendung von mysql2 alles funktioniert.

1

Ich fand in Rails 3 mit Mongoid, dass das Entfernen der handle_asynchronous Linie es zum Funktionieren bringt. Ich hatte alle möglichen Probleme und es schien, dass delayed_job keine Objekte in meiner Emailerklasse erkannte. Entfernen handle_asynchronous behoben.