MIME-Typen

Inhalte dieser Sektion:

Unser Email-Programm ist inzwischen schon soweit gediehen, dass es problemlos in der Praxis eingesetzt werden kann. Aber es gibt natürlich noch diverse Verbesserungs-Möglichkeiten, wie z.B. die Verwendung von HTML-Code oder das Anfügen von Datei-Anhängen.

Hier kommen nun die MIME-Typen ins Spiel. MIME steht für engl. Multipurpose Internet Mail Extensions. Für eine detaillierte Beschreibung des MIME-Standards sei an dieser Stelle auf die entsprechende Sektion von SELFHTML verwiesen, für unsere Zwecke ist vor allem wichtig, dass sich eine E-Mail mittels MIME-Typen in verschiedene Teile untergliedern lässt, deren Daten dann abhängig vom angegebenen Typ interpretiert werden können.

Eine derartige Angabe befindet sich auch bereits in unserem Skript:

Content-Type: text/plain;
	charset="iso-8859-1"

An dieser Stelle könnten wir nun also einfach den MIME-Typ text/plain durch text/html ersetzen, um dem E-Mail-Programm des Anwenders mitzuteilen, dass der folgende Text als HTML interpretiert werden soll.

Allerdings sollte man sich hier der Nachteile bzw. auftretenden Problemstellungen bewusst sein:

  1. Darstellungsunterschiede in verschiedenen E-Mail-Programmen:
    Jeder Web-Designer kennt wohl das leidige Thema der Browser-Kompatibilität. Bei Darstellung von HTML in E-Mail-Programmen artet dieses Problem zu einem wahren Monster aus: Viele Programme ignorieren Formattierungen mittels CSS, andere interpretieren das Markup auf die abenteuerlichste Art und Weise, und einige können mit HTML gar nichts anfangen und geben den Quelltext unbehandelt aus.
    Allzu komplexer Code sollte also vermieden werden.
  2. Individuelle User-Konfiguration:
    Aufgrund von Sicherheitsbedenken haben viele Anwender potentielle Gefahrenquellen im HTML-Code, wie z.B. die Anzeige von Grafiken, das Ausführen von Javascripts usw. deaktiviert.
    Auf derartige Elemente (insb. Javascript) sollte deshalb nach Möglichkeit komplett verzichtet werden.
  3. Wachsende Größe der E-Mails:
    Auf den ersten Blick erscheint es unerheblich, ob man nun simplen Text oder Text mit HTML-Code verschickt, der dann vielleicht doppelt so viele Zeichen enthält. Allerdings werden automatisierte E-Mail-Skripts ja oft für Newsletter o.Ä. verwendet, die dann vielleicht an hunderte oder gar tausende Empfänger verschickt werden, und hier kann sich die gesteigerte Datenmenge dann sehr wohl bemerkbar machen.

Die Vor- und Nachteile einer HTML-E-Mail sollten also sorgfältig gegeneinander abgewogen werden. Von einer reinen HTML-E-Mail ist jedoch in jedem Fall abzuraten, da manche Anwender hier gar keine sinnvollen Informationen erhalten würden.
Sinnvoll wäre hingegen eine E-Mail, die modernen Programmen eine HTML-Umgebung bietet, für nicht HTML-fähige Programme allerdings zudem einen text/plain-Abschnitt bereithält.

Wie bereits vermutet, gibt es hierfür auch tatsächlich passende MIME-Typen:

  • multipart/alternative zur Auszeichnung von verschiedenen, alternativen Inhalten (z.B. text/plain alternativ zu text/html);
  • multipart/related zur Angabe von miteinander verknüpften Inhalten (beispielsweise in HTML-Code eingebettete Grafiken); sowie
  • multipart/mixed für mehrere unabhängige Datentypen (Nachricht und Datei-Anhang).

Mittels dieser MIME-Typen kann die E-Mail in verschiedene Bereiche unterteilt werden. Der Syntax ist hierbei immer wie folgt:

Content-Type: multipart/[...];
	boundary="beliebiger_Trennstring"

This is a multi-part message in MIME format.
--beliebiger_Trennstring
Content-Type: [...]

[erster Datensatz]

--beliebiger_Trennstring
Content-Type: [...]

[zweiter Datensatz]

[...]
--beliebiger_Trennstring--

Zu beachten:

  • multipart/[...] steht für einen der drei genannten Typen.
  • Durch die Definition eines frei wählbaren Trennstrings (engl. boundary, im Beispiel "beliebiger_Trennstring") lassen sich die Folge-Daten in mehrere Teile untergliedern.
  • Jeder nun folgende Datentyp wird nun durch --beliebiger_Trennstring und der MIME-Zuweisung eingeleitet.
  • Sind sämtliche Daten abgearbeitet, wird durch --beliebiger_Trennstring-- das Ende des Multipart-Teils angegeben.

Hinweise:

  • Der Trennstring sollte so gewählt werden, dass weitgehend ausgeschlossen werden kann, dass der String innerhalb eines Datensatzes durch Zufall vorkommt! Ansonsten würde an dieser Stelle der Datensatz abgeschnitten werden.
  • Der Hinweis "This is a multi-part message in MIME format." ist nicht zwingend notwendig; Er soll lediglich eine Minimal-Information für Benutzer darstellen, deren E-Mail-Programm mehrteilige E-Mails nicht korrekt anzeigt.

Im Folgenden wird das Mail-Script also so ausgebaut, dass auch derartige E-Mail-Typen realisiert werden können.

Alternative Inhalte - Plain-Text und HTML parallel

	#Boundaries bestimmen
	my $boundary_alt = "++webmailboundary_alt++";
	my $boundary_rel = "++webmailboundary_rel++";
	my $boundary_mixed = "++webmailboundary_mixed++";

	###
	# Mail-Programm starten
	###
	if ( open(MAIL,"|$mailprog -t") ) {

		#Mailheader
		print MAIL "To: $mail{'to'}\n";
		print MAIL "From: $mail{'from'}";
		print MAIL " ($mail{'namefrom'})" if ( exists($mail{'namefrom'}) );
		print MAIL "\n";
		print MAIL "Cc: $mail{'cc'}\n" if ( exists($mail{'cc'}) );
		print MAIL "Bcc: $mail{'bcc'}\n" if ( exists($mail{'bcc'}) );
		print MAIL "Subject: $mail{'subject'}\n";
		print MAIL "MIME-Version: 1.0\n";

		#Mail-Subheader, wenn HTML-Teil vorhanden
		if ( exists($mail{'htmltext'}) ) {
			print MAIL "Content-Type: multipart/alternative;\n\t
				\"boundary=$boundary_alt\"\n\n";
			print MAIL "This is a multi-part message in MIME format.\n";
			#Plain-Text
			print MAIL "--$boundary_alt\n";
		}

		#Plain-Text
		print MAIL "Content-Type: text/html;\n\tcharset=\"iso-8859-1\"\n\n";
		print MAIL "$mail{'text'}\n\n";

		#Mail-Subheader, wenn HTML-Teil vorhanden
		if ( exists($mail{'htmltext'}) ) {
			#HTML-Text
			print MAIL "--$boundary_alt\n";
			print MAIL $mail{'htmltext'};
			#Mail-Boundary schließen
			print MAIL "\n--$boundary_alt--";
		}

Erklärung

Anfangs definieren wir unsere Boundaries, die -wie bereits erwähnt- beliebig gewählt werden können. Der folgende Code ist bis zur Zeile print MAIL "MIME-Version: 1.0\n"; unverändert. Danach wird nun aber, sofern ein HTML-Text vorhanden ist, eine Multipart-Verzweigung erstellt. Ist diese nicht vorhanden, wird lediglich der plain-text ausgegeben.

Hinweis

Es empfiehlt sich, den plain-text vor dem HTML-Text anzugeben: Falls ein Anwender-Programm die E-Mail nicht als multi-part erkennt und den gesamten Text angibt, erhält der Anwender so den gut lesbaren Text anstelle des HTML-Codes.

« Sicherheits-Abfragen
Diskussion »