Sonstiges

Mail PHP-Prob

evtl. kann jemand den „Fehler“ entdecken, der sich mit PHP auskennt. Worum geht es? Es soll eine stinknormale Mail per PHP Funktion verschickt werden. Es handelt sich dabei um eine Textmail und in der jetzigen Testversion um eine HTML-Mail. Was passiert, was an sich faul ist?

Textmail kommt an und im Mailbody sollte das eigentlich stehen:
Sehr geehrte Damen und Herren blabla…
also eigentlich simpel, aber:

Effektiv kommt aber das an:
Message-ID: (ein ID String)
Date: (ein Zeitstempel CEST)

Sehr geehrte Damen und Herren blabla…

Sprich, die Message-ID und das Datum nerven. Das passiert in der Textmailversion, aber nicht bei allen Mailclients. Bei GMail und Thunderbird taucht das so auf, bei Outlook und Web.de zB nicht…murks 🙁

Beim HTML Mail taucht das am Anfang des Mailtextes auf:
Content-Transfer-Encoding: 8bit From: xyz@domain.de, xyz2@domain.de, xyz3@domain.de, Vorname Name Reply-To: xyz@domain.de, xyz2@domain.de, xyz3@domain.de, Vorname Name Message-Id: Date: Tue, 23 May 2006 14:07:53 +0200 X-UIDL: M8+“!“A_!!-gp!!Ud=“!
und dann kommt erst „Sehr geehrte…

Wie sieht das Skript aus?
Mailbug.txt

Hat jemand eine Idee, was hier falsch läuft oder wie man den Fehler eingrenzen soll?

Über den Autor

Robert Basic

Robert Basic ist Namensgeber und Gründer von BASIC thinking und hat die Seite 2009 abgegeben. Von 2004 bis 2009 hat er über 12.000 Artikel hier veröffentlicht.

4 Kommentare

  • Der Fehler steckt wahrscheinlich in der Variable „$reply“. In Deinem Code wird der Mailheader zusammengebastelt:

    […]
    $headers.= „Reply-To:“.$reply.“rn“;
    $headers.=“Message-Id: rn“;
    […]

    Ich nehme an, dass _in der Variable $reply_ schon ein Zeilenende drin ist. Das Skript hängt nochmal eine Leerzeile an.

    Diese Leerzeile ist beim Mailtransfer das Zeichen dass der Header aufhört und der Nachrichtentext beginnt.

    Lösungsvorschläge:
    1. Obiges Schnipsel ändern in:
    […]
    $headers.= „Reply-To:“.$reply;
    $headers.=“Message-Id: rn“;
    […]
    Das ist jedoch problematisch, wenn im Laufe der Entwicklung die Variablenzuweisung geändert wird und das Zeilenende „verschwindet“.

    2. Das Zeilenende aus $reply entfernen. Bei Perl gibt es dafür die Funktion chomp(), die ein Newline am Ende eines Strings entfernt, ansonsten (also wenn der String nicht auf ein Newline endet) diesen aber unverändert lässt.

    Diese Möglichkeit ist die beste, und sollte auf alle Variablen angewendet werden, aus denen der Mailheader gebastelt wird.

    3. (Keine richtige Lösung): Reply-To als letzte Zeile in den Header einfügen. Dann ist da aber immer noch eine Leerzeile zuviel. Der Bug ist nicht weg, er ist nur schwerer sichtbar.

    Hoffe das hilft,

    Stefan

  • ahh… kleine Ursache, große Wirkung. Hört sich plausibel an. Ich check das. Wenns passt, werde ich mir mal Dein Impressum reinziehen wegen Empfängeradresse für eine kleine Warensendung 😉

  • zu 2: Müßte bei PHP das sein:

    trim

    (PHP 3, PHP 4, PHP 5)
    trim — Entfernt Whitespaces (oder andere Zeichen) am Anfang und Ende eines Strings
    Beschreibung
    string trim ( string str [, string charlist] )

    Die Funktion entfernt Whitespaces an Anfang und Ende von str und gibt den String dann zurück. Ohne Verwendung des zweiten Parameters entfernt trim() folgende Zeichen:

    *

    “ “ (ASCII 32 (0x20)), ein normales Leerzeichen.
    *

    „t“ (ASCII 9 (0x09)), ein Tabulatorzeichen.
    *

    „n“ (ASCII 10 (0x0A)), einen Zeilenvorschub (Line Feed).
    *

    „r“ (ASCII 13 (0x0D)), ein Wagenrücklaufzeichen (Carriage Return).
    *

    „“ (ASCII 0 (0x00)), das NUL-Byte.
    *

    „x0B“ (ASCII 11 (0x0B)), ein vertikaler Tabulator.

    aus dem PHP-Handbuch

  • Kleine Ergänzung zu Stefan Waidele jun. Hinweis:
    Wie auch in einem Kommentar zur mail()-Funktion geschrieben ist das auch eine „gute“ Methode Spam zu verbreiten (vgl. deinen Hinweis zu WP Contactform 😉 )
    Daher würde ich dir auch zu (einer erweiterten) zweiten Methode raten, und zwar nicht nur bei $reply sondern auch bei allen anderen Variablen, die du zum Header zusammenbauen verwendest, also z. B. $from.
    In PHP lautet die Funktion dazu trim() wie Jens bereits zitiert und nicht wie bei PERL chomp, das hat in PHP andere Bedeutungen
    Die Zeile sollte dann z. B. so aussehen:
    $headers.= „Reply-To:“.trim($reply).“rn“;

    Man sollte dabei allerdings beachten, dass dabei wirklich nur rn am Anfang und am Ende entfernt werden. Nicht in der Mitte! Wenn die Variabeln aus einem Formular kommen, muss man die also trotzdem noch anderweitig prüfen.
    $reply = str_replace(„rn“, „“, $reply);
    Wäre da dann vermutlich ein guter Anfang…