Gustav Gans: utf-8 Mails mit php versenden

Hallo Forum!

Mir ist aufgefallen, daß eine über php versendete Mail nicht utf-8 codiert versendet wird bzw. nicht als solche ankommt.

Ich habe folgenden php-Code zum Versenden einer Mail:

  
$empfaenger=$usermail;  
$betreff="Bitte bestätigen Sie Ihre Registrierung";  
$text="Hallo ".$username."!\r\rBitte bestätigen Sie Ihre Regisitrierung!"  
mail($empfaenger,$betreff,$text,"From:Max Mustermann <contact@example.com>", "-fbcontact@example.com");  

Das -fbcontact@example.com (in Wirklichkeit eine gmx-Adresse) muß ich machen, weil sonst gmx die Mail über meinen Mailserver nicht annimmt. Jedenfalls führt das dann zu folgender angekommener Mail:

Betreff: Bitte bestätigen Sie Ihre Registrierung
Mail: Hallo ... ! Bitte bestätigen Sie Ihre Registrierung!

Offenbar ist also die Mail nicht, so wie die php-Seite und alles andere bei mir, utf-8 codiert. Ich habe dazu jetzt im Internet folgende Lösung gefunden:

  
$empfaenger=$usermail;  
$betreff="Bitte bestätigen Sie Ihre Registrierung";  
$text="Hallo ".$username."!\r\rBitte bestätigen Sie Ihre Regisitrierung!"  
$header="MIME-Version: 1.0\n";  
$header.="Content-type: text/html; charset=utf-8\n";  
$header.="From: Max Mustermann <contact@example.com>\n";  
mail($empfaenger,$betreff,$text,$header, "-fbcontact@example.com");  

Wenn ich das aber so mache, kommt _keine_ Fehlermeldung, aber auch _nie_ eine Mail an. Offenbar ist da also was falsch. Kann mir bitte wer aufzeigen, was ich umschreiben muß, damit die Mails utf-8 codiert sind _und_ auch noch gesendet werden/ankommen?

Mit Grüßen aus Entenhausen

Gustav Gans

  1. echo $begrüßung;

    Betreff: Bitte bestätigen Sie Ihre Registrierung
    Mail: Hallo ... ! Bitte bestätigen Sie Ihre Registrierung!
    Offenbar ist also die Mail nicht, so wie die php-Seite und alles andere bei mir, utf-8 codiert. Ich habe dazu jetzt im Internet folgende Lösung gefunden:

    Doch, sie ist so kodiert. Es ist dem Emfänger nur nicht bekanntgegeben, in welcher Kodierung sie vorliegt. Der Empfänger darf also Rätsel raten.

    $header="MIME-Version: 1.0\n";

    Wofür ist dieser Header gut?

    $header.="Content-type: text/html; charset=utf-8\n";

    Warum verwendest du text/html, wenn du gar kein HTML verwendest sondern offensichtlich text/plain? Der charset-Anhang ist in Ordnung. Diese Angabe gilt aber nur für den Body. Für die Betreff-Zeile gelten andere Regeln. Siehe http://www.paefken.westfalen.de/de.newusers/umlaute-faq.txt

    Wenn ich das aber so mache, kommt _keine_ Fehlermeldung, aber auch _nie_ eine Mail an.

    Auch nicht im Spam-Ordner?

    echo "$verabschiedung $name";

    1. Hallo,

      Doch, sie ist so kodiert. Es ist dem Emfänger nur nicht bekanntgegeben, in welcher Kodierung sie vorliegt. Der Empfänger darf also Rätsel raten.

      OK, und was soll ich jetzt tun, damit sich das bessert?

      $header="MIME-Version: 1.0\n";
      Wofür ist dieser Header gut?

      Ich schrieb ja, ich hab das von einer anderen Seite als Lösungsvorschlag übernommen.

      Warum verwendest du text/html, wenn du gar kein HTML verwendest sondern offensichtlich text/plain?

      Ich weiß schon, daß ich nur Sätze als Mailinhalt hatte und kein richtiges html, aber ich nehme nicht an, daß deshalb der Mailserver verweigert, die Mail zu senden.

      Der charset-Anhang ist in Ordnung. Diese Angabe gilt aber nur für den Body. Für die Betreff-Zeile gelten andere Regeln. Siehe http://www.paefken.westfalen.de/de.newusers/umlaute-faq.txt

      Was soll mir die Seite sagen? Da gibt es das Wort "Betreff" nicht.

      Wenn ich das aber so mache, kommt _keine_ Fehlermeldung, aber auch _nie_ eine Mail an.

      Auch nicht im Spam-Ordner?

      Nein, es kommt _überhaupt nichts_.

      OK, irgendwie bin ich jetzt nicht schlauer geworden. Was soll ich tun, damit ich eine Mail sowohl als plain text, als auch als html-mail utf-8 codiert versenden kann, wobei ich das "-fbcontact@example.com" verwenden _muss_.

      Ich bitte um Hilfe.

      Gustav Gans

      1. So, nachdem ich jetzt seit Stunden herumbropiere, habe ich _diesen_ Code als funktionierendes Ergebnis:

          
        $empfaenger="other@example.com";  
        $betreff="Bitte bestätigen Sie Ihre Registrierung";  
        $text="Hallo !\r\rSie haben sich gerade bei uns registriert. Österreich ist frei.";  
        $header.="MIME-Version: 1.0\n";  
        $header.="Content-type: text/plain; charset=utf-8\n";  
        $header.="From: Max Mustermann <mustermann@example.com>\n";  
        mail($empfaenger,utf8_decode($betreff),$text,$header, "-fcontact@example.com");  
        
        

        Ich bekomme die Mail dann genau so, wie ich möchte. Der Mailinhalt wird korrekt dargestellt (durch das Content-type: text/plain; charset=utf-8\n) und die Betreffzeile benfalls (durch das utf8_decode($betreff)).

        Ich verstehe nur eines nicht. Laut der von dedlfix empfohlenen Seite _muss_ bzw. _soll_ man auch eine Content-Transfer-Encoding Angabe machen. Wenn ich den obigen Code jetzt um diese Angabe erweitere,

          
        $empfaenger="other@example.com";  
        $betreff="Bitte bestätigen Sie Ihre Registrierung";  
        $text="Hallo !\r\rSie haben sich gerade bei uns registriert. Österreich ist frei.";  
        $header.="MIME-Version: 1.0\n";  
        $header.="Content-type: text/plain; charset=utf-8\n";  
        $header.="Content-Transfer-Encoding: 8bit";  
        $header.="From: Max Mustermann <mustermann@example.com>\n";  
        mail($empfaenger,utf8_decode($betreff),$text,$header, "-fcontact@example.com");  
        
        

        dann steht plötzlich bei der eingetroffenen Mail als Absender nicht mehr Max Mustermann und mustermann@example.com als Adresse, sondern einfach nur noch die mit dem " -f " angegebene Adresse contact@example.com.

        Fragen:

        1.) _Muss_ ich diese Content-Transfer-Encoding - Angabe machen? Oder ist es auch OK, wenn ich es weglasse?

        2.) Wieso wird plötzlich die header-Angabe zum Absender ignoriert, wenn Content-Transfer-Encoding mit angegeben wird?

        MfG

        Gustav Gans

        1. Yerf!

          2.) Wieso wird plötzlich die header-Angabe zum Absender ignoriert, wenn Content-Transfer-Encoding mit angegeben wird?

          Hm, schau dir die entsprechende Programmzeile nochmal ganz genau an und vergleich sie mit den anderen... fehlt da nicht was? so ein abschließendes \n ?

          Gruß,

          Harlequin

          --
          <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
      2. echo $begrüßung;

        Doch, sie ist so kodiert. Es ist dem Emfänger nur nicht bekanntgegeben, in welcher Kodierung sie vorliegt. Der Empfänger darf also Rätsel raten.
        OK, und was soll ich jetzt tun, damit sich das bessert?

        Dem Empfänger Bescheid sagen, was er für Inhalt zu erwarten hat. Das hast du ja schon versucht, nur eben nicht richtig.

        $header="MIME-Version: 1.0\n";
        Wofür ist dieser Header gut?
        Ich schrieb ja, ich hab das von einer anderen Seite als Lösungsvorschlag übernommen.

        Und du meinst, es ist gut, etwas zu übernehmen, das man nicht verstanden hat? http://www.thomas-fahle.de/pub/perl/MIME/MIME_Basics.html

        Warum verwendest du text/html, wenn du gar kein HTML verwendest sondern offensichtlich text/plain?
        Ich weiß schon, daß ich nur Sätze als Mailinhalt hatte und kein richtiges html, aber ich nehme nicht an, daß deshalb der Mailserver verweigert, die Mail zu senden.

        Vielleicht berechnet er dir Minuspunkte für die Fehler im Mail-Header und ignoriert dann den Versand oder der Empfänger macht das.

        Der charset-Anhang ist in Ordnung. Diese Angabe gilt aber nur für den Body. Für die Betreff-Zeile gelten andere Regeln. Siehe http://www.paefken.westfalen.de/de.newusers/umlaute-faq.txt
        Was soll mir die Seite sagen? Da gibt es das Wort "Betreff" nicht.

        Dort ist der englische Begriff verwendet, so wie die Zeile im Standard benannt ist: Subject. Zu finden unter 3) 2. Leider ist es nicht sehr ausführlich und auch nicht dargestellt, wie man UTF-8-Kodierung verwendet. Es sollte aber auf die Problematik hinweisen und weitere gezielte Forschung ermöglichen. Im hieseigen Archiv ist sicher auch was zu finden.

        echo "$verabschiedung $name";

        1. Hi dedlfix,

          $header="MIME-Version: 1.0\n";
          Wofür ist dieser Header gut?
          Ich schrieb ja, ich hab das von einer anderen Seite als Lösungsvorschlag übernommen.

          Und du meinst, es ist gut, etwas zu übernehmen, das man nicht verstanden hat? http://www.thomas-fahle.de/pub/perl/MIME/MIME_Basics.html

          Das nicht, aber selbst auf der von dir empfohlenen Seite steht eindeutig unter Punkt 1.3:

          eine Zeile "Mime-Version: 1.0" sollte vorhanden sein.

          Darum verstehe ich jetzt nicht ganz, wieso du in deiner ersten Antwort so kritisiert hast, daß ich das verwende?! Und ohne es jetzt ganz zu verstehen, was es ist, kann es mal nicht _falsch_ sein, es zu verwenden, oder?

          mfG

          Gustav Gans

          1. echo $begrüßung;

            Darum verstehe ich jetzt nicht ganz, wieso du in deiner ersten Antwort so kritisiert hast, daß ich das verwende?!

            Es war nicht unbedingt als Kritik gemeint, sondern eher eine Anregung, sich mit dem zu beschäftigen, was da als "Lösung" angeboten wird. Nicht immer ist das was man so findet richtig. Ich fand auch beim Information holen einen Artikel, der die Verwendung dieser Zeile als unsinnig/unnötig darstellte.

            echo "$verabschiedung $name";

    2. NACHTRAG zu meiner darunterstehenden Antwort:

      $header="MIME-Version: 1.0\n";

      Wofür ist dieser Header gut?

      Ich bin jetzt auf der glaubb ich 100. Seite heute, wo es um mein problem geht. Nicht, daß ich jetzt weiter wäre oder mein Problem auch nur ansatzweise gelöst ist ... aber das mit dem "MIME-Version: 1.0" lese ich _überall_.

  2. Hi,

    $betreff="Bitte bestätigen Sie Ihre Registrierung";

    utf8-editor? ansonsten probieren: utf8_encode("blöblü").

    $text="Hallo ".$username."!\r\rBitte bestätigen Sie Ihre Regisitrierung!"

    Kann mir bitte wer aufzeigen, was ich umschreiben muß, damit die Mails utf-8 codiert sind _und_ auch noch gesendet werden/ankommen?
    Ev mit \r\n probieren.

    Weiters bietet sich noch an:
    http://at2.php.net/mb-send-mail

    herzliche Grüße,
    Jonny 5