Wie würde ich in Ruby on Rails 48 Stunden nach der Anmeldung eine E-Mail an einen Benutzer senden? Danke!
Wie Joseph Daigle bereits erwähnt hat, müssen Sie das genaue Datum und die Uhrzeit, zu der sich der Benutzer registriert hat, aufzeichnen. Danach brauchen Sie einen Cron, der jede bestimmte Anzahl von Minuten (jede Stunde zum Beispiel) läuft, um zu sehen, ob es neue Benutzer gibt, deren Registrierungszeit länger als 48 Stunden ist. Senden Sie eine E-Mail an diesen Benutzer und markieren Sie diesen Benutzer als bereits per E-Mail , damit Sie sie nicht erneut per E-Mail versenden.
Wie bei der eigentlichen E-Mail-Sendung, lesen Sie die folgende Dokumentationsseite: Ссылка
Es hat alles, was Sie wissen müssen, um E-Mails mit RoR zu senden.
Ich empfehle, dass Sie die neueste Version von BackgrounDRb verwenden, um damit umzugehen. Sie können über BackgrounDRb hier lesen: Ссылка
Um eine Nachricht für die spätere Zustellung in die Warteschlange zu stellen, könnte der BackgrounDRb-Client-Code (im Callback Ihres after_create möglicherweise in Ihrem Anwendungsmodell) etwa so aussehen:
%Vor%Sie müssen einen BackgrounDRb-Mitarbeiter erstellen, der die E-Mail versendet:
%Vor%Beachten Sie, dass Sie, um BackgrounDRb auf diese Weise zu verwenden, permanente Jobwarteschlangen verwenden müssen. Stellen Sie daher sicher, dass Sie die in BackgrounDRb enthaltene Migration ausführen, um die Persistenztabelle in Ihrer Anwendung einzurichten.
BackgrounDRb wird separat von Rails (mongrel, apache, etc) mit 'script / backgroundrb start' gestartet, also stellen Sie sicher, dass Sie den Daemon zu jeder Prozessüberwachung hinzufügen, die Sie verwenden (Gott, Monit, etc) oder Sie Erstellen Sie ein /etc/init.d Skript dafür.
Zuerst werden Sie einen laufenden Daemon oder Hintergrunddienst benötigen, der Ihre Warteschlange (wahrscheinlich aus einer Datenbank) alle paar Minuten abfragen kann.
Der Algorithmus ist ziemlich einfach. Notieren Sie sich die Uhrzeit des Benutzerereignisses in der Warteschlange. Wenn der Daemon das Element in der Warteschlange überprüft und der Zeitunterschied mehr als 48 Stunden beträgt, bereiten Sie die zu sendende E-Mail vor.
Sie können Jobs mit einer Verzögerung mithilfe der asynchronen Überwachung in die Warteschlange stellen. Idealerweise sollte alles, was Sie haben, von dem man weiß, dass es nicht ständig (oder sehr nahe) ist, die ganze Zeit durchgehen.
Ich habe ein Plugin namens acts_as_scheduled geschrieben, das Ihnen vielleicht weiterhelfen kann.
>Mitacts_as_scheduled können Sie verwalten geplante Ereignisse für Ihre Modelle.
Ein gutes Beispiel dafür ist die Zeitplanung das Update von RSS-Feeds in einem Hintergrundprozess mit Cron oder HintergrundRB.
Mit acts_as_scheduled Ihr Zeitplan Manager kann einfach anrufen "Model.find_next_scheduled ()" zu greifen das nächste Element aus der Datenbank.
Wie würde ich das erreichen, indem ich einen Planungs-Controller erstelle, der die Datenbank nach next_schedule fragt und dann einen Mailer benutzt, um die Nachricht zu senden. Sie haben einen Cron-Job eingerichtet, um den Controller regelmäßig mit WGET oder CURL aufzurufen. Der Vorteil des Cron / Controller-Ansatzes besteht darin, dass auf dem Server keine weitere Infrastruktur oder Konfiguration erforderlich ist und Sie komplizierten Threading-Code vermeiden.
Ich denke, ich würde geneigt sein, die Notwendigkeit für die E-Mail und die früheste Zeit, nach der es gesendet werden sollte, irgendwo getrennt zu speichern, dann muss meine Dinge-zu-tun-Aufgabe darauf schauen. Auf diese Weise muss ich nur so viele Datensätze verarbeiten, wie E-Mails gesendet werden, anstatt jeden Benutzer jedes Mal zu untersuchen, was entweder langweilig wird oder einen ansonsten wahrscheinlich unnötigen Index erfordert. Als ein Bonus, wenn ich andere Aufgaben hätte, die auf irgendeine Art von überarbeiteter Basis durchgeführt werden müssten, wäre das gleiche Konstrukt mit wenig Modifikation nützlich.
Tags und Links ruby ruby-on-rails