Was ist MIME und warum
Die Betonung liegt auf E
Base64
MIME Mails und PERL
Andere Möglichkeiten
Was ist MIME und warum
Bevor es den MIME (Multipurpose Internet Mail Extensions) Standard gab, konnten an Internet eMails keine Attachments (Images, Binärdateien) angehängt werden. Dieses Manko war im Wesentlichen die treibende Kraft um einen Standard zu machen womit eMails auch mit Dateianhängen verschickt werden können.
Eine wichtige Forderung bei der Einführung von MIME war, dass das Protokoll der Übertragung (SMTP: Simple Mail Transfer Protocol) dabei unangetastet bleiben muss. Und dieses Protokoll besagt, dass eine eMail nur aus Text zu bestehen hat oder anders ausgedrückt: Eine eMail ist keine Binärdatei.
Einem Mail Transfer Agent (abgk.: MTA) wie zum Beispiel das auf UNIX und LINUX Maschinen verbreitete "sendmail" ist es infolgedessen ganz egal ob eine eMail Attachments enthält oder nicht, weil mit der Einführung von MIME auch eine eMail mit Attachments nur aus reinem Text besteht. Mit dem MIME Standard wurde außerdem eine Möglichkeit geschaffen eMails mit verschiedenen Zeichensätzen zu erstellen, zu versenden und zu lesen.
Die Betonung liegt auf E
Wie im vorangehenden Abschnitt klargelegt wurde, ändert sich nichts am Protokoll SMTP, also auch nichts am Übertragungsweg und völlig uninteressant ist es ob als MTA sendmail oder ein anderer Mail Transfer Agent eingesetzt wird.
MIME ist eine Erweiterung welche besagt wie mit "textlichen Mitteln" Attachments in eine eMail eingebaut und Zeichensätze festgelegt werden können. Um es vorweg zu nehmen: Attachments (Dateianhänge) in diesem Sinne gibt es eigentlich gar nicht. Denn auch mit einem Attachment ist eine MIME Mail immer noch eine einzige Datei. Das Attachment stellt lediglich einen speziellen "Text" - Abschnitt in dieser Maildatei dar.
Die Einführung von MIME hat somit zwei wesentliche Konsequenzen:
- ein MailClient muss empfängerseitig zu verstehen wissen ob eine MIME Mail vorliegt, muss Zeichensätze erkennen und muss Attachments von Text trennen können,
- ein MailClient muss senderseitig die Möglichkeit bieten MIME Mails erstellen zu können.
Damit wird deutlich, dass die Implementierung von MIME, also die Extension lediglich eine Frage des eMail Clients (bekannte eMail Clients sind Eudora, Pegasus, Outlook Express...) ist.
Zum Anschauen einer MIME Mail erstellen Sie einfach einmal mit einem trivialen Mailprogramm eine Mail mit einem ZIP File als Attachment. Der MailClient sollte die Möglichkeit bieten in den Quelltext schauen zu können. Sofern Sie Outlook Express verwendet haben mit den Standardeinstellungen werden Sie im Quelltext u.a. die folgenden Zeilen finden:
From: "interaktiv.net" <info@yahoo.com>
To: "otto" <otto@interaktiv.xyz>
Subject: test
Date: Tue, 30 Oct 2001 20:56:00 +0100
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_001E_01C16185.4779E500"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 5.00.2919.6600
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6600
|
Wobei der Content-Type: multipart/mixed; bedeutet, dass diese Mail aus mehreren Teilen besteht. Für die einzelnen "Teile" sind wiederum jeweils eigene Content-Type's definiert. Die einzelnen "Teile" einer MIME Mail sind durch den in der boundary Zeile deklarierten String getrennt. Doch schauen wir weiter:
This is a multi-part message in MIME format.
------=_NextPart_000_001E_01C16185.4779E500
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
text...
|
Bis hierhin ist der Zeichensatz für die Message definiert und natürlich die Message selbst.
Und weiter gehts:
------=_NextPart_000_001E_01C16185.4779E500
Content-Type: application/x-zip-compressed;
name="board.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="board.zip"
UEsDBBQAAgAIAESlVit+0N/QpQwAACUgAAANAAAAZ3Vlc3R
ib29rLmNnaa1Z63YTRxL+bc7hHcpjxdgg6wK57CLJX und so weiter...
|
Hier also steht der Anhang als schlichter TextBlock mit konstanter Zeilenlänge, im Content-Type lesen wir dass es eine ZIP Datei ist, name und filename stehen ebenfalls bereit zum Abruf, das ZIP File selbst ist der hier nur andeutungsweise notierte Block mit den vielen vielen Buchstaben und Zahlen (76 Zeichen je Zeile). Zum Verständnis dieser Kodierung müssen wir uns mit einem neuen Begriff anfreunden: Base64...
Base64
... ist der Standard wie Klartext oder Binaries URL encodet (verschlüsselt für die Übertragung ins Internet) wird. Wenn Sie z.B. eine Seite aufrufen wo Benutzername und Passwort verlangt wird, werden diese beiden Angaben mit Base64 encodet im Header des HTTP Requests zum Web Server übertragen. Dieser wiederum kennt den Base64 Mechanismus und liest aus dem HTTP Header den Benutzernamen und das Passwort aus. Die letztliche Authentifikation nach Benutzer und Passwort erfolgt schließlich anhand anderer, von Base64 unabhängigen Algorithmen (Apache, .htaccess).
Die Kodierung eines Attachments, also einer Binärdatei in den o.g. TextBlock mit 76 Zeichen pro Zeile erfolgt ebenfalls nach dem Base64 Algorithmus.
Für Base64 gibt es PERL Module wie z.B. MIME::Base64 (Standard in Perl 5). Auch damit lässt sich aus einer Binärdatei ein Attachment erstellen, d.h. nicht ganz:
MIME::Base64 bietet lediglich die Routine zum Erstellen des TextBlockes aus der Binärdatei. Zum Anschaulich Machen von Base64 erstellen Sie einfach einmal eine beliebige ZIP Datei. Im gleichen Verzeichnis erstellen Sie außerdem das folgende PERL Script:
#!/usr/bin/perl
use MIME::Base64 qw(encode_base64);
$zipfile = "board.zip";
open ZIP, $zipfile or die $!;
binmode ZIP;
while (<ZIP>) { $zip .= $_; }
close ZIP;
print encode_base64($zip);
|
Der Aufruf dieses Scripts zeigt Ihnen je nach Größe der ZIP Datei mehr oder weniger viele Textzeilen - das sind genau solche Zeilen wie im vorhergehenden Abschnitt bereits beschrieben worden sind und das sind auch diejenigen Zeilen mit denen ein BinaryFile nach Text umgewandelt wird um es per SMTP übertragen zu können.
MIME Mails und PERL
Sowohl zum Erstellen von MIME Mails mit PERL als auch zum Parsen von MIME Mails mit PERL gibt es Module welche das Scripten sehr erleichtern (das Modul Mail::Sender wurde bereits an anderer Stelle auf interaktiv.net beschrieben):
MIME::Lite ist das Modul schlechthin zum Erstellen von MIME Mails. Sollen Attachments erstellt werden, müssen die anzuhängenden Dateien auf dem lokalen System, d.h. auf der Festplatte des Servers vorliegen. Mit den Methoden in MIME::Lite wird das Erstellen vom Mails mit Attachment zum Kinderspiel, die Mail läßt sich einschließlich Mail Header komplett zusammenstellen und wird dann einfach als TextString an den MTA (sendmail) übergeben.
MIME::Parse ist ein Modul mit welchem einen MIME Mail empfängerseitig geparst (Abtrennen der Attachments) werden kann.
Andere Möglichkeiten
Einmal angenommen auf dem Server soll eine MIME Mail zum Polling (Abruf) bereitgestellt werden ohne das zusätzliche Module wie z.B. MIME::Lite auf dem Server installiert sein müssen.
Solch eine Mail kann dann fix und fertig mit einem x-beliebigen MailClient erstellt, der Quelltext herauskopiert und ins CGI eingebunden werden. Nur allzu logisch ist, dass dabei lediglich nur eine einzige Datei auf dem Server abgelegt werden muss, denn der "Anhang ist ja schon drin".
Das oben gezeigte PERL CGI legt die hochgeladene Datei zunächst auf dem Server an. Das birgt eine gewisse Gefahr in sich weil andere Prozesse ebenfalls gleichzeitig auf dieselbe Datei schreibenderweise zugreifen könnten. Im schlimmsten Fall erhält der Empfänger die Mail mit einem anderen oder defekten Anhang. Um dies zu verhindern ist einwenig mehr Programmieraufwand nötig worauf in diesem Artikel jedoch nicht weiter eingegangen jedoch zumindest hingewiesen werden soll.
Eine andere Möglichkeit besteht indes darin das File Upload so zu gestalten, dass die Datei nicht physisch auf die Festplatte des Servers geschrieben sondern lediglich im Speicher gehalten, dort auch encodet und auf print dem Mail Transfer Agent übergeben wird.
|