xpfreund: Umlaute in E-Mails

Hallo,

durch verschiedene Foren und andere Google-Einträge hab ich das schon so weit zusammen gesetzt. Trotzdem gehen die Umlaute immer wieder verloren.

  
$sender = "martina@musterfrau.de";  
$person = "Martina Musterfrau";  
$address = "example@example.org";  // statt dieser Adresse eine eigene einsetzen!  
$subject = "Eine Testmail zum Ändern";  
$heading = "Hallo!";  
$text = "Dies ist eine Testmail.\\nSchöne Grüße!";  
$body = $heading."\\n".$text;  
$header = "MIME-Version: 1.0 Content-Type: text/plain; charset=ISO 8859-1; format=flowed Content-Transfer-Encoding: 8bit From: ".$person." <".$sender.">";  
  if (mail($address, $subject, $body, $header))  
  echo "Die E-Mail wurde abgeschickt!";  
  else echo "Die E-Mail konnte nicht abgeschickt werden!";  

Was muss denn hier noch geändert werden, damit die Anzeige im Mailprogramm läuft?

gruß aus Senftenberg am See

  1. Moin!

    durch verschiedene Foren und andere Google-Einträge hab ich das schon so weit zusammen gesetzt. Trotzdem gehen die Umlaute immer wieder verloren.

    Wo genau? Im Header? Im Body?

    $sender = "martina@musterfrau.de";
    $person = "Martina Musterfrau";
    $address = "example@example.org";  // statt dieser Adresse eine eigene einsetzen!
    $subject = "Eine Testmail zum Ändern";

    Umlaute im Header-Bereich müssen speziell maskiert werden, die Angabe des Mime-Typs gilt nur für den Mailbody. Dementsprechend kann ein Mailserver im Header nur SMTP-gerechte Daten annehmen, und das bedeutet: 7 Bit ASCII!

    $heading = "Hallo!";
    $text = "Dies ist eine Testmail.\nSchöne Grüße!";
    $body = $heading."\n".$text;
    $header = "MIME-Version: 1.0 Content-Type: text/plain; charset=ISO 8859-1; format=flowed Content-Transfer-Encoding: 8bit From: ".$person." <".$sender.">";

    Diese Header-Zeile ist irgendwie falsch, da fehlt ein Zeilenumbruch vor FROM.

    if (mail($address, $subject, $body, $header))
      echo "Die E-Mail wurde abgeschickt!";
      else echo "Die E-Mail konnte nicht abgeschickt werden!";

    
    >   
    > Was muss denn hier noch geändert werden, damit die Anzeige im Mailprogramm läuft?  
      
     - Sven Rautenberg
    
    -- 
    "Love your nation - respect the others."
    
    1. Hallo,

      durch verschiedene Foren und andere Google-Einträge hab ich das schon so weit zusammen gesetzt. Trotzdem gehen die Umlaute immer wieder verloren.

      http://www.zentralplan.de/?cid=177

      Wo genau? Im Header? Im Body?

      Im Betreff genauso wie im Body.

      $sender = "martina@musterfrau.de";
      $person = "Martina Musterfrau";
      $address = "example@example.org";  // statt dieser Adresse eine eigene einsetzen!
      $subject = "Eine Testmail zum Ändern";
      Umlaute im Header-Bereich müssen speziell maskiert werden, die Angabe des Mime-Typs gilt nur für den Mailbody. Dementsprechend kann ein Mailserver im Header nur SMTP-gerechte Daten annehmen, und das bedeutet: 7 Bit ASCII!

      Gehen muss es aber weil ein Mäil-Client kann das ja auch.

      $heading = "Hallo!";
      $text = "Dies ist eine Testmail.\nSchöne Grüße!";
      $body = $heading."\n".$text;
      $header = "MIME-Version: 1.0 Content-Type: text/plain; charset=ISO 8859-1; format=flowed; Content-Transfer-Encoding: 8bit; From: ".$person." <".$sender.">";

      Diese Header-Zeile ist irgendwie falsch, da fehlt ein Zeilenumbruch vor FROM.

      Auch mit den Zeilenumbrüchen klappts trotzdem nich.

      if (mail($address, $subject, $body, $header))
        echo "Die E-Mail wurde abgeschickt!";
        else echo "Die E-Mail konnte nicht abgeschickt werden!";

      Ich benutze übrigens PHP 4.3.3. auf einem Linux-Server.  
        
      gruß aus [Senftenberg](http://www.senftenberg.de/) am [See](http://www.senftenberger-see.de/)
      
      1. Moin!

        durch verschiedene Foren und andere Google-Einträge hab ich das schon so weit zusammen gesetzt. Trotzdem gehen die Umlaute immer wieder verloren.

        http://www.zentralplan.de/?cid=177

        In dem ersten Beispiel ist die Header-Zeile allerdings MIT Zeilenumbrüchen - auch wenn die nicht als "\n" geschrieben sind. Wenn diese Zeilenumbrüche fehlen, erkennen die Mailsysteme nicht, dass du mehrere Header für diverse Dinge eingetragen hast, sondern sehen nur einen Header mit merkwürdigem Inhalt.

        Wo genau? Im Header? Im Body?

        Im Betreff genauso wie im Body.

        $sender = "martina@musterfrau.de";
        $person = "Martina Musterfrau";
        $address = "example@example.org";  // statt dieser Adresse eine eigene einsetzen!
        $subject = "Eine Testmail zum Ändern";
        Umlaute im Header-Bereich müssen speziell maskiert werden, die Angabe des Mime-Typs gilt nur für den Mailbody. Dementsprechend kann ein Mailserver im Header nur SMTP-gerechte Daten annehmen, und das bedeutet: 7 Bit ASCII!

        Gehen muss es aber weil ein Mäil-Client kann das ja auch.

        Richtig, geht ja auch, nur nicht so, wie du es machst.

        $heading = "Hallo!";
        $text = "Dies ist eine Testmail.\nSchöne Grüße!";
        $body = $heading."\n".$text;
        $header = "MIME-Version: 1.0 Content-Type: text/plain; charset=ISO 8859-1; format=flowed; Content-Transfer-Encoding: 8bit; From: ".$person." <".$sender.">";

        Diese Header-Zeile ist irgendwie falsch, da fehlt ein Zeilenumbruch vor FROM.

        Auch mit den Zeilenumbrüchen klappts trotzdem nich.

        Siehe oben...

        if (mail($address, $subject, $body, $header))
          echo "Die E-Mail wurde abgeschickt!";
          else echo "Die E-Mail konnte nicht abgeschickt werden!";

        
        > Ich benutze übrigens PHP 4.3.3. auf einem Linux-Server.  
          
        Nebenfrage: Gibt es einen speziellen Grund, dass du kein UTF-8 verwendest? Damit würden sich nämlich die Frage nach den Umlauten in Details deutlich vereinfachen, vor allem im Subject-Header.  
          
         - Sven Rautenberg
        
        -- 
        "Love your nation - respect the others."
        
        1. Hallo,

          Nebenfrage: Gibt es einen speziellen Grund, dass du kein UTF-8 verwendest? Damit würden sich nämlich die Frage nach den Umlauten in Details deutlich vereinfachen, vor allem im Subject-Header.

          Wenn ich das mit utf8 mache, kommen nur Mistzeichen im Body an.

          gruß aus Senftenberg am See

        2. Hallo,

          ich habs nochmal genauso mit den ganzen Umbrüchen und dem utf8, wie im Bsp. getestet.

            
            $header = "MIME-Version: 1.0  
            Content-Type: text/plain; charset=utf8; format=flowed  
            Content-Transfer-Encoding: 8bit  
            From: ".$person." <".$sender.">";  
          
          

          Der Sender wird nicht erkannt. Ersatzweise wird der Mailserver von dem ich das schicke eingesetzt. Die Umlaute fallen auch weg. Ansonsten kam der Text richtig an.

          gruß aus Senftenberg am See

      2. Moin Moin!

        Hallo,

        durch verschiedene Foren und andere Google-Einträge hab ich das schon so weit zusammen gesetzt. Trotzdem gehen die Umlaute immer wieder verloren.
        http://www.zentralplan.de/?cid=177
        Wo genau? Im Header? Im Body?
        Im Betreff genauso wie im Body.

        RFC2047 regelt, wie man nicht-ASCII-Zeichen in Mail-Headern codiert - Quoted Printable oder Base64. Das betrifft u.a. From, To, CC, Bcc, und Subject.

        Genau das Problem habe ich gerade für eine von MIME::Lite erbende Klasse gelöst, Perl hat praktischerweise eine Encoding-Engine, die auch MIME-Header-Encodings handhaben kann. Der Quelltext sollte relativ einfach nach PHP zu portieren sein.

        In den Body gehört ein UTF-8-Datenstrom, dazu ein "; charset=utf-8" am dazu gehörenden Content-Type-Header.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. Hallo,

          so richtig will das nich klappen. Hab auf diesen Iso irgendwas umgestellt und Sachen wie "=E4ndern" im Text benutzt Anzeige trotzdem auch im Mailprogramm so.

          gruß aus Senftenberg am See

        2. Hallo,

          der Header funktioniert so wenigstens ordentlich.
            $subject = 'Text zum Ändern';
            $subject = utf8_encode($subject);
            $subject = '=?utf-8?b?'.base64_encode($subject).'?=';
          Mal gucken, wie das mit dem Body funktioniert.

          gruß aus Senftenberg am See

          1. Moin Moin!

            der Header funktioniert so wenigstens ordentlich.
              $subject = 'Text zum Ändern';
              $subject = utf8_encode($subject);
              $subject = '=?utf-8?b?'.base64_encode($subject).'?=';

            Naja, etwas brutal, denn das Theater nach RFC2047 ist nur nötig, wenn der Header-Wert nicht ausschließlich aus ASCII-Zeichen besteht (/^[\x20-\x7E]*$/ trifft für den Wert nicht zu). Außerdem ist es nicht notwendig, den gesamten Header-Wert zu escapen, man *darf* auch nur Teile escapen.

            Mal gucken, wie das mit dem Body funktioniert.

            Zitat231 kennst Du? RFC2822 und die dort verlinkten RFCs auch?

            Alexander

            --
            Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
            1. Moin!

              der Header funktioniert so wenigstens ordentlich.
                $subject = 'Text zum Ändern';
                $subject = utf8_encode($subject);
                $subject = '=?utf-8?b?'.base64_encode($subject).'?=';

              Naja, etwas brutal, denn das Theater nach RFC2047 ist nur nötig, wenn der Header-Wert nicht ausschließlich aus ASCII-Zeichen besteht (/^[\x20-\x7E]*$/ trifft für den Wert nicht zu). Außerdem ist es nicht notwendig, den gesamten Header-Wert zu escapen, man *darf* auch nur Teile escapen.

              Es ist aber die simpelste Methode, die man anwenden kann, ohne komplexe Stringoperationen auspacken zu müssen. Ansonsten müßte man jedes Zeichen darauf prüfen, ob es in 7-Bit-ASCII enthalten ist, und andernfalls das Escaping drumherumstricken. Und gerade bei UTF-8 ist das doch etwas fummeliger, zumal man am Ende ja vermutlich nicht jedes Zeichen einzeln escapen will, sondern vermutlich zusammenhängende Zeichen in einer Verpackung hätte.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Moin Moin!

                der Header funktioniert so wenigstens ordentlich.
                  $subject = 'Text zum Ändern';
                  $subject = utf8_encode($subject);
                  $subject = '=?utf-8?b?'.base64_encode($subject).'?=';

                Naja, etwas brutal, denn das Theater nach RFC2047 ist nur nötig, wenn der Header-Wert nicht ausschließlich aus ASCII-Zeichen besteht (/^[\x20-\x7E]*$/ trifft für den Wert nicht zu). Außerdem ist es nicht notwendig, den gesamten Header-Wert zu escapen, man *darf* auch nur Teile escapen.

                Es ist aber die simpelste Methode, die man anwenden kann, ohne komplexe Stringoperationen auspacken zu müssen. Ansonsten müßte man jedes Zeichen darauf prüfen, ob es in 7-Bit-ASCII enthalten ist, und andernfalls das Escaping drumherumstricken. Und gerade bei UTF-8 ist das doch etwas fummeliger, zumal man am Ende ja vermutlich nicht jedes Zeichen einzeln escapen will, sondern vermutlich zusammenhängende Zeichen in einer Verpackung hätte.

                Ich hab nie gesagt, dass man einzelne Zeichen escapen soll, die RFC2047 spricht auch ausdrücklich von "encoded words". Ich würde das Escaping des gesamten Header-Wertes aber nur dann durchführen, wenn der Header-Wert nicht in ASCII abgebildet werden kann, nämlich immer dann, wenn die o.g. RegExp nicht matcht. Auf die Art gibt es weniger Probleme mit alten Mail-Clients. Quoted printable encoding (=?utf-8?q?) statt base64-encoding (=?utf-8?b?) macht den Header-Wert in alten Mail-Clients für das ungeübte Auge lesbarer, weil damit zumindest die meisten ASCII-Zeichen unverändert bleiben.

                Der aktuelle Thunderbird macht es so, sogar wortweise:

                Subject: Freitagsmail, heute mal etwas =?ISO-8859-1?Q?versp=E4tet_=2E=2E?=
                 =?ISO-8859-1?Q?=2E?=

                Die gnadenlose Base64-Darstellung des selben Betreffs ("RnJlaXRhZ3NtYWlsLCBoZXV0ZSBtYWwgZXR3YXMgdmVyc3DkdGV0IC4uLg==") ist dagegen in alten Mail-Clients unbrauchbar.

                Alexander

                --
                Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".