Tech 22. Feb. 2007

TYPO3: Schwerer Bug in Direct Mail

Direct Mail (direct_mail) funktioniert beim Newsletterversand bekanntlich etwas speziell. So ist es üblich einen Newsletter zu erstellen und einzelne Inhaltelemente verschiedenen Newsletterkategorien (dmail_category) zuzuordnen. Durch dieses Prinzip ist es möglich, beispielsweise einen monatlichen Newsletter an alle Abonnenten zu versenden und trotzdem die Inhalte auf die jeweiligen Empfänger zuzuschneiden. So weit so gut.

Nutzt man nun diese Herangehensweise für den Newsletterversand und erstellt trotzdem sehr spezifische Newsletter für nur eine oder einige wenige Abonnenten, kann es vorkommen, dass einige Personen diesen Newsletter gar nicht erhalten. Und das ist auch richtig so, weil diese ja sonst eine leere E-Mail erhalten würden.

Problematisch ist jedoch der Algorithmus zum Versand in dem Modul mod/class.dmailer.php. Hier wird immer eine bestimmte Anzahl an E-Mails auf einmal verarbeitet (in den Standardeinstellungen 50), bevor der Versand fortgesetzt wird. Als Offset für diese 50 E-Mails wird die letzte E-Mail aus dem Maillog verwendet. D. h. der Versand wird immer beim ersten Empfänger nach der zuletzt versandten E-Mail wieder begonnen.

Bei der Iteration durch die 50 Empfänger werden jedoch alle Einträge hochgezählt. Sind nun alle Newsletter der 50 Empfänger ab dem gegebenen Offset leer, stoppt der Versand und beginnt wieder an der gleichen Stelle. D. h. er wird nie fortgeführt.

Hier ist der folgende Bugfix nötig. In der Funktion dmailer_masssend_list($query_info,$mid) muss in der While-Schleife

while($recipRow = $TYPO3_DB->sql_fetch_assoc($res)) 

das Hochzählen von $ct und $c mit einer Kondition versehen werden.

if($myRC){
	$ct++;
	$c++;
}

So wird das 50er Intervall nur erreicht, wenn tatsächlich 50 E-Mails versandt wurden.

Dieser Bug hat mich und Oliver einge Stunden intensives Debugging gekostet, aber gut - jetzt funktioniert alles.