MIME: wie Text, HTML und Anhänge in eine einzige Nachricht passen

« Blog · Von

Eine E-Mail ist ihrem ursprünglichen Entwurf nach eine schlichte Textdatei: Kopfzeilen, eine Leerzeile, Text. Sieben Bit pro Zeichen, keine Umlaute, keine Anhänge, keine Formatierung. Dass heute eine Rechnung als PDF, ein Logo im Text und zwei Fassungen desselben Schreibens in einer einzigen Nachricht stecken, verdankt sich einer nachträglichen Erweiterung: MIME.

MIME ändert am Grundprinzip nichts. Eine Nachricht ist weiterhin eine Textdatei. Alles andere wird in Text umgeschrieben und in eine Baumstruktur einsortiert, die in Kopfzeilen beschrieben ist.

Der Baum einer gewöhnlichen Geschäftsmail

Eine Nachricht mit HTML-Text, eingebettetem Logo und einem PDF-Anhang sieht innen so aus:

multipart/mixed ├ multipart/related │  ├ multipart/alternative │  │  ├ text/plain │  │  └ text/html │  └ image/png └ application/pdf Rahmen: Inhalt plus Anhänge Inhalt plus eingebettete Bilder die Nur-Text-Fassung die HTML-Fassung das Logo, angesprochen als cid:logo der eigentliche Anhang zwei Fassungen desselben Textes Der Empfänger sieht davon einen Text, ein Bild und einen Anhang.
Drei ineinandergeschachtelte Rahmen. Jeder hat eine eigene Aufgabe — und die Reihenfolge der Schachtelung ist keine Geschmacksfrage.

Die drei Rahmen und wofür sie da sind

TypBedeutungWas das Programm damit macht
multipart/mixedMehrere Teile, gleichrangigzeigt alle nacheinander an
multipart/alternativeDerselbe Inhalt in mehreren Formenzeigt einen davon — den letzten, den es darstellen kann
multipart/relatedEin Hauptteil plus zugehörige Dateienzeigt den Hauptteil und holt die übrigen bei Bedarf

Die mittlere Zeile ist die, an der sich die Reihenfolge entscheidet. Bei alternative gilt: der zuletzt aufgeführte Teil hat Vorrang. Deshalb steht die Textfassung immer vor der HTML-Fassung, niemals danach. Wer die Reihenfolge vertauscht, bekommt in Programmen, die beides könnten, den reinen Text zu sehen.

Wie die Teile voneinander getrennt werden

Da alles Text ist, braucht es eine Trennmarke. Sie steht in der Kopfzeile des Rahmens:

Content-Type: multipart/alternative; boundary="=_a7f31c9b4e2d"

--=_a7f31c9b4e2d
Content-Type: text/plain; charset=UTF-8

Guten Tag, Ihre Rechnung liegt bei.

--=_a7f31c9b4e2d
Content-Type: text/html; charset=UTF-8

<p>Guten Tag, Ihre Rechnung liegt bei.</p>

--=_a7f31c9b4e2d--

Die Marke muss zufällig genug sein, dass sie im Inhalt nicht vorkommt — sonst zerfällt die Nachricht an der falschen Stelle. Die abschließende Marke trägt zwei zusätzliche Bindestriche am Ende; fehlen sie, halten manche Programme die Nachricht für abgeschnitten.

Warum Anhänge größer werden, als sie sind

Ein PDF besteht aus beliebigen Bytes, der Nachrichtenkörper darf aber nur Text enthalten. Also wird umkodiert, meist mit Base64: je drei Bytes werden zu vier Zeichen.

Daraus folgt ein Aufschlag von ziemlich genau einem Drittel, plus Zeilenumbrüchen. Eine Datei von 15 MB belegt in der Nachricht rund 20 MB.

Das ist die Erklärung für eine häufige Überraschung: Ein Postfach mit einer Grenze von 25 MB nimmt keine 25-MB-Datei an, sondern etwa 18 MB. Die Grenze gilt für die fertige Nachricht, nicht für die Datei darin.

Für Text wird meist das sparsamere quoted-printable verwendet: Es lässt gewöhnliche Zeichen unverändert und schreibt nur die übrigen um. Daher stammen die =C3=A4-Folgen, die man in Rohfassungen sieht — das ist ein Umlaut, kein Fehler.

Eingebettetes Bild oder Anhang?

Technisch ist beides dasselbe: eine Datei in einem Teil der Nachricht. Der Unterschied liegt in zwei Kopfzeilen.

Ein eingebettetes Bild trägt eine Kennung und wird aus dem HTML darüber angesprochen:

Content-Type: image/png
Content-ID: <logo>
Content-Disposition: inline

… im HTML-Teil: <img src="cid:logo">

Ein Anhang trägt stattdessen Content-Disposition: attachment und einen Dateinamen. Nur: Die Angabe ist ein Wunsch, keine Anweisung. Manche Programme zeigen jede Datei in der Anhangsleiste an, auch die eingebettete. Deshalb sehen Empfänger unter einer Nachricht mit Logo im Kopfbereich mitunter „2 Anhänge", obwohl nur einer gemeint war.

Was daraus praktisch folgt

  • Immer eine echte Textfassung mitschicken. Nicht als Pflichtübung: Sie ist die Fassung, die ankommt, wenn HTML nicht dargestellt werden kann — und ein leerer oder mit „Diese Nachricht benötigt HTML" gefüllter Textteil fällt bei der Bewertung auf.
  • Reihenfolge in alternative beachten. Erst Text, dann HTML.
  • Große Dateien nicht anhängen, sondern verlinken. Der Aufschlag von einem Drittel trifft jede Zwischenstation, und jede hat eine eigene Obergrenze.
  • Den Zeichensatz je Teil setzen. Er steht nicht global, sondern in jedem Content-Type — ein fehlender oder falscher Wert ist die häufigste Ursache für unlesbare Sonderzeichen.

Selbst hineinsehen

Jedes Mailprogramm kann den Quelltext einer Nachricht anzeigen. Darin steht der ganze Baum offen da: die Trennmarken, die Typen, die Kodierungen. Wer einmal nachgesehen hat, warum ein bestimmter Anhang beim Empfänger anders heißt oder warum ein Bild nicht erscheint, findet die Antwort dort in aller Regel innerhalb weniger Zeilen — es ist eine Textdatei, und sie ist so aufgebaut, dass ein Mensch sie lesen kann.