Hi,
ich arbeite momentan an einen Newsletter und bin am überlegen, wie ich den Sendeprozess am besten abwickeln kann. Verwendet werden Swiftmailer und ein paar Symfony Komponenten (u.a. Console). Meine bisheriges (grobes) Konzept:
Sind meine Überlegungen korrekt bzw. habe ich etwas Wichtiges ausgelassen?
Grüße
ich arbeite momentan an einen Newsletter und bin am überlegen, wie ich den Sendeprozess am besten abwickeln kann. Verwendet werden Swiftmailer und ein paar Symfony Komponenten (u.a. Console). Meine bisheriges (grobes) Konzept:
- Beim versenden einer Nachricht werden die Empfänger / Abonnenten in eine separate DB-Tabelle "Queue" eingetragen.
- Der Newsletter-Admin kann unter den Einstellungen die Batch-Größe (Anzahl der zu versendenen Mails pro Batch) festlegen sowie die Art und Weise wie die Queue abgewickelt werden soll - entweder mittels "Remote cron jobs" (z.B. cron-job.org) oder mittels Cron job + Symfony Console Command. Im ersten Fall wäre zusätzlich ein API-Sclüssel zu definieren, mit welchem dann in Verbindung einer URL wie z.B. http://example.tld/newsletter/queue/<api-key> der Queue-Prozess gestartet werden kann.
- Egal welche Einstellung man nun trifft, in beiden Fällen wird mittels flock() (LOCK_EX | LOCK_NB) eine Kollision von Cron jobs und dadurch das mehrfache Versenden der selben Mail an einen Abonnenten vermieden.
- Immer wenn der Job ausgeführt wird, werden der Batch-Größe entsprechend viele Empfänger aus der Queue-Tabelle abgefragt. In einer Schleife wird dann mittels Swiftmailer und Decorator Plugin für jeden Empfänger eine personalisierte Mail generiert, versendet und der Empfänger aus der Queue Tabelle entfernt. Zudem wird mittels Anti-Flood-Plugin ein SMTP-Reconnect sichergestellt, sobald die maximale Anzahl an gesendeten Mails pro SMTP-Verbindung erreicht wurde. Auf das Throttler-Plugin kann ich wohl verzichten, da dessen Aufgabe ja mittels dem Zeitintervall des Cron jobs erledligt wird?!
Sind meine Überlegungen korrekt bzw. habe ich etwas Wichtiges ausgelassen?
Grüße
Kommentar