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.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.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.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.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.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.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.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