Layer 8Ehrlicher Tech-Support

Umlaute im Betreff kommen als Zeichensalat an

Aus Grüße wird Grüße, der Anhang heißt plötzlich anders? Kopfzeilen einer Mail dürfen nur ASCII — Zeichensatz und Verfahren stehen mit im Text.

Aufwand:
ca. 25 Min.
Voraussetzung:
Die betroffene Nachricht im Original, als .eml gespeichert, Python 3 für das Entziffern der Kopfzeilen, Eine Kommandozeile
Gilt für:
MIME nach RFC 2045, Kopfzeilen nach RFC 2047, Parameterwerte nach RFC 2231

Das Symptom

Im Posteingang steht eine Nachricht, deren Betreff mit =?utf-8?Q? beginnt und in einer Zeichenfolge endet, die niemand geschrieben haben kann. Oder er ist lesbar, aber im Text prangt statt Grüße ein Grüße, statt Straße ein Straße. Der Anhang heißt beim Empfänger plötzlich Jahres=C3=BCbersicht.pdf oder gleich unbenannt.dat. Auf dem eigenen Bildschirm sah beim Abschicken alles richtig aus — und beim Absender sieht auch die zurückgeschickte Kopie wieder richtig aus, was die Sache erst recht unglaubwürdig macht.

Die „Layer 8“-Wahrheit

E-Mail ist ein Verfahren aus einer Zeit, in der sieben Bit pro Zeichen als großzügig galten. Der Nachrichtenkopf — Betreff, Absendername, Dateiname des Anhangs — darf bis heute nichts anderes enthalten als druckbare ASCII-Zeichen. Ein ü passt dort schlicht nicht hinein.

Statt den Standard zu ändern, hat man eine Verpackung erfunden; die bis heute gültige Fassung dieser Regel stammt von 1996. Ein Umlaut wird in eine Zeichenfolge übersetzt, die selbst nur aus ASCII besteht und die drei Informationen mitführt, die zum Auspacken nötig sind: welcher Zeichensatz gemeint ist, mit welchem Verfahren kodiert wurde und wie die Nutzdaten lauten. Genau das ist =?utf-8?Q?Gr=C3=BC=C3=9Fe?= — kein Fehler, sondern die Verpackung, die man normalerweise nie zu sehen bekommt. Wenn Sie sie sehen, hat jemand vergessen auszupacken.

Der zweite Fall ist gefährlicher, weil er nicht nach einem Fehler aussieht. Im Nachrichtentext sind Umlaute erlaubt — vorausgesetzt, die Nachricht sagt, nach welcher Tabelle die Bytes zu lesen sind. Sagt sie nichts, gilt laut Standard US-ASCII als Voreinstellung, und zwar ausdrücklich auch dann, wenn die entsprechende Zeile zwar da, aber syntaktisch kaputt ist. Sagt sie etwas Falsches, ist es noch schlimmer: Dann liest der Empfänger UTF-8-Bytes nach der Tabelle ISO-8859-1, und aus den zwei Bytes eines ü werden zwei sichtbare Zeichen. Das ist keine Beschädigung der Daten — die Bytes sind unversehrt. Es ist eine falsche Beschriftung, und niemand kann raten, was gemeint war.

Beim Anhang kommt eine dritte Schicht dazu. Der Dateiname steht als Parameterwert in einer Kopfzeile, und Parameterwerte hatten ursprünglich noch weniger Freiheiten als der Rest. Seit 1997 gibt es dafür eine eigene Schreibweise mit einem Sternchen am Parameternamen, Zeichensatz und Sprache am Wertanfang und prozentkodierten Bytes dahinter. Wer sie benutzt, hat keine Probleme. Wer den Umlaut roh hineinschreibt oder die Verpackung aus dem Kopfzeilenstandard an einer Stelle verwendet, wo sie nicht vorgesehen ist, bekommt beim Empfänger einen anderen Dateinamen — und in ungünstigen Fällen einen Anhang ganz ohne Namen und ohne Endung, den kein Programm mehr öffnen mag.

Die unbequeme Wahrheit dahinter: Es gibt in dieser Kette drei unabhängige Stellen, an denen eine Kodierung angegeben wird — Kopfzeile, Textteil, Parameterwert —, und jedes beteiligte Programm darf sie eigenständig setzen. Ein Mailprogramm mit einer Voreinstellung aus dem Jahr 2009, ein Verteilerdienst, der Betreffzeilen umschreibt, ein Archivsystem, das Anhänge neu verpackt: Jeder von ihnen kann die Beschriftung kaputt machen, ohne den Inhalt anzurühren. Deshalb nützt es wenig, im eigenen Programm herumzustellen, solange man nicht am Rohtext nachgesehen hat, welche der drei Stellen tatsächlich lügt.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Die Nachricht im Original beschaffen, nicht als Bildschirmfoto

    Die Anzeige des Mailprogramms ist bereits eine Auslegung — gebraucht wird der Rohtext. In Thunderbird führt der Weg über Ansicht, dann Nachrichten-Quelltext, oder mit der Tastenkombination Strg und U; in Apple Mail über Darstellung, E-Mail, Rohformat; in Outlook über Datei, Eigenschaften, Internetkopfzeilen, wobei dort nur die Kopfzeilen sichtbar sind. Am zuverlässigsten ist, die Nachricht als Datei mit der Endung .eml zu speichern. Der Befehl zeigt anschließend genau die Kopfzeilen, auf die es ankommt. Die Option zum Behandeln als Text ist wichtig, weil eine Nachricht mit Anhang für viele Werkzeuge wie eine Binärdatei aussieht.

    grep -a -i -m 8 -E '^(MIME-Version|Content-Type|Content-Transfer-Encoding|Subject|From):' nachricht.eml
    
  2. 2.

    Das encoded-word entziffern und mit dem Angezeigten vergleichen

    Jetzt wird geprüft, ob die Kopfzeile selbst falsch ist oder nur falsch angezeigt wurde. Der Befehl nimmt eine Betreffzeile in der Schreibweise nach RFC 2047 entgegen und gibt den Text aus, den ein standardkonformes Programm anzeigen müsste. Kommt hier der richtige Text heraus, ist die Nachricht in Ordnung und das anzeigende Programm der Schuldige. Kommt Buchstabensalat heraus, hat schon der Absender die falsche Zeichensatzangabe hineingeschrieben. Das Beispiel im Befehl ist echt und ergibt Grüße aus München — es dient zugleich als Gegenprobe, dass der Befehl richtig abgetippt wurde.

    python3 -c "from email.header import decode_header, make_header; import sys; print(make_header(decode_header(sys.argv[1])))" '=?utf-8?Q?Gr=C3=BC=C3=9Fe_aus_M=C3=BCnchen?='
    
  3. 3.

    Jeden Teil der Nachricht einzeln auf Zeichensatz und Verfahren prüfen

    Eine Mail mit Anhang besteht aus mehreren Teilen, und jeder trägt eigene Angaben. Der Befehl liest die gespeicherte Datei ein und gibt für jeden Teil den Medientyp, den deklarierten Zeichensatz, das Transportverfahren und den Dateinamen aus. Damit sieht man auf einen Blick, welcher Teil eine fehlende oder falsche Zeichensatzangabe hat. Ein Teil mit dem Medientyp text/plain und der Angabe None beim Zeichensatz fällt nach RFC 2045 auf den Standardwert US-ASCII zurück — und genau dort entstehen die zerlegten Umlaute.

    python3 -c "import email, email.policy; m = email.message_from_binary_file(open('nachricht.eml','rb'), policy=email.policy.default); print('Betreff:', m['subject']); [print(t.get_content_type(), '|', t.get_content_charset(), '|', t['content-transfer-encoding'], '|', t.get_filename()) for t in m.walk()]"
    
  4. 4.

    Feststellen, in welcher Kodierung die Bytes tatsächlich vorliegen

    Deklaration und Wirklichkeit auseinanderzuhalten ist der Kern der Sache. Der erste Befehl rät die tatsächliche Kodierung einer Datei anhand ihrer Bytes; der zweite prüft eine als UTF-8 gedachte Datei streng: Läuft er ohne Fehlermeldung durch, ist der Inhalt gültiges UTF-8, sonst nicht. Widerspricht das Ergebnis der Angabe aus der Kopfzeile, ist die Ursache gefunden — dann lügt die Beschriftung, und kein Empfängerprogramm kann das erraten.

    file --mime-encoding nachricht.eml
    iconv -f UTF-8 -t UTF-8 nachricht.eml > /dev/null && echo OK
    
  5. 5.

    Im eigenen Mailprogramm die Ausgangskodierung auf UTF-8 stellen

    Wenn Ihre eigenen Nachrichten beim Empfänger zerfallen, liegt es fast immer an einer alten Voreinstellung. In Thunderbird steht sie unter Einstellungen, Allgemein, ganz unten bei den erweiterten Einstellungen unter dem Namen mailnews.send_default_charset — der Wert gehört auf UTF-8. Zusätzlich gibt es dort die Einstellung, ob Antworten die Kodierung der ursprünglichen Nachricht übernehmen sollen; ist sie aktiv, schleppt eine einzige alte Mail ihre veraltete Kodierung durch den gesamten weiteren Verlauf. Wer HTML-Mails verschickt, prüft außerdem, ob das Programm den Zeichensatz im Kopf der Nachricht und im HTML-Teil identisch angibt — zwei widersprüchliche Angaben sind schlimmer als eine fehlende.

  6. 6.

    Anhänge so benennen, dass die Frage gar nicht erst aufkommt

    Der sauberste Weg ist auch der unromantischste. Dateinamen ohne Umlaute, ohne scharfes S, ohne Leerzeichen und ohne Klammern durchlaufen jedes Zwischensystem unbeschadet, weil sie ausschließlich aus Zeichen bestehen, die nie kodiert werden müssen. Der Befehl benennt eine Datei entsprechend um: Er ersetzt die Umlaute durch ihre Umschrift und Leerzeichen durch Bindestriche. Das ist keine Kapitulation vor der Technik, sondern die Einsicht, dass eine Datei, die zwei Wochen später beim Empfänger noch auffindbar sein soll, ohnehin besser ohne Sonderzeichen auskommt.

    mv 'Jahresübersicht 2026.pdf' "$(echo 'Jahresübersicht 2026.pdf' | sed -e 's/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/ß/ss/g;s/ /-/g')"
    
  7. 7.

    Bei fremden Nachrichten den Zeichensatz von Hand erzwingen

    Manchmal kann man die Ursache nicht beheben, weil sie beim Absender liegt — der Rundbrief eines Vereins etwa, der seit 2009 dieselbe Vorlage benutzt. Dann bleibt der Notausgang, die Nachricht mit einer anderen Kodierung anzuzeigen. In Thunderbird geht das über Ansicht, dann Textkodierung; Apple Mail bietet dasselbe unter Darstellung, Textkodierung. Für den Fall, dass eine gespeicherte Nachricht dauerhaft repariert werden soll, wandelt der Befehl den Inhalt von der falsch deklarierten Kodierung in UTF-8 um. Die Ausgangskodierung ist dabei die, die tatsächlich vorliegt — nicht die, die in der Kopfzeile behauptet wird.

    iconv -f ISO-8859-1 -t UTF-8 nachricht.eml > nachricht-utf8.eml
    

Häufige Fragen (FAQ)

?Im Betreff steht eine Folge wie =?utf-8?Q?Gr=C3=BC=C3=9Fe?= — was ist das?

Das ist die vorgesehene Schreibweise für Umlaute in Kopfzeilen — sichtbar geworden ist sie nur, weil ein Programm auf dem Weg sie nicht zurückgerechnet hat. RFC 2047 beschreibt das Verfahren in der Einleitung so: Bestimmte Folgen gewöhnlicher druckbarer ASCII-Zeichen, genannt encoded-words, sind für kodierte Daten reserviert; ein solches Wort beginnt mit einem Fragezeichen hinter einem Gleichheitszeichen, endet mit der umgekehrten Folge und hat zwei weitere Fragezeichen dazwischen. Es benennt einen Zeichensatz und ein Kodierverfahren und enthält den ursprünglichen Text als grafische ASCII-Zeichen. Die formale Regel in Abschnitt 2 setzt genau vier Bestandteile zusammen: die Einleitung aus Gleichheits- und Fragezeichen, den charset, das encoding, den encoded-text und den Abschluss aus Frage- und Gleichheitszeichen. Ein Mailprogramm, das den Standard umsetzt, erkennt diese Wörter und zeigt statt ihrer den ursprünglichen Text an. Sehen Sie den Rohtext, hat entweder das anzeigende Programm versagt oder ein Zwischensystem hat die Zeile so verändert, dass sie nicht mehr als encoded-word durchgeht. RFC 2047 warnt ausdrücklich vor genau dem: Unkodierte Leerzeichen innerhalb eines encoded-word sind VERBOTEN, weil ein Kopfzeilenleser sie sonst als mehrere getrennte Wörter liest.

?Der Betreff stimmt, aber im Nachrichtentext steht Grüße statt Grüße. Woran liegt das?

An der Angabe des Zeichensatzes im Nachrichtenkopf — oder an ihrem Fehlen. RFC 2045 legt in Abschnitt 5 fest, was gilt, wenn niemand etwas sagt: Der Standardwert ist einfacher Text im Zeichensatz US-ASCII, ausdrücklich anzugeben als Content-Type: text/plain; charset=us-ascii — und dieser Standardwert wird angenommen, wenn keine Content-Type-Kopfzeile vorhanden ist. Er empfiehlt zusätzlich, ihn auch bei einer syntaktisch ungültigen Content-Type-Zeile anzunehmen. Das genau ist die Falle: Ein Absender schreibt UTF-8, deklariert aber ISO-8859-1 oder gar nichts, und der Empfänger rechnet die Bytes nach der falschen Tabelle um. Aus zwei Bytes für ein ü werden dann zwei Zeichen. Die Anzeige ist also nicht kaputt, sie glaubt bloß der falschen Beschriftung. Dazu kommt die zweite Angabe, Content-Transfer-Encoding aus Abschnitt 6: Sie nennt das Transportverfahren und darf laut Standard die Werte 7bit, 8bit, binary, quoted-printable oder base64 annehmen. Stimmt diese Angabe nicht mit dem überein, was tatsächlich im Text steht, wird es ebenfalls Buchstabensalat.

?Warum heißt mein Anhang beim Empfänger anders — oder gar nicht mehr?

Weil der Dateiname in einem Parameterwert steht und Parameterwerte ursprünglich nur ASCII durften. Die Lösung dafür ist RFC 2231, der die Regeln für Parameterwerte in MIME-Kopfzeilen erweitert. Der Standard beschreibt sie so: Ein Sternchen am Ende eines Parameternamens zeigt an, dass am Anfang des Parameterwerts Zeichensatz- und Sprachangaben stehen dürfen; ein einfaches Anführungszeichen trennt Zeichensatz, Sprache und den eigentlichen Wert voneinander, und ein Prozentzeichen markiert hexadezimal kodierte Oktetts. Deshalb steht in einer korrekten Nachricht nicht filename=„Jahresübersicht.pdf“, sondern filename*=utf-8''Jahres%C3%BCbersicht.pdf. RFC 2231 erlaubt außerdem, lange Werte auf mehrere nummerierte Zeilen zu verteilen. Ältere oder schlampige Programme setzen den Umlaut stattdessen roh in den Wert oder packen ein encoded-word nach RFC 2047 hinein, was dort gar nicht vorgesehen ist — und dann heißt die Datei beim Empfänger eben anders. Praktischer Rat: Anhänge ohne Umlaute und ohne Leerzeichen benennen, dann ist die Frage erledigt, bevor sie entsteht.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Verwandte Fehler