Mails werden nicht verschickt - eine Komfortfunktion ist die Ursache

Im randshop kommt es bei bestimmten Konstellationen des Servers dazu, dass Mails nicht mehr versandt werden. Oft ist eine Ursache nicht auszumachen, Fehlermeldungen werden nicht angezeigt, Logfiles bestätigen eigentlich den Versand, die Mails konmmen aber nicht an.
Betroffen davon sind typischerweise die Bestellbestätigung, die an den Shopbetreiber geht, die über das Kontaktformular an den Shopbetreiber versandte Mail und Bewertungsmails, die nach Abgabe einer Bewertung an den Shopbetreiber verschickt werden.
Alle diese Mails haben eine Gemeinsamkeit: Immer wird als Absender der Kunde eingetragen.
Rein technisch gesehen ist das nicht richtig, schließlich ist der Absender ja tatsächlich der Shopbetreiber mit seiner Shopsoftware. Er ist halt gleichzeitig auch der Empfänger.
Der randshop-Entwickler hatte den Komfort des Shopbetreibers im Blick. Ist der Kunde der Absender der Mail, kann der Shopbetreiber durch Klick auf Antworten in seinem Mailprogramm dem Kunden direkt antworten.
Allerdings erlauben immer wieder Provider es nicht mehr, dass Mails mit falschem Absender verschickt werden.
Zudem können solche Mails auch in Spamfiltern hängen bleiben, was die Kommunikation mit dem Kunden auch nicht gerade erleichtert. Betroffen sind davon alle randshop Versionen bis 2.4.
Die Lösung dieses Problem besteht im korrekten Verwenden des From-Feldes, hier muss der Shopbetreiber eingetragen werden. Die komfortable Antworten-Funktion erfolgt über das Füllen des ReplyTo-Feldes der Mail. Hier wird richtigerweise die Kundenmailadresse eingetragen.
Und schon flutscht das Ganze wieder :-).

Lösungen im randshop Forum

Im randshop-Forum sind in den folgenden Beiträgen Lösungen gepostet:

Hilfe ! Mein Shop sendet keine Emails mehr

Keine Bestellbestätigung

eigene Emailadresse statt Kundenemailadresse

Und hier die Lösungen in der Zusammenfassung

Bestellbestätigung für den Shopbetreiber anpassen (Randshop 2.3)

In der Datei /includes/functions.mail.inc.php ist so um die Zeile 616 folgender Code:

} elseif($MailTemplateBereich == 3) {
      
      ... 7 uninteressante Zeilen

      $Mail->setFrom($KundenObject->email);   //die entscheidende Zeile, hier wird die KundenEmailAdresse in das From gesetzt

      $Result = $Mail->send(array($ShopeinstellungObject->email));

Anpassen, dass es so aussieht:

//$Mail->setFrom($KundenObject->email);
      $Mail->setFrom($ShopeinstellungObject->email);
      $Mail->setHeader('Reply-To',$KundenObject->email); // setzt die Antwort-An-Adresse auf die KundenMailAdresse

Kontaktformular anpassen (Randshop 2.3)

In der /themes/kontakt/index.php ist in der Zeile 75 der Aufruf der PHP-Funktion mail, auch dort wird als From-Header die Email-Adresse des Kunden angegeben. Allerdings wird hier sogar schon der Reply-To-Header richtig gefüllt.
Die Zeile sieht so aus (alles eine Zeile, wird nur hier umgebrochen):

$e_mail = mail($rowAll->email, $rowAll->firmen_titel . " " . $_POST["betreff"], $mailText, "From: ".$_POST["formEmail"]."\nReply-To: ".$_POST["formEmail"] ."\nContent-Type: text/plain; charset=".CHARSET);

Hier könnte man es sich einfach machen und und nur das "From: ".$_POST["formEmail"] nach "From: ".$rowAll->email ändern. Das funktioniert, hat nur den Nachteil, dass, wenn der Versand über SMTP laufen soll, es eben nicht mehr funktioniert. Darum hier gleich so umbauen:

//$e_mail = mail($rowAll->email,$rowAll->firmen_titel . " " . $_POST["betreff"], $mailText, "From: ".$_POST["formEmail"]."\nReply-To: ".$_POST["formEmail"] ."\nContent-Type: text/plain; charset=".CHARSET);

            $Mail = new htmlMimeMail();
            $Mail->setTextCharset(CHARSET);
            $Mail->setHeadCharset(CHARSET);

            $Mail->setSubject($rowAll->firmen_titel . " " . $_POST["betreff"]);
            $Mail->setText($mailText);

            $Mail->setFrom($rowAll->email);
            $Mail->setHeader('Reply-To',$_POST["formEmail"]);

            $Mail->send(array($rowAll->email));

Jetzt funktioniert der Mailversand wieder und bietet bei beiden Mails den Komfort, dass zum Beantworten nur auf Antworten geklickt werden muss.

Bewertungsformular anpassen (Randshop 2.3)

Das Bwewertungsformular hat das gleiche Problem, kann aber auch leicht geändert werden.

Dazu in /includes/functions.mail.inc.php etwa in Zeile 694 diese Zeile suchen

$Mail->setFrom($KundenObject->email);

und durch diesen Code ersetzen:

//$Mail->setFrom($KundenObject->email);
          $Mail->setFrom($ShopeinstellungObject->email);
          $Mail->setHeader('Reply-To',$KundenObject->email); // setzt die Antwort-An-Adresse auf die KundenMailAdresse

Jetzt kann auch die Bewertungsmail des Kunden direkt beantwortet werden. Find ich fein Lächelnd

Bestellbestätigung für den Shopbetreiber anpassen (Randshop 2.4)

Mit dem randshop 2.4 wurde die Komfortfunktion zwar entfernt, damit der Mailversand auch bei dem jetzt einstellbaren Versand über SMTP funktioniert. Es lässt sich aber auch hier die ReplyTo-adresse verwenden und die Komfortfunktion wieder einbauen. Ich mags einfach nicht, wenn sowas rausfallen sollte  Lächelnd

In der /includes/functions.mail.inc.php bei Zeile 687 den Code folgendermassen anpassen, es wird die ReplyTo Adresse (die Mailadresse des Kunden) als Antwort-Adresse zugefügt und als Absender der Shopbetreiber eingetragen.

} elseif($MailTemplateBereich == 3) {
        ......
        $Mail->setFrom($ShopeinstellungObject->email);
        $Mail->addAddress($ShopeinstellungObject->email);
        $Mail->addReplyTo($KundenObject->email); //diese Zeile ist die neue!!
        $Result = $Mail->send();

Kontaktformular anpassen (Randshop 2.4)

Das Kontaktformular im randshop 2.4 hat gleich zwei Schwächen:

  • durch die schon beschriebene Kundenadresse als Absenderadresse kann es bei bestimmten Servereinstellungen nicht versandt werden
  • soll der Mailversand über SMTP erfolgen, dafür gibt es seit 2.4 eine Einstellung im admin, dann wird das Kontaktformular dabei nicht berücksichtigt. Der Versand dürfte dann auch fehlschlagen.

Aber natürlich lassen sich beide Schwächen beseitigen, sogar in einem Aufwasch Lächelnd.

Dazu müssen nur die folgenden drei Änderungen vorgenommen werden:

In /includes/functions.mail.inc.php wird eine neue Funktion für den Kontaktmailversand erstellt. Dazu habe ich etwa in Zeile 1330 den folgenden Code eingefügt:

function SendMailKontakt( $KontaktName, $KontaktFirma, $KontaktTelefon, $KontaktFax, $KontaktEMail, $KontaktBetreff, $KontaktText){

    $ShopeinstellungenObject = GetShopeinstellungDetail();

    $Mail = getMailerObj();
    $Mail->CharSet = CHARSET;

    $Mail->Subject = $ShopeinstellungenObject->firmen_titel . " - Anfrage zum Thema " . $KontaktBetreff;

    $Mail->isHTML(false); //soll eine Textmail sein
    $mailText = "Anfrage zum Thema " . $KontaktBetreff . "\n\nName: " . $KontaktName . "\nFirma:" . $KontaktFirma . "\nTelefon:" . $KontaktTelefon . "\nFax: " . $KontaktFax . "\nE-Mail: " . $KontaktEMail . "\n\n" . $KontaktText;

    $Mail->Body = $mailText;

    $Mail->setFrom($ShopeinstellungenObject->email);
    $Mail->addAddress($ShopeinstellungenObject->email);
    $Mail->addReplyTo($KontaktEMail, $KontaktName);

    $Mail->send();

}

In der /themes/kontakt/index.php muss bei den includes ganz am Anfang der Seite die /includes/function.mail.inc.php eingebunden werden. Dazu nach den Zeilen, die die functions.shopeinstellung.inc.php und securimage.php einbinden, die folgende Zeile einfügen:

include_once(DATEIPFAD . "includes/functions.mail.inc.php");

Jetzt kann der bisherige Aufruf der mail-Funktion auskommentiert und durch den Aufruf der neuen Komtaktmailfunktion ersetzt werden. Sieht etwa in Zeile 89 so aus:

} else {
      //$mailText = "Anfrage zum Thema ...
      //$e_mail = mail($rowAll->email...
      
      SendMailKontakt($_POST["name"],$_POST["firma"],$_POST["tel"],$_POST["fax"],$_POST["formEmail"],$_POST["betreff"],$_POST["nachricht"]);

  }

Damit funktioniert der Versand der Kontaktmail auf Servern mit erhöhten Sicherheitseinstellungen, bei der Umstellung auf SMTP und bietet dem Shopbetreiber den Komfort, dass er diese Kontaktmail direkt beantworten kann.

Ist doch eine schöne Lösung, oder?

Feedback oder Anregungen?

Wie immer, interessiert mich natürlich, ob diese Anleitung verständlich und hilfreich ist.

Schreiben Sie mir einfach im Kommentar, wenn noch nicht alle Fragen beantwortet wurden.

Übrigens erhalten Sie, wenn Sie die Adresse Ihrer Webseite angeben, einen Link zu Ihrer Webseite. Ist vielleicht für SEO ganz interessant ;-)

Vielen Dank!

Kommentar abgeben:

Kommentare:

Kommentar von Winfried Rothenberg |

Wunderbare Anleitung. Hatte ich völlig vergessen und bei meinem monatelangen Umbau auf 2.4 irgendwie untergegangen. Jetzt geht's wieder und Dank dieser Anleitung brauchte ich mir keinen großen Kopf zu machen.
Als kleiner Tipp am Rande, auch ein falscher Servername, wenn man denn einen selbstverwalteten hat, sorgt dafür, das Mails zu GMX und WEB.de gar nicht erst versendet werden. Die machen nämlich eine Reverse DNS Überprüfung und wenn dann dort ein anderer Name auftaucht, bleiben die Mails in der Warteschlange auf dem eigenen Server....und zwar bis zum St. Nimmerleinstag.

Kommentar von Susanne Kasten |

Vielen Dank für deine Anleitung! Ich bin fassungslos, dass dieser Bug 2020 noch immer existiert beim Versand via SMTP.

Gilt übrigens auch für das Widerrufsformular.

in /themes/topnavi/widerruf.php den Part mit mail(…) ersetzen durch:
SendMailWiderruf( $_POST["artikel"], $_POST["bestellt"], $_POST["erhalten"], $_POST["verbraucheranschrift"], $_POST["formEmail"]);
SendMailWiderrufBestaetigung( $_POST["formEmail"]);

In /includes/functions.mail.inc.php ergänzen:
function SendMailWiderruf( $WiderrufArtikel, $WiderrufBestellt, $WiderrufErhalten, $WiderrufVerbraucheranschrift, $WiderrufEMail){

$ShopeinstellungenObject = GetShopeinstellungDetail();

$Mail = getMailerObj();
$Mail->CharSet = CHARSET;

$Mail->Subject = $ShopeinstellungenObject->firmen_titel . " - Widerrufsformular einer Bestellung";

$Mail->isHTML(false); //soll eine Textmail sein

$mailText = "Widerruf einer Bestellung

Artikel: " . $WiderrufArtikel . "
bestellt am: " . $WiderrufBestellt . "
erhalten am: " . $WiderrufErhalten . "
Anschrift: " . $WiderrufVerbraucheranschrift . "
E-Mail: " . $WiderrufEMail . "

";

$Mail->Body = $mailText;

$Mail->setFrom($ShopeinstellungenObject->email);
$Mail->addAddress($ShopeinstellungenObject->email);

$Mail->send();

}

function SendMailWiderrufBestaetigung( $WiderrufEMail){

$ShopeinstellungenObject = GetShopeinstellungDetail();

$Mail = getMailerObj();
$Mail->CharSet = CHARSET;

$Mail->Subject = $ShopeinstellungenObject->firmen_titel . " - Bestaetigung des Widerrufs";

$Mail->isHTML(false); //soll eine Textmail sein

$mailTextBestaetigung = "Bestaetigung des Widerrufs,

Vielen Dank, wir haben Ihren Widerruf als E-Mail erhalten.

";

$Mail->Body = $mailTextBestaetigung;

$Mail->setFrom($ShopeinstellungenObject->email);
$Mail->addAddress($WiderrufEMail);

$Mail->send();

}

Geht sicher auch eleganter, aber es tut's.