misterunknown: Zeichenkodierung in HTML-Mails.

Moin,

ich habe folgendes Problem: Ich schreiben gerade ein kleines Tool, welches mich per Mail an einige Aufgaben erinnern soll. Auf meinem Server ist alles in UTF-8 codiert. Der HTML-Mail erzähle ich auch auf verschiedene Weisen, dass der Inhalt UTF-8 codiert ist:

Einmal im Header der Mail selbst:
$headers .= "Content-type: text/html; charset=UTF-8\r\n";

und einmal im Markup des Mailinhaltes:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Der Inhalt der Mail wird dadurch korrekt dargestellt. Das Problem ist, dass im _Betreff_ entsprechende Sonderzeichen nicht korrekt dargestellt werden. Siehe hier (auf einem S3, aber das spielt ja keine Rolle). Die Überschrift im Inhalt sollte identisch mit dem Betreff (1. Zeile) sein.

Meine Frage wäre jetzt also: Kann ich in einer Mail speziell die Zeichencodierung für den Betreff angeben? Und wenn nicht: Kann ich in meinem PHP-Skript irgendwie klar machen, dass der String für den Betreff anders codiert sein muss?

Grüße Marco

  1. hi,

    Meine Frage wäre jetzt also: Kann ich in einer Mail speziell die Zeichencodierung für den Betreff angeben?

    Ja, das geht, im 'Betreff' selbst, quoted-printable oder base64, so dass auch dieser Header nur ASCII bekommt.

    Und wenn nicht: Kann ich in meinem PHP-Skript irgendwie klar machen, dass der String für den Betreff anders codiert sein muss?

    Anders codiert heißt immer ASCII ;)

    Hotti

    1. Moin,

      Ja, das geht, im 'Betreff' selbst, quoted-printable oder base64, so dass auch dieser Header nur ASCII bekommt.

      Danke. Durch etwas googlen im Bezug auf base64 habe ich jetzt folgendes Statement gefunden:

      mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);

      Das stand in einem Kommentar zur Dokumentation der Mail-Funktion bei php.net (da hätte ich auf gleich drauf kommen können dort zu suchen).

      So funktionierts jetzt auf jeden Fall :)

      Anders codiert heißt immer ASCII ;)

      Dachte ich mir schon.

      Grüße Marco

  2. Moin Moin,

    es wird gerne übersehen das die Betreff-Zeile im Mailheader steht. Sie steht nicht im Body. Also müssen Sonderzeichen und Umlaute 7-Bit kodiert sein. Details zur Kodierung kann man in der RFC 2047 nachlesen.

    Kay

    1. Moin,

      es wird gerne übersehen das die Betreff-Zeile im Mailheader steht. Sie steht nicht im Body. Also müssen Sonderzeichen und Umlaute 7-Bit kodiert sein. Details zur Kodierung kann man in der RFC 2047 nachlesen.

      Ich hab noch etwas gegoogelt:

      So geht es auch:     mail(trim($to), utf8_decode($subject), $text, $headers); }

      So allerdings nicht: mail(trim($to), mb_convert_encoding($subject, "ASCII"), $text, $headers);

      Grüße Marco

      1. Tach!

        So geht es auch:     mail(trim($to), utf8_decode($subject), $text, $headers); }

        Nein, das geht nur zufällig, und ist falsch. 7-Bit wäre richtig, Umlaute sind Nicht-ASCII und damit unter ISO-8859-1 8-Bit.

        So allerdings nicht: mail(trim($to), mb_convert_encoding($subject, "ASCII"), $text, $headers);

        Wie gesagt, Umlaute gibt es in ASCII nicht. Sie gehen dir bei einer Umwandlung nach ASCII verloren. Außerdem muss bei allem was mit mb_* gemacht wird, mit mb_internal_encoding() die derzeit verwendete Kodierung eingestellt werden, sonst ist vielleicht durch einen Parameter einer Funktion das Wohin definiert, aber nicht das Woher.

        dedlfix.

        1. Moin,

          So geht es auch:     mail(trim($to), utf8_decode($subject), $text, $headers); }
          Nein, das geht nur zufällig, und ist falsch. 7-Bit wäre richtig, Umlaute sind Nicht-ASCII und damit unter ISO-8859-1 8-Bit.

          Aha. Ok, wie sieht es damit aus:

          mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);

          Wäre das korrekt? Das funktioniert nämlich auch.

          Grüße Marco

          1. Tach!

            mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);
            Wäre das korrekt? Das funktioniert nämlich auch.

            Das sieht soweit ok aus. Es fängt mit der vorgesehenen Escape-Sequenz an, die die Kodierung angibt, gefolgt vom B für Base64 und dann das derart kodierte Subjekt. Persönlich würde ich aber nicht Base64 sondern Quoted Printable nehmen, dann kann man wenigstens den Rest ohne einen Base64-Dekoder lesen.

            dedlfix.

          2. Hallo,

            mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header_ . $header);
            Wäre das korrekt? Das funktioniert nämlich auch.

            das sollte es wohl, denn das ist sozusagen die "Musterlösung" für den Fall, dass man base64 verwenden möchte - wobei ich Quoted-Printable wegen der besseren Lesbarkeit vorziehen würde.

            Ciao,
             Martin

            --
            "Drogen machen gleichgültig."
             - "Na und? Mir doch egal."
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  3. Tach!

    Meine Frage wäre jetzt also: Kann ich in einer Mail speziell die Zeichencodierung für den Betreff angeben? Und wenn nicht: Kann ich in meinem PHP-Skript irgendwie klar machen, dass der String für den Betreff anders codiert sein muss?

    Für beide Fragen findest du eine Antwort im Kontextwechsel-Artikel.

    dedlfix.

    1. Moin,

      Für beide Fragen findest du eine Antwort im Kontextwechsel-Artikel.

      Danke. Sehr interessanter Artikel.

      Grüße Marco