PHP4-Forum
Forum | Befehle | MySQL | Beispiele | Newsletter | Suche | Home

Untermenü

Erweitertes
Reguläre Ausdr.
MIME-Mail
PHP und WAP
Crontab
HTTP-Header
Klassen, Objekte

Zu dieser Seite

MIME-Mail
MIME-Mail

Auch in PHP kann man Datei-Anhänge per eMail verschicken. Hierzu muss man allerdings die Funktionsweise, bzw. den Standard hierzu kennenlernen. eMails mit Anhang müssen nämlich im sog. MIME-Format verschickt werden. Wie dies in der Praxis aussieht, möchten wir im Folgenen erklären.

Um so eine eMail zu versenden, kann man nicht mehr auf die übliche PHP-Methode zurückgreifen, und den Text im Mail-Body schreiben (dritter Parameter bei der mail()-Funktion), sondern muss alles im Mail-Header angeben (vierter Parameter). Zunächst muss klar gemacht werden, dass es sich um eine MIME-Mail handelt. Hierzu wird im Header die folgende Zeile eingefügt:
MIME-Version: 1.0

Anschließend wird angegeben, dass es sich um eine mehrteilige Nachricht handelt. Hierbei muss eine Kombination aus Zeichen ohne Sonderzeichen (also Zahlen, Buchstaben und Striche) angegeben werden, die später die Trennung von den einzelnen Abschnitten in der eMail deutlich macht (auch Boundary genannt). Das Boundary in unserem Beispiel generieren wir mit dem Folgenden Befehl:
$boundary = strtoupper(md5(uniqid(time())));
Das könnte dann folgendes Ergebnis ergeben:
Content-Type: multipart/mixed; boundary=4BC48A1C8272858A7BAF9DF8782062C2

Jetzt kann nach einer Leerzeile (\n\n) eine Nachricht angegeben werden, die die eMail-Programme sehen, wenn sie nicht MIME unterstützen (so ziemlich jedes Programm kennt allerdings MIME).

Dann beginnt der erste MIME-Teil. Eingeleitet von einem doppelten Strich (--) gefolgt von unserem Boundary beginnt der Header für den ersten Teil. Hier wird der MIME-Typ angegeben (bei purem Text text/plain und bei einer HTML-Mail text/html):
--4BC48A1C8272858A7BAF9DF8782062C2
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

Nun können Sie Ihr Herz ausschütten mit Worten, die als normaler Mail-Text beim Empfänger erscheinen sollen.
Hallo, im Anhang findest du eine Datei!

Ist auch dieser Teil beendet, so kann der zweite MIME-Teil beginnen. Eingeleitet wird dieser wieder mit den zwei Strichen und unserem boundary. Da wir jedoch diesmal eine Datei (in diesem Beispiel eine ZIP-Datei) benutzen möchten, muss auch der Header geändert werden:
--4BC48A1C8272858A7BAF9DF8782062C2
Content-Type: application/x-zip-compressed; name="datei.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="datei.zip"

Hier ist nun eine sehr wichtige Zeile drin: Content-Transfer-Encoding: base64. Dateien mit binärem Inhalt (also ZIP-Dateien, Word-Dokument, Bilder, ...) müssen in das Format base64 codiert werden. PHP bringt zum Glück die entsprechende Funktion mit: base64_encode(). Zusätzlich muss aber beachtet werden, dass eine Zeilenlänge von 72 Zeichen nicht überschritten werden darf. Hierzu kann man den Inhalt der Datei zusätzlich auf die Funktion chunk_split() anwenden. Das Ergebnis ist also: $datei_inhalt=chunk_split(base64_encode($datei_inhalt));
Da in den meisten Fällen nur der Datei-Name vorhanden ist (falls die Datei frisch mit dem Browser auf den Server geladen wurde sogar nur der temporäre), lässt sich der Befehl noch komplizierter machen und den Dateiinhalt direkt umgewandelt in eine Variable schreiben:
$dateiname="datei.zip"; // Dateiname der Datei auf dem Server
$datei_inhalt = chunk_split(base64_encode(fread(fopen($dateiname, "r"), filesize($dateiname))));

Nach dem also der Datei-Inhalt richtig codiert und formatiert ausgegeben wurde, muss noch eine Zeile hinterhergesendet werden, dass die eMail zu beendet ist. Hierbei handelt es sich wiedereinmal um die zwei Striche, gefolgt von dem Boundary der wiederum von zwei Strichen gefolgt ist:
--4BC48A1C8272858A7BAF9DF8782062C2--

Dies war die Theorie zum Versenden von eMails mit Datei-Anhang. Wie das in der Praxis aussehen könnte, ist unter den dateibasierten Beispielen zu finden.
Dienstleistungen | Werbung | Impressum | Sitemap | Kontakt | Email © 1999 - 2013 | Last Update: 27.11.2002