Linuchs: Umlaut-Problem in Mail

Moin,

ich dachte, die Umlaute hätte ich im Griff, aber nein ...

Das PHP-Programm läuft mit UTF-8 und die Mail, die ich erzeuge, hat diesen header:

    $mail_header  = "From:        XXX\n";
    $mail_header .= "Reply-To:    XXX\n";
    $mail_header .= "MIME-Version: 1.0\r\n";
//  $mail_header .= "Content-Type: multipart/mixed;\r\n";
    $mail_header .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
//  $mail_header .= "boundary=\"".$mime_boundary."\"\r\n";

Dann stelle ich die $message zusammen, die in UTF8 codiert ist und decodiere sie (vermeintlich):

    // wg. charset=iso-8859-1  ... Gibt die ISO-8859-1-Übersetzung von data zurück. 
    $mail_body  = utf8_decode( $message )."\r\n";

Ausschnitt aus der Mail, empfangen und dargestellt von Thunderbird:

umlaute

Was läuft hier falsch?

fragt Linuchs

  1. sorry, vor lauter Problemen mit PDF & Co habe ich mb_send_mail übersehen:

    //  $gesendet_1 = mb_send_mail( $mail_to, $mail_subject, $mail_body, $mail_header );
        $gesendet_1 = mail( $mail_to, $mail_subject, $mail_body, $mail_header );
    

    Mit mail stimmen die Umlaute

    1. n'Abend,

      //  $gesendet_1 = mb_send_mail( $mail_to, $mail_subject, $mail_body, $mail_header );
          $gesendet_1 = mail( $mail_to, $mail_subject, $mail_body, $mail_header );
      

      Mit mail stimmen die Umlaute

      auf die Schnelle überblicke ich noch nicht, ob deine Lösung wirklich eine Lösung ist, oder nur ein labiler Workaround.

      Aber ich frage mich, warum du überhaupt von UTF-8 wieder auf eine eingeschränkte Codierung wie ISO-8859-x umsteigst. Gib doch einfach UTF-8 als verwendete Codierung im Mailheader an, und gut is'. Warum der Aufwand - mit der Nebenwirkung, dass einige Zeichen verstümmelt werden (müssen)?

      Live long and pros healthy,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. Aber ich frage mich, warum du überhaupt von UTF-8 wieder auf eine eingeschränkte Codierung wie ISO-8859-x umsteigst.

        Habe in Erinnerung, vielleicht drei Jahre her, dass - wie heißt nochmal dieses Standard-Mailprogramm bei Windows - mit UTF8 überhaupt nicht klar kam.

        Was nutzt eine moderne Rakete, wenn Windows-User nur ein Fahrrad haben?

        1. Hallo,

          Was nutzt eine moderne Rakete, wenn Windows-User nur ein Fahrrad haben?

          wenn ich hier so lese, welche Probleme du und auch andere Raketenbenutzer haben, bin ich froh, Radfahrer zu sein.

          Gruß
          Jürgen

          1. Hi,

            Was nutzt eine moderne Rakete, wenn Windows-User nur ein Fahrrad haben?

            wenn ich hier so lese, welche Probleme du und auch andere Raketenbenutzer haben, bin ich froh, Radfahrer zu sein.

            Wie jetzt? Du benutzt RAD-Studio?
            Oder war das nur ein blöder Spruch?

            @Linuchs:
            Könntest Du bitte zum Anschluss der Aktion mal eine der generierten E-Mails im Quelltext bereotstellen?

            Warum benutzt Du manuelle Header-Concatination (auch noch mit teilweise falschen Header-Endezeichen) und nicht das Header-Array?

            Gruß
            md-too

          2. wenn ich hier so lese, welche Probleme du und auch andere Raketenbenutzer haben,

            Welche hab ich denn?

        2. Hallo Linuchs,

          Aber ich frage mich, warum du überhaupt von UTF-8 wieder auf eine eingeschränkte Codierung wie ISO-8859-x umsteigst.

          Habe in Erinnerung, vielleicht drei Jahre her, dass - wie heißt nochmal dieses Standard-Mailprogramm bei Windows - mit UTF8 überhaupt nicht klar kam.

          UTF-8 ist schon ziemlich gut abgehangen. Ich denke, dass es vermutlich eher eine nicht dem Standard entsprechend konstruierte E-Mail war, die zu Problemen führte. Andere E-Mail-Programme sind vielleicht etwas toleranter im Interpretieren solcher E-Mails. Da hilft nur gezieltes Fehlersuchen.

          Gruß
          Julius

  2. Lieber Linuchs,

    Was läuft hier falsch?

    offensichtlich ist es zu komplex, die vielen RFCs zu der korrekten Enkodierung in Mails zu berücksichtigen, wenn Du das in PHP per Hand tust. Es empfiehlt sich daher für Dich dringend der Einsatz einer PHP-Klasse wie PHPMailer oder SwiftMailer. Beiden ist gemein, dass sie einen SMTP-Server und passende Zugangsdaten benötigen, um eine Mail erfolgreich abzusenden. Dafür aber hast Du keine Probleme mehr.

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      Es empfiehlt sich daher für Dich dringend der Einsatz einer PHP-Klasse wie PHPMailer oder SwiftMailer. Beiden ist gemein, dass sie einen SMTP-Server und passende Zugangsdaten benötigen, um eine Mail erfolgreich abzusenden.

      ... und das kann sehr praktisch sein, weil man nicht mehr an das gebunden ist, was in der php.ini für mail() konfiguriert wurde. Man könnte auf dem Testsystem via SMTP den selben E-Mail-Server wie im Produktivsystem zum Versand nutzen, um möglichst ähnliche Bedingungen wie im Produktivbetrieb herzustellen.

      Gruß
      Julius

    2. //  $mail_header .= "Content-Type: multipart/mixed;\r\n";
          $mail_header .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
      //  $mail_header .= "boundary=\"".$mime_boundary."\"\r\n";
      

      @Linuchs : headers[] = 'key: '. value; nebst implode( PHP_EOL, headers )ist die wohl beste Variante, wernn Du nicht dem unten stehendem folgst.

      offensichtlich ist es zu komplex … Es empfiehlt sich daher für Dich dringend der Einsatz einer PHP-Klasse wie PHPMailer oder SwiftMailer.

      Wie ich schon mal schrieb: wenns denn zu komplex wird (ich sehe oben Stichwörter wie multipart, boundary) dann sehe ich das auch so.

      @Felix Riesterer :

      Beiden ist gemein, dass sie einen SMTP-Server und passende Zugangsdaten benötigen, um eine Mail erfolgreich abzusenden.

      Äh. Nein. Also „nicht zwingend“:

      https://github.com/swiftmailer/swiftmailer/blob/master/doc/sending.rst behauptet:

      /*
      You could alternatively use a different transport such as Sendmail:
      
      // Sendmail
      $transport = new Swift_SendmailTransport('/usr/sbin/sendmail -bs');
      */
      

      @Linuchs :

      An der Stelle noch ein heißer Tipp: Grafiken für den HTML-Part nicht anhängen, sondern base64-codiert ins HTML packen hilft beim Empfänger Verwirrung bezüglich der Anhänge zu vermeiden - es ist für den Empfänger ziemlich nervig, das eigentlich interessierende PDF zwischen den 6 verschiedenen Firmenlogos zu finden … Hier kannst Du schauen wie das geht, und weil da eine Begrenzung auf 64 Kilobytes ist, hier der Quelltext für die Erzeugung.

      1. //  $mail_header .= "Content-Type: multipart/mixed;\r\n";
            $mail_header .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
        //  $mail_header .= "boundary=\"".$mime_boundary."\"\r\n";
        

        @Linuchs : headers[] = 'key: '. value; nebst implode( PHP_EOL, headers )ist die wohl beste Variante, wernn Du nicht dem unten stehendem folgst.

        $headers[$hname] = $hvalue;

        trifft es wohl besser.

        Da braucht man sich auch nicht um das passende EOL zu kümmern.
        Außerdem werden versehentlich doppelt festgelegte Header auch automatisch überschrieben. Letzte Festöegung gilt.

        Bei mb_send_mail() sollten/müssen(?) die Daten in utf-8 übergeben werden. Die headerinterne Kodierung macht die Funktion selber. Also nicht vorher MIME-kodieren!

        LG
        me-too

        1. @Linuchs : headers[] = 'key: '. value; nebst implode( PHP_EOL, headers )ist die wohl beste Variante, wernn Du nicht dem unten stehendem folgst.

          $headers[$hname] = $hvalue;

          trifft es wohl besser.

          Oh? Handbuch?

          mail ( 
             string $to ,
             string $subject ,
             string $message 
             [
                , mixed $additional_headers
             [  , string $additional_parameters ]
             ]
          ) : bool
          
          • 7.2.0 Der additional_headers Parameter akzeptiert nun ebenfalls ein Array.
          [v] Fortgebildet.
          [v] THX!
          [v] Fühl Dich geplusst.
          
      2. Hallo Raketenposstelle,

        Beiden ist gemein, dass sie einen SMTP-Server und passende Zugangsdaten benötigen, um eine Mail erfolgreich abzusenden.

        Äh. Nein. Also „nicht zwingend“:

        https://github.com/swiftmailer/swiftmailer/blob/master/doc/sending.rst behauptet:

        /*
        You could alternatively use a different transport such as Sendmail:
        
        // Sendmail
        $transport = new Swift_SendmailTransport('/usr/sbin/sendmail -bs');
        */
        

        Ui, ganz vergessen. Dabei habe ich das mit dem SendmailTransport sogar selbst ins Wiki geschrieben. Überarbeitet oder werde ich vergesslich? 🤔

        Gruß
        Julius