SMTP via SwiftMailer in Direct Mail nutzen

Direct Mail hatten wir nie so 100%ig sauber mit SMTP zum Laufen bekommen bzw. blieb stets doch noch irgendwo ein übler Beigeschmack. Daher fieberten wir mit großer Hoffnung der Integration des Swiftmailers als Mail-API in TYPO3 4.5 entgegen, um einen umfangreichen SMTP-Connector im CMS zu haben, auf den dann (hoffentlich) Direct Mail auch aufsetzt, statt auf PEAR odgl.

Nach einigen Tests und Codeinspektionen stand fest, dass Direct Mail derzeit noch nicht auf die neue Mail-API eingestellt ist 🙁 Ein Feature-Request am gestrigen Tage brachte das Ergebnis, dass dies für Version 3.0.0 geplant ist. Um die Wartezeit zu überbrücken, und bereits jetzt mit einfachen Boardmitteln Newsletter via Direct Mail und SMTP versenden zu können, wurde ein kleiner Patch geschrieben. Dieser ergänzt – falls TYPO3 >= 4.5.0 – für die Mail-Queue die Versendeoptionen um  eine Abfrage, ob $GLOBALS[‚TYPO3_CONF_VARS‘][‚MAIL‘][‚transport‘] gesetzt ist. Ist dies der Fall, wird die neue Mail-API zum Versand herangezogen. (Der Test-Versand in Schritt 4 bleibt unberührt.)

Details und Patch:

diff -ruN typo3conf/ext/direct_mail.orig/res/scripts/class.dmailer.php typo3conf/ext/direct_mail/res/scripts/class.dmailer.php
--- typo3conf/ext/direct_mail.orig/res/scripts/class.dmailer.php    2011-02-21 15:55:13.000000000 +0000
+++ typo3conf/ext/direct_mail/res/scripts/class.dmailer.php    2011-02-21 16:29:48.000000000 +0000
@@ -982,8 +982,16 @@
 }
 // Setting defer mode
 $deferMode = $this->useDeferMode ? (($returnPath ? ' ': '') . '-O DeliveryMode=defer') : '';
-
-            if ($this->useSmtp)    {
+
+            if (t3lib_div::int_from_ver(TYPO3_version) >= 4005000 && empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']) === FALSE) {
+                $mail = t3lib_div::makeInstance('t3lib_mail_message');
+                $mail->setFrom(array($this->from_email => $this->from_name))
+                    ->setTo(array($this->recipient))
+                    ->setSubject($this->subject)
+                    ->setBody($this->message)
+                    ->send();
+            }
+            elseif ($this->useSmtp)    {
 $res = $this->mailObject->send($this->recipient, $headers, $this->message);
 }
 elseif(!ini_get('safe_mode') && $this->forceReturnPath) {
@@ -1001,7 +1009,14 @@
 }
 // Sending copy:
 if ($this->recipient_copy)    {
-                if ($this->useSmtp)    {
+                if (t3lib_div::int_from_ver(TYPO3_version) >= 4005000 && empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']) === FALSE) {
+                    $mail = t3lib_div::makeInstance('t3lib_mail_message');
+                    $mail->setFrom(array($this->from_email => $this->from_name))
+                        ->setTo(array($this->recipient_copy))
+                        ->setSubject($this->subject)
+                        ->setBody($this->message)
+                        ->send();
+                } elseif ($this->useSmtp)    {
 $res = $this->mailObject->send($this->recipient_copy, $headers, $this->message);
 } elseif (!ini_get('safe_mode') && $this->forceReturnPath) {
 mail($this->recipient_copy,
@@ -1020,7 +1035,14 @@
 if ($this->auto_respond_msg)    {
 $theParts = explode('/',$this->auto_respond_msg,2);
 $theParts[1] = str_replace("/",chr(10),$theParts[1]);
-                if ($this->useSmtp)    {
+                if (t3lib_div::int_from_ver(TYPO3_version) >= 4005000 && empty($GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport']) === FALSE) {
+                    $mail = t3lib_div::makeInstance('t3lib_mail_message');
+                    $mail->setFrom(array($this->recipient))
+                        ->setTo(array($this->from_email => $this->from_name))
+                        ->setSubject($theParts[0])
+                        ->setBody($theParts[1])
+                        ->send();
+                }    elseif ($this->useSmtp)    {
 $headers['Subject'] = $theParts[0];
 $headers['From'] = $this->recipient;
 $res = $this->mailObject->send($this->from_email, $headers, $theParts[1]);

Quellen:

Update 2012-02-08

Auf Forge wurde zum Patch angemerkt, dass dieser nicht funktioniert, wenn Binärdaten (Bilder, Anhänge) im Newsletter enthalten sind. Dies muss ich leider bestätigen.
Dafür wurde zwischenzeitlich die Zielversion für die Unterstützung der Mail-API auf 2.8 heruntergesetzt…

Bis der Umbau fertig ist, könnte dem ein oder anderen vielleicht trotzdem ein verbesserter Patch helfen. Dieser berücksichtigt nun die Einstellung für inlineMedia und greift nur, wenn Bilder nicht eingebettet werden.

Update 2012-04-07

Durch eine Kundenanforderung konnte/musste auch die Behandlung von Attachments umgebaut werden, damit sie zusammen mit dem Swiftmailer funktioniert.
Der Versand von „nur HTML“-Newslettern ist jetzt auch wieder funktionstüchtig. Hier wurden durch einen Fehler im bisherigen Patch nur inhaltsleere Mails versichickt.