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.

2 Antworten to “SMTP via SwiftMailer in Direct Mail nutzen”

  1. avatar

    Danke für den Patch Julian!

    Ein Benutzer hatte monatelang Direct Mail mit SMTP im Einsatz. Alles was dazu notwendig war, war PEAR::Mail zu installieren und die Einstellungen in der Extension zu setzen (Host, Benutzername, Kennwort, …).

    Irgendwann seit Anfang März schlug der Versand dann fehl und Direct Mail versuchte immer über lokal (mit PHP mail()?) zu versenden.

    Weißt du zufällig, woran das gelegen haben könnte? Die Ext selbst war bis heute unverändert auf Version 2.6.7.

  2. avatar

    Freut mich, wenn Dir der Patch eine Hilfe ist.

    Was PEAR::Mail angeht kann ich Dir leider nicht helfen bzw. Fragen beantworten. Wir hatten uns vor paar Jahren sowohl in der Firma als auch der Würzburger TYPO3 Usergroup mal mit SMTP-Versand und (damaligem) Directmail befasst, kamen aber eben nie auf einen grünen Zweig. Seitdem gab es dann keine neuen Versuche bzw. keine weitere Beobachtung.

Schreibe einen Kommentar