Chris: mail() mit mehreren zusätzlichen Headern

Hallo!

Ich hoffe, jemand kann helfen. Ich habe ein schwerwiegendes Problem mit PHPs mail()-Funktion, sobald ich mehr als einen zusätzlichen Header vergeben möchte. From: alleine funktioniert wie gedacht. Auch der Versand der Mail an mehrere Empfänger, die unter Bcc: eingetragen werden, funktioniert. Sobald ich From: und Bcc: kombinieren möchte, geht das Schlamassel allerdings schon los.

Hier die Schnipsel aus meinem Script. Die Adresse habe ich durch adresse.de ersetzt. Das Script läuft online auf einem 1&1-Server.

$header = "From: user_x@adresse.de/r/n";
$header .= "Bcc: user_1@adresse.de, user_2@adresse.de/r/n";

mail("user_x@adresse.de", "Test! Test! Test!", "Dies ist nur ein Test.", $header);

user_x soll hier die Mail an sich selbst und per Bcc: an user_1 und user_2 senden.

Im PHP-Manual stand, dass es mit /r/n manchmal Ärger geben kann, so dass man dann statt dessen /n verwenden sollte. Das hat aber ebenfalls nicht funktioniert. Ich habe dann alle möglichen Kombinationen durchprobiert. Alles ohne bzw. mit /r/n oder einfach nur /n. Ich habe auch schon die Kommata in der Aufzählung unter Bcc: durch (/r)/n ersetzt. Aber das Resultat ist nahezu immer dasselbe.

Ich habe dann mit dem Thunderbird meine Postfächer überprüft. user_1 und user_2 kriegen nie eine Mail. Nur user_x.

Seltsam fand ich aber auch die Anzeigen des Thunderbird. Demnach ist user_2@adresse.de/r/n der Absender. Wenn ich auf >Antworten< klicke, will er gar an die folgenden Adressen antworten:

user_x"@adresse.de/r/nBcc: user_1@adresse.de
user_2@adresse.de/r/n

Mir scheint, da läuft irgendwas mächtig schief. Wo kommt überhaupt das " hinter user_x her? Und wieso zeigt er die /r/n an?

Was stimmt da nicht? Mir fällt dazu nichts mehr ein.

  1. Moin,

    Problem mit PHPs mail()-Funktion, sobald ich mehr als einen zusätzlichen Header vergeben möchte.

    das wundert mich nicht, wenn ich mir deinen Code-Auszug ansehe. ;-)
    Womit werden die Headerzeilen nochmal getrennt? Ah ja, mit einer Carriage-Return/Linefeed-Kombination. Was hast du stattdessen? Vier harmlose Zeichen. Ein '/', dann ein 'r', noch ein '/' und ein 'n'. Von Steuerzeichen keine Spur.

    Wie werden Steuerzeichen in einem String nochmal maskiert? Ah ja, mit einem vorangestellten Backslash. Wo finde ich den in deinem Beispiel?

    Im PHP-Manual stand, dass es mit /r/n manchmal Ärger geben kann, so dass man dann statt dessen /n verwenden sollte.

    Nein, das steht da ganz sicher nicht. Weder "/r/n" noch "/n" haben irgendeine besondere Bedeutung.

    Ansonsten: Die vorgeschriebene Trennsequenz ist das CR/LF-Pärchen. Da aber manche Systeme automatisch ein LF durch die CR/LF-Kombination ersetzen, führt das in diesem Fall dazu, dass zwei CR auftreten. Das ist aber ungewöhnlich.

    Seltsam fand ich aber auch die Anzeigen des Thunderbird. Demnach ist user_2@adresse.de/r/n der Absender.

    Klar, die vier Zeichen, die du anhängst, interpretiert der natürlich als zum jeweiligen Feldinhalt gehörend.

    user_x"@adresse.de/r/nBcc: user_1@adresse.de

    Sicher. Das Trennzeichen zwischen den beiden Headerzeilen hat ja auch gefehlt.

    Wo kommt überhaupt das " hinter user_x her?

    Das wird mir aus deinen Angaben auch nicht klar. Bist du sicher, dass das nicht *zwei* Anführungszeichen sind?

    Und wieso zeigt er die /r/n an?

    Weil du diese Zeichen angibst.

    So long,
     Martin

    --
    Denken ist wohl die schwerste Arbeit, die es gibt. Deshalb beschäftigen sich auch nur wenige damit.
      (Henry Ford, amerikanischer Industriepionier)
    1. das wundert mich nicht, wenn ich mir deinen Code-Auszug ansehe. ;-)
      Womit werden die Headerzeilen nochmal getrennt? Ah ja, mit einer Carriage-Return/Linefeed-Kombination. Was hast du stattdessen? Vier harmlose Zeichen. Ein '/', dann ein 'r', noch ein '/' und ein 'n'. Von Steuerzeichen keine Spur.

      Wie werden Steuerzeichen in einem String nochmal maskiert? Ah ja, mit einem vorangestellten Backslash. Wo finde ich den in deinem Beispiel?

      Argh! Also hat er das allen Ernstes nicht als CRLF erkannt!? So was in der Art dachte ich mir schon mitunter. Und ich schlage mir damit die halbe Nacht um die Ohren. Der Haken ist nur, dass ich im Internet auf der Suche nach einer Lösung eben zahlreiche Beispiele wie meines gefunden habe. Sonst hätte ich es einfach kopieren können.

      Seltsam fand ich aber auch die Anzeigen des Thunderbird. Demnach ist user_2@adresse.de/r/n der Absender.

      Klar, die vier Zeichen, die du anhängst, interpretiert der natürlich als zum jeweiligen Feldinhalt gehörend.

      Passt dann natürlich. *seufz*

      Wo kommt überhaupt das " hinter user_x her?

      Das wird mir aus deinen Angaben auch nicht klar. Bist du sicher, dass das nicht *zwei* Anführungszeichen sind?

      Ja, das ist in der Tat ein einzelnes Anführungszeichen. Habe es markiert. Ist wirklich ein Zeichen.

      Danke für die rasche Antwort! Ich werde das dann alsbald ausprobieren. Nun brauche ich aber erst mal Schlaf. ;-) Ich melde mich auf jeden Fall wieder.

      1. Da hat es mir vorher doch keine Ruhe gelassen. ;-)

        Ein wenig anders gelöst, aber das klappt nun:

        $crlf = chr(13).chr(10);

        $header = "From: user_x@***.***$crlf";
        $header .= "Bcc: user_1@***.***, user_2@***.***$crlf";

        mail("user_x@***.***", "Test! Test! Test!", "Dies ist nur ein Test.", $header);

        Das zeigt mir nur, dass man manches doch eher überfliegt, wenn man sich nach längerer Zeit wieder einliest und das dann teils Lücken bei den Grundlagen klaffen. Man konzentriert sich dann lieber auf schwierigere Sachen, weil man schnelle Erfolgserlebnisse sucht.

        Ich danke noch mal für die Hilfestellung!

        1. Hallo

          ich würde Dir raten dass du Dir den http://www.swiftmailer.org/ ansiehst wenn du viele Mails versendest und auch html Mails machen wllst.

          Grüße
          --
          http://www.rechtsrat-jetzt.de

          Da hat es mir vorher doch keine Ruhe gelassen. ;-)

          Ein wenig anders gelöst, aber das klappt nun:

          $crlf = chr(13).chr(10);

          $header = "From: user_x@***.***$crlf";
          $header .= "Bcc: user_1@***.***, user_2@***.***$crlf";

          mail("user_x@***.***", "Test! Test! Test!", "Dies ist nur ein Test.", $header);

          Das zeigt mir nur, dass man manches doch eher überfliegt, wenn man sich nach längerer Zeit wieder einliest und das dann teils Lücken bei den Grundlagen klaffen. Man konzentriert sich dann lieber auf schwierigere Sachen, weil man schnelle Erfolgserlebnisse sucht.

          Ich danke noch mal für die Hilfestellung!