10 Stimmen

Was ist der beste Weg, um ein Senden-E-Mail-Aufgabe mit Ruby on Rails planen?

Ich möchte eine tägliche Aufgabe planen: Jeden Tag um 7 Uhr morgens soll eine E-Mail gesendet werden (ohne menschliches Zutun).

Ich arbeite am RoR-Framework und frage mich, wie ich das am besten anstelle?

Ich habe von BackgrounDRB, OpenWFEru-Scheduler oder Cron-basierten Lösungen gehört, aber ich bin ein Neuling und weiß nicht, welche davon für meine Bedürfnisse geeignet ist.

13voto

erik Punkte 6358

Eine andere Möglichkeit besteht darin, eine Rake-Aufgabe zu erstellen, die von einem Cron-Job ausgeführt wird. Dazu erstellen Sie eine Datei some_file.rake und legen Sie es in Ihr lib/tasks Ordner. Ihre Datei könnte wie folgt aussehen:

Rails 2.x:

task :send_daily_mail, :needs => :environment do
    Model.send_daily_mail
end

Rails 3.x:

task :send_daily_mail => :environment do
    Model.send_daily_mail
end

Verwenden Sie dann cron, um es so oft Sie wollen auszuführen:

cd /path/to/app && /usr/bin/rake send_daily_mail

Beachten Sie, dass Sie möglicherweise RAILS_ENV=production in Ihrer crontab, wenn sich Ihre Anwendung standardmäßig im Entwicklungsmodus befindet.

7voto

Mike Woodhouse Punkte 50241

Beeindruckt hat mich (und ich habe vor, es zu versuchen) die rufus-scheduler Edelstein diskutiert in diesem Blogeintrag

Er beschreibt dies folgendermaßen:

scheduler = Rufus::Scheduler.start_new  

scheduler.every("1m") do  
   DailyDigest.send_digest!  
end 

was ziemlich einfach zu sein scheint. Ich frage mich, wie einfach es wäre, eine HTML-basierte Konfiguration hinzuzufügen?

2voto

salt.racer Punkte 21113

Ich verwende BackgroundRB und es funktioniert perfekt. Ich versende mehrere E-Mails, die von BackgroundRB generiert werden. Ich habe auch noch andere Aufgaben. Denn es ermöglicht sowohl geplante Aufgaben als auch asynchrone Aufgaben (Aufgaben, die länger dauern als der normale Client/Server-Reaktionszyklus).

Ich benutze es und bin sehr zufrieden damit.

1voto

Alex Wayne Punkte 160481

Fügen Sie eine Klassenmethode zu einem Ihrer Modelle hinzu, die dies für Sie übernimmt. Versuchen Sie nun, diese Methode mit dem Runner-Skript auszuführen

./script/runner "MyModel.send_daily_mail" RAILS_ENV=production

Stellen Sie sicher, dass alles einwandfrei funktioniert. Wenn dies der Fall ist, müssen wir den Befehl universell einsetzbar machen, indem wir den Pfad zum Projekt richtig einrichten.

cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production

Wechseln Sie nun in ein beliebiges Verzeichnis und führen Sie den Befehl aus. Wenn er richtig läuft, führen Sie crontab -e und fügen Sie dort den Befehl ein, der täglich um 7 Uhr morgens ausgeführt werden soll. Es gibt eine Menge Erklärungen über das Cron-Format, wenn Sie danach googeln, und es sollte ziemlich einfach sein, es herauszufinden.

0voto

Amit K Mathur Punkte 351

Verwenden Sie einen Rake-Task und einen Cron-Job, wie in der akzeptierten Antwort bereits erwähnt. Beachten Sie jedoch, dass die Aktualisierung der Cron-Datei selbst eine manuelle Aufgabe ist. Das mag in Ordnung sein, wenn Sie sie während der Entwicklung nicht ändern. Andernfalls können Sie Capistrano dies für Sie erledigen lassen: http://push.cx/2008/deploying-crontab-with-your-rails-app

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X