PHPlist: Mailversand drosseln bei Beschränkungen durch den Provider

PHPlist: Mailversand drosseln bei Beschränkungen durch den Provider

Viele Anbieter von Webspace drosseln die Zahl der E-Mails, die innerhalb einer bestimmten Zeitspanne versendet werden dürfen. Kürzlich hatten wir eine Supportanfrage, bei der der Hoster des Kunden nur 450 E-Mails pro Stunde erlaubte. Da Newsletter aber an mehrere tausend Empfänger versendet werden sollten, sorgten die Standardeinstellungen dafür, dass nach knapp 450 E-Mails alle weiteren Sendversuche blockiert wurden und die Mails mit einer Fehlermeldung zurückkamen.

Erst nachdem ein neues Zeitintervall angefangen hatte, konnten wieder Mails versendet werden. Die Ursache lag in den Einstellungen für die Drosselung des Mailversandes in PHPlist.  Im Folgenden beschreiben wir, wie man Probleme damit vermeidet.

Es gibt in der config.php drei Parameter, mit deren Hilfe man den zeitlichen Ablauf des Versandes durch PHPlist steuern kann. Diese finden sich ca. ab Zeile 330 und heißen (hier mit ihren Default-Werten):

define("MAILQUEUE_BATCH_SIZE",0);
define("MAILQUEUE_BATCH_PERIOD",100);
define('MAILQUEUE_THROTTLE',0);

Um hier die richtigen Einstellungen zu finden, muss man zunächst entscheiden, ob der Versand via Kommandozeile und Cron-Job erfolgen soll (Fall 1), oder ob PHPlist ihn direkt über den Browser durchführt (Fall 2).

Im ersten Fall wird PHPlist z.B. alle 5 Minuten durch einen Cron-Job aufgerufen. In unserem Beispiel mit einem Limit von 450 Mails pro Stunde würde die Konfiguration dann so aussehen:

define("MAILQUEUE_BATCH_SIZE",420);
define("MAILQUEUE_BATCH_PERIOD",3600);
define('MAILQUEUE_THROTTLE',0);

Die Batch-Size nutzt hier nicht die vollen 450 Mails aus, da es ja vorkommen kann, dass noch weitere Mails versendet werden – durch andere Programme oder auch durch PHPlist selber (z.B. Systemnachrichten). Daher nehmen wir hier einen Sicherheitsabschlag vor. Die Batch-Period setzen wir auf 3600 Sekunden (= 1 Stunde). Bei jedem Aufruf via Cron prüft PHPlist nun, ob das Limit (= die Batch-Size) bereits erreicht wurde, bzw. ob eine neue Periode angefangen hat. Dementsprechend werden dann neue Mails gesendet, bzw. es wird gewartet.

Fall 2 ist etwas schwieriger. Da hier der Versand über den Browser erfolgen soll, muss dieser in periodischen Zeitabständen die PHPlist-Seite neu laden. Das wird aber in der Regel mit den obigen Einstellungen nicht funktionieren, da zwar die ersten 420 Mails sehr schnell gesendet werden, aber die Wartezeit von einer Stunde dazu führt, dass bei der Ausführung von PHPlist die Zeitbegrenzung für PHP-Skripte den erneuten Aufruf verhindert. D.h. die Batch-Period muss kleiner sein und die Zahl der innerhalb dieser Periode versendeten Mails muss verringert werden. Unter Umständen empfiehlt es sich auch, eine kleine Verzögerung zwischen den Versand der einzelnen Mails einzubauen. Hierfür dient der Throttle-Wert. Die Angabe erfolgt ebenfalls in Sekunden, wobei auch Bruchteile möglich sind, z.B. "0.5" für eine halbe Sekunde (Achtung: Der Wert muss mit einem Punkt geschrieben werden, nicht wie in Deutschland üblich mit Dezimalkomma!).

Für unser Beispiel könnte die Konfiguration dann so aussehen:

define("MAILQUEUE_BATCH_SIZE",4);
define("MAILQUEUE_BATCH_PERIOD",33);
define('MAILQUEUE_THROTTLE',0.5);

Mit diesen Einstellungen sendet PHPlist nun vier Mails mit einem Abstand von einer halben Sekunde. Anschließend wird gewartet bis die Batch-Period von 33 Sekunden abgelaufen ist und die nächsten vier Mails werden gesendet. Damit vermeidet man ein Timeout des PHP-Skriptes. Innerhalb der vom Hoster gesetzten Zeitspanne von einer Stunde werden nun ca. 109 Sendevorgänge mit jeweils 4 Mails durchgeführt. Wir können also 436 Mails pro Stunde versenden.

Auf diese Weise vermeidet man übrigens noch ein weiteres Problem, das auf der Empfängerseite liegt: Große Anbieter von Maildiensten wie Yahoo, Googlemail oder Hotmail stufen einen Absender unter Umständen als Spammer ein, wenn sie innerhalb kurzer Zeit sehr viele E-Mails von ihm erhalten, die an Empfänger in ihrer Domain gehen!

Ach ja, noch ein wichtiger Punkt: Wenn man den Mailversand über den Browser laufen lässt, darf man diesen natürlich nicht beenden und sich nicht aus PHPlist ausloggen.