MIME-Typen
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:
- 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. - 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. - 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 zutext/html
);multipart/related
zur Angabe von miteinander verknüpften Inhalten (beispielsweise in HTML-Code eingebettete Grafiken); sowiemultipart/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.