PHP: E-Mails verschicken
Mit der PHP-Funktion mb_send_mail() ist es möglich, E-Mails abzusenden, sofern diese Funktion serverseitig unterstützt wird. Auf entfernten Servern sollte dies in der Regel der Fall sein. In einer lokalen Entwicklungsumgebung wird man mit dieser Funktion hingegen wahrscheinlich Probleme haben. Daher muss man die hier beschriebenen Beispiele erst auf einen entfernten Server hochladen, um sie testen zu können.
Das folgende Skript veranschaulicht die Grundformulierung der mb_send_mail()-Funktion:
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "Nur-Text-Mail";
$body .= "Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. Naisjakefein defetot seteuke re Jeschefe. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.".$eol.$eol;
$body .= "Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
Die Funktion mb_send_mail() benötigt vier Angaben: Die Zieladresse ($to), den Betrefftext ($subject), den eigentlichen E-Mail-Text ($body) sowie Angaben zum E-Mail-Header ($header). Die ersten drei Angaben sollten sich selbst erklären, während die Angaben für den E-Mail-Header sich nicht unbedingt intuitiv erschließen lassen.
Der Header enthält Informationen, die für den Transport und die Darstellung der Mail in einem entsprechenden Client-Programm von Bedeutung sind. Zum Vergleich kann man sich einmal den Quelltext einer E-Mail in einem solchen Programm ansehen.
Wichtig sind vor allem der MIME-Typ, die Zeichenkodierung und die Transferkodierung. Was es mit diesen Angaben genau auf sich hat, sollte im weiteren Verlauf dieses Tutorials deutlich werden, wenn E-Mails erzeugt werden, die aus mehreren Teil bestehen. Weiterhin wird der Absender mit Namen und E-Mail-Adresse angegeben (Zeile 15).
Die Funktion mb_send_mail() gehört zu den Multibyte-Funktionen von PHP und stellt somit sicher, dass Zeichen außerhalb des ASCII-Zeichensatzes (ein Byte pro Zeichen) korrekt übermittelt werden. Um diese Funktionen verwenden zu können, muss mit mb_internal_encoding() zunächst die gewünschte Zeichenkodierung in Zeile 2 angegeben werden.
Bei der Erzeugung des Quelltextes einer E-Mail sind die Zeilenumbrüche besonders zu beachten. Damit es hier zu keinen Problemen kommt, sollte man das Zeichen für den Zeilenumbruch von PHP ermitteln lassen (PHP_EOL in Zeile 3) und die entsprechende Variable für die Umbrüche verwenden.
HTML-Mails
Das Beispiel oben erzeugt nun eine gewöhnlich Nur-Text-Mail ohne jede Formatierungen. Dies wird durch die Angabe Content-Type: text/plain angezeigt. Es ist aber auch möglich, E-Mails als HTML zu verschicken. Dabei wird der Body der E-Mail wie eine ganz normale HTML-Seite angelegt. Beim Absenden muss dann allerdings die Angabe Content-Type: text/html gemacht werden.
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "HTML-Mail";
$body = "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
$body .= "<h3>HTML-Mail</h3>";
$body .= "<p>Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. <span><b>Naisjakefein defetot seteuke re Jeschefe</b></span>. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.</p>";
$body .= "<p>Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.</p>";
$body .= "</body></html>";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
Die Zeilen einer E-Mail werden im Quelltext üblicherweise nach 76 Zeichen umgebrochen. Dies geschieht mit PHP automatisch. Selbst wenn der Umbruch innerhalb eines Wortes oder gar eines HTML-Tags erfolgt, sollte die E-Mail von einem Client-Programm korrekt dargestellt werden, da es die Umbrüche vor der Darstellung in der Regel wieder entfernt.
Die Verwendung von CSS in HTML-E-Mails kann eine Herausforderung sein, da manche Webmailer oder möglicherweise auch E-Mail-Clients den Quelltext der Mail vor der Darstellung umschreiben und dabei Style-Sheet-Angaben verloren gehen, wenn sie an der ›falschen‹ Stelle gemacht wurden. Das muss man im Einzelfall testen. Eine sichere wenn auch umständliche Methode ist die Notierung der CSS-Formatierungen als Inline-Styles über das style-Attribut in den HTML-Tags. Weitere Überlegungen zu diesem Thema gibt es bei A List Apart.
Mehrteilige E-Mails (multipart/alternative)
Werden HTML-E-Mails verschickt, sollte man den Body der Mail zusätzlich als Nur-Text-Version mitschicken, da es sein kann, dass der Empfänger die Mail mit einem Programm lesen möchte, das HTML nicht unterstützt. Daher muss man den Inhalt der Mail nun in zwei unabhängige Abschnitte aufteilen. Dieses Verfahren wird in abgewandelter Weise ebenfalls für Mails angewendet, die Datei-Anhänge oder Bilder innerhalb des Bodys enthalten.
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "Nur-Text- mit HTML-Mail";
$p1 = "Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. Naisjakefein defetot seteuke re Jeschefe. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.";
$p2 = "Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.";
$boundary1 = "x------------plain_text_and_html";
# Hier beginnt der Nur-Text-Teil
$body = "--".$boundary1.$eol;
$body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $p1.$eol.$eol.$p2.$eol.$eol;
# Hier beginnt der HTML-Teil
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
$body .= "<h3>HTML-Mail</h3>";
$body .= "<p>".$p1."</p>";
$body .= "<p>".$p2."</p>";
$body .= "</body></html>".$eol.$eol;
# Hier endet der Mail-Body
$body .= "--".$boundary1."--";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: multipart/alternative;".$eol;
$header .= " boundary=\"".$boundary1."\"".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
Die verschiedenen Teile der Mail werden durch eine so genannte boundary von einander getrennt. Die Zeichenkette dafür ist prinzipiell frei wählbar, darf aber nur ASCII-Zeichen enthalten. Diese Trennung wird nun am Anfang jedes einzelnen Teils angegeben, wobei ihr immer zusätzlich zwei Minuszeichen -- vorangestellt werden müssen (Zeilen 10, 16 und 26), damit der Interpreter des Quelltextes erkennt, dass an dieser Stelle der Trennstring folgt. Darauf folgen die Angaben für Content-Type und Content-Transfer-Encoding des jeweiligen Teils. Am Ende des letzten Teils wird die Mail mit der Trennung abgeschlossen, wobei die zwei Minuszeichen dort zusätzlich noch ans Ende des Strings angefügt werden (Zeile 26). Die Position und Anzahl der Zeilenumbrüche sind zu beachten, da es sonst zu Fehlern bei der Interpretation des Quelltextes der Mail kommen kann.
Schließlich werden im Header der Mail der Content-Type: multipart/alternative sowie der Trennstring und die Transferkodierung angegeben (Zeilen 33 bis 35).
E-Mails mit Anhängen (multipart/mixed)
Bei einer normalen Nur-Text-Mail werden die Anhänge ähnlich wie im obigen Beispiel der HTML-Mail in separaten Bereichen aufgeführt, die auch hier durch einen Trennstring von einander unterschieden werden.
Da E-Mails immer als Textdatei verschickt werden, müssen die Dateien, die angehängt werden sollen, erst entsprechend kodiert werden. Dies geschieht mit der Funktion base64_encode().
Um eine Datei nach Base64 zu kodieren, kann man folgendes PHP-Konstrukt auf die Datei anwenden:
$data = chunk_split(base64_encode(file_get_contents($path_to_file)));
In den folgenden Beispielen sind die Anhänge bereits in kodierter Form im Quelltext der Mail angegeben (Zeilen 24 bis 27 und 38 bis 68).
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "Mail mit Anhängen";
$p1 = "Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. Naisjakefein defetot seteuke re Jeschefe. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.";
$p2 = "Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.";
$boundary1 = "x------------mail_with_attachments";
# Hier beginnt der Nur-Text-Teil
$body = "--".$boundary1.$eol;
$body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $p1.$eol.$eol.$p2.$eol.$eol;
# Hier beginnt der erste Anhang
$filename = "ÄÜÖ.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: application/octet-stream;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment;".$eol;
$body .= " filename=\"".$filename."\"".$eol.$eol;
$body .= "R0lGODlhDwAPALMOAP/qAEVFRQAAAP/OAP8AAP/JAP+0AP6dAP/9E//+k///x///6zMzM//l
AAAAAAAAACH5BAEAAA4ALAAAAAAPAA8AAARd0EkZap3Y1aVSGhcWcAgCnMMRTEEnCCfwpquW
mHEOagoOn7+CKnADxoKGSiLHBBSSAROjCWA8KwPZa7sVrgJZAWE8FhR2msGgESAHziqWutB+
0zIVg94wzLAsNRMRADs=".$eol.$eol;
# Hier beginnt der zweite Anhang
$filename = "äöüß.rtf";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: application/octet-stream;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment;".$eol;
$body .= " filename=\"".$filename."\"".$eol.$eol;
$body .= "e1xydGYxXGFuc2lcZGVmZjNcYWRlZmxhbmcxMDI1CntcZm9udHRibHtcZjBcZnJvbWFuXGZwcnEy
XGZjaGFyc2V0MCBUaW1lcyBOZXcgUm9tYW47fXtcZjFcZnJvbWFuXGZwcnEyXGZjaGFyc2V0MiBT
eW1ib2w7fXtcZjJcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBBcmlhbDt9e1xmM1xmcm9tYW5cZnBy
cTJcZmNoYXJzZXQwIFRpbWVzIE5ldyBSb21hbjt9e1xmNFxmc3dpc3NcZnBycTJcZmNoYXJzZXQw
IEFyaWFsO317XGY1XGZzd2lzc1xmcHJxMlxmY2hhcnNldDEgRGVqYVZ1IFNhbnM7fXtcZjZcZm5p
bFxmcHJxMlxmY2hhcnNldDAgQXJpYWwgVW5pY29kZSBNUzt9e1xmN1xmbmlsXGZwcnEyXGZjaGFy
c2V0MCBGcmVlU2Fuczt9e1xmOFxmc3dpc3NcZnBycTBcZmNoYXJzZXQxIEZyZWVTYW5zO319Cntc
Y29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODt9Cntc
c3R5bGVzaGVldHtcczBcc25leHQwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlwaGxlYWQyXGh5
cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUyMDUyXGRiY2hc
YWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzEgTm9ybWFsO30Ke1xzMTVc
c2Jhc2Vkb24wXHNuZXh0MTZcc2IyNDBcc2ExMjBca2VlcG5cZGJjaFxhZjZcZGJjaFxhZjdcYWZz
MjhcbG9jaFxmNFxmczI4IFx1MjIwXCdkY2JlcnNjaHJpZnQ7fQp7XHMxNlxzYmFzZWRvbjBcc25l
eHQxNlxzYjBcc2ExMjAgVGV4dGtcdTI0NlwnZjZycGVyO30Ke1xzMTdcc2Jhc2Vkb24xNlxzbmV4
dDE3XHNiMFxzYTEyMFxkYmNoXGFmOCBMaXN0ZTt9CntcczE4XHNiYXNlZG9uMFxzbmV4dDE4XHNi
MTIwXHNhMTIwXG5vbGluZVxpXGRiY2hcYWY4XGFmczI0XGFpXGZzMjQgQmVzY2hyaWZ0dW5nO30K
e1xzMTlcc2Jhc2Vkb24wXHNuZXh0MTlcbm9saW5lXGRiY2hcYWY4IFZlcnplaWNobmlzO30KfXtc
aW5mb3tcYXV0aG9yIEhvbGdlciBLb2NofXtcY3JlYXRpbVx5cjIwMTRcbW8xMFxkeTIzXGhyMTBc
bWluMjZ9e1xyZXZ0aW1ceXIwXG1vMFxkeTBcaHIwXG1pbjB9e1xwcmludGltXHlyMFxtbzBcZHkw
XGhyMFxtaW4wfXtcY29tbWVudCBMaWJyZU9mZmljZX17XHZlcm42NzE3NTE3MH19XGRlZnRhYjcw
OQpcdmlld3NjYWxlNjkKe1wqXHBnZHNjdGJsCntccGdkc2MwXHBnZHNjdXNlNDUxXHBnd3N4bjEx
OTA2XHBnaHN4bjE2ODM4XG1hcmdsc3huMTEzNFxtYXJncnN4bjExMzRcbWFyZ3RzeG4xMTM0XG1h
cmdic3huMTEzNFxwZ2RzY254dDAgU3RhbmRhcmQ7fX0KXGZvcm1zaGFkZVxwYXBlcmgxNjgzOFxw
YXBlcncxMTkwNlxtYXJnbDExMzRcbWFyZ3IxMTM0XG1hcmd0MTEzNFxtYXJnYjExMzRcc2VjdGRc
c2Jrbm9uZVxzZWN0dW5sb2NrZWQxXHBnbmRlY1xwZ3dzeG4xMTkwNlxwZ2hzeG4xNjgzOFxtYXJn
bHN4bjExMzRcbWFyZ3JzeG4xMTM0XG1hcmd0c3huMTEzNFxtYXJnYnN4bjExMzRcZnRuYmpcZnRu
c3RhcnQxXGZ0bnJzdGNvbnRcZnRubmFyXGFlbmRkb2NcYWZ0bnJzdGNvbnRcYWZ0bnN0YXJ0MVxh
ZnRubnJsYwpccGduZGVjXHBhcmRccGxhaW4gXHMwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlw
aGxlYWQyXGh5cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUy
MDUyXGRiY2hcYWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzF7XHJ0bGNo
IFxsdHJjaFxsb2NoXGxvY2hcZjUKTnVyIGVpbiBUZXN0Li4ufQpccGFyIH0=".$eol.$eol;
# Hier endet der Mail-Body
$body .= "--".$boundary1."--";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: multipart/mixed;".$eol;
$header .= " boundary=\"".$boundary1."\"".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
Da die Anhänge Teile der E-Mail sind, die nicht dargestellt werden, muss die Information Content-Disposition: attachment angegeben werden (Zeilen 22 und 36). Für kodierte Dateien lautet die Content-Transfer-Encoding: base64. Der MIME-Typ der Datei kann explizit angegeben werden (z. B. Content-Type: image/gif), da dies aber unter Umständen dazu führt, dass das E-Mail-Programm des Empfängers versucht, diese Datei dennoch bereits in der E-Mail-Ansicht darzustellen, verwende ich lieber Content-Type: application/octet-stream. Sowohl für Content-Type als auch für Content-Disposition muss zusätzlich der Name der Datei angegeben werden, der aber mit mb_encode_mimeheader() kodiert werden sollte, um Multibyte-Zeichen korrekt zu übermitteln.
Für die E-Mail selbst wird Content-Type: multipart/mixed angegeben (Zeile 78).
HTML-Mails mit Anhängen
Jetzt wird das Skript schon etwas komplexer. Um eine HTML-Mail zu verfassen, die zusätzlich eine Nur-Text-Version sowie Anhänge enthält, müssen die einzelnen Bestandteile etwas verschachtelt werden. Dazu benötigt man nun zwei Trennstrings.
Schematisch sieht das etwa so aus:
--x------------mail_with_attachments
--x------------plain_text_and_html
Nur-Text-Version
--x------------plain_text_and_html
HTML-Version
--x------------plain_text_and_html--
--x------------mail_with_attachments
Anhang1
--x------------mail_with_attachments
Anhang2
--x------------mail_with_attachments--
Daraus ergibt sich für unser Beispiel folgendes Skript:
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "HTML-Mail mit Anhängen";
$p1 = "Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. Naisjakefein defetot seteuke re Jeschefe. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.";
$p2 = "Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.";
$boundary1 = "x------------mail_with_attachments";
$boundary2 = "x------------plain_text_and_html";
# Hier beginnt der Nur-Text- plus HTML-Teil
$body = "--".$boundary1.$eol;
$body .= "Content-Type: multipart/alternative;".$eol;
$body .= " boundary=\"".$boundary2."\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
# Hier beginnt der Nur-Text-Teil
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $p1.$eol.$eol.$p2.$eol.$eol;
# Hier beginnt der HTML-Teil
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
$body .= "<h3>HTML-Mail</h3>";
$body .= "<p>".$p1."</p>";
$body .= "<p>".$p2."</p>";
$body .= "</body></html>".$eol.$eol;
# Hier endet der Nur-Text- plus HTML-Teil
$body .= "--".$boundary2."--".$eol.$eol;
# Hier beginnt der erste Anhang
$filename = "ÄÜÖ.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: application/octet-stream;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment;".$eol;
$body .= " filename=\"".$filename."\"".$eol.$eol;
$body .= "R0lGODlhDwAPALMOAP/qAEVFRQAAAP/OAP8AAP/JAP+0AP6dAP/9E//+k///x///6zMzM//l
AAAAAAAAACH5BAEAAA4ALAAAAAAPAA8AAARd0EkZap3Y1aVSGhcWcAgCnMMRTEEnCCfwpquW
mHEOagoOn7+CKnADxoKGSiLHBBSSAROjCWA8KwPZa7sVrgJZAWE8FhR2msGgESAHziqWutB+
0zIVg94wzLAsNRMRADs=".$eol.$eol;
# Hier beginnt der zweite Anhang
$filename = "äöüß.rtf";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: application/octet-stream;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment;".$eol;
$body .= " filename=\"".$filename."\"".$eol.$eol;
$body .= "e1xydGYxXGFuc2lcZGVmZjNcYWRlZmxhbmcxMDI1CntcZm9udHRibHtcZjBcZnJvbWFuXGZwcnEy
XGZjaGFyc2V0MCBUaW1lcyBOZXcgUm9tYW47fXtcZjFcZnJvbWFuXGZwcnEyXGZjaGFyc2V0MiBT
eW1ib2w7fXtcZjJcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBBcmlhbDt9e1xmM1xmcm9tYW5cZnBy
cTJcZmNoYXJzZXQwIFRpbWVzIE5ldyBSb21hbjt9e1xmNFxmc3dpc3NcZnBycTJcZmNoYXJzZXQw
IEFyaWFsO317XGY1XGZzd2lzc1xmcHJxMlxmY2hhcnNldDEgRGVqYVZ1IFNhbnM7fXtcZjZcZm5p
bFxmcHJxMlxmY2hhcnNldDAgQXJpYWwgVW5pY29kZSBNUzt9e1xmN1xmbmlsXGZwcnEyXGZjaGFy
c2V0MCBGcmVlU2Fuczt9e1xmOFxmc3dpc3NcZnBycTBcZmNoYXJzZXQxIEZyZWVTYW5zO319Cntc
Y29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODt9Cntc
c3R5bGVzaGVldHtcczBcc25leHQwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlwaGxlYWQyXGh5
cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUyMDUyXGRiY2hc
YWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzEgTm9ybWFsO30Ke1xzMTVc
c2Jhc2Vkb24wXHNuZXh0MTZcc2IyNDBcc2ExMjBca2VlcG5cZGJjaFxhZjZcZGJjaFxhZjdcYWZz
MjhcbG9jaFxmNFxmczI4IFx1MjIwXCdkY2JlcnNjaHJpZnQ7fQp7XHMxNlxzYmFzZWRvbjBcc25l
eHQxNlxzYjBcc2ExMjAgVGV4dGtcdTI0NlwnZjZycGVyO30Ke1xzMTdcc2Jhc2Vkb24xNlxzbmV4
dDE3XHNiMFxzYTEyMFxkYmNoXGFmOCBMaXN0ZTt9CntcczE4XHNiYXNlZG9uMFxzbmV4dDE4XHNi
MTIwXHNhMTIwXG5vbGluZVxpXGRiY2hcYWY4XGFmczI0XGFpXGZzMjQgQmVzY2hyaWZ0dW5nO30K
e1xzMTlcc2Jhc2Vkb24wXHNuZXh0MTlcbm9saW5lXGRiY2hcYWY4IFZlcnplaWNobmlzO30KfXtc
aW5mb3tcYXV0aG9yIEhvbGdlciBLb2NofXtcY3JlYXRpbVx5cjIwMTRcbW8xMFxkeTIzXGhyMTBc
bWluMjZ9e1xyZXZ0aW1ceXIwXG1vMFxkeTBcaHIwXG1pbjB9e1xwcmludGltXHlyMFxtbzBcZHkw
XGhyMFxtaW4wfXtcY29tbWVudCBMaWJyZU9mZmljZX17XHZlcm42NzE3NTE3MH19XGRlZnRhYjcw
OQpcdmlld3NjYWxlNjkKe1wqXHBnZHNjdGJsCntccGdkc2MwXHBnZHNjdXNlNDUxXHBnd3N4bjEx
OTA2XHBnaHN4bjE2ODM4XG1hcmdsc3huMTEzNFxtYXJncnN4bjExMzRcbWFyZ3RzeG4xMTM0XG1h
cmdic3huMTEzNFxwZ2RzY254dDAgU3RhbmRhcmQ7fX0KXGZvcm1zaGFkZVxwYXBlcmgxNjgzOFxw
YXBlcncxMTkwNlxtYXJnbDExMzRcbWFyZ3IxMTM0XG1hcmd0MTEzNFxtYXJnYjExMzRcc2VjdGRc
c2Jrbm9uZVxzZWN0dW5sb2NrZWQxXHBnbmRlY1xwZ3dzeG4xMTkwNlxwZ2hzeG4xNjgzOFxtYXJn
bHN4bjExMzRcbWFyZ3JzeG4xMTM0XG1hcmd0c3huMTEzNFxtYXJnYnN4bjExMzRcZnRuYmpcZnRu
c3RhcnQxXGZ0bnJzdGNvbnRcZnRubmFyXGFlbmRkb2NcYWZ0bnJzdGNvbnRcYWZ0bnN0YXJ0MVxh
ZnRubnJsYwpccGduZGVjXHBhcmRccGxhaW4gXHMwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlw
aGxlYWQyXGh5cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUy
MDUyXGRiY2hcYWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzF7XHJ0bGNo
IFxsdHJjaFxsb2NoXGxvY2hcZjUKTnVyIGVpbiBUZXN0Li4ufQpccGFyIH0=".$eol.$eol;
# Hier endet der Mail-Body
$body .= "--".$boundary1."--";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: multipart/mixed;".$eol;
$header .= " boundary=\"".$boundary1."\"".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
HTML-Mails mit Grafiken
Eine HTML-Mail kann auch mit Grafiken und Bildern verschönert werden. Da diese aber nicht einfach nur als Anhang mitgeschickt, sondern dargestellt werden sollen, benötigen sie auch eine besondere Behandlung.
Zunächst einmal muss die Verschachtelung der Bestandteile der E-Mail angepasst werden.
Schematisch sieht das dann etwa so aus:
--x------------plain_text_and_html
Nur-Text-Version
--x------------plain_text_and_html
--x------------html_with_images
HTML-Version
--x------------html_with_images
Grafik1
--x------------html_with_images
Grafik2
--x------------html_with_images--
--x------------plain_text_and_html--
Daraus ergibt sich für unser Beispiel folgendes Skript:
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "HTML-Mail mit Grafiken";
$p1 = "Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. Naisjakefein defetot seteuke re Jeschefe. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.";
$p2 = "Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.";
$boundary1 = "x------------plain_text_and_html";
$boundary2 = "x------------html_with_images";
# Hier beginnt der Nur-Text-Teil
$body = "--".$boundary1.$eol;
$body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $p1.$eol.$eol.$p2.$eol.$eol;
# Hier beginnt der HTML-mit-Grafiken-Teil
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: multipart/related;".$eol;
$body .= " boundary=\"".$boundary2."\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
# Hier beginnt der HTML-Teil
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
$body .= "<h3>HTML-Mail</h3>";
$body .= "<p>".$p1." <img src='cid:image1' alt=''></p>";
$body .= "<p>".$p2." <img src='cid:image2' alt=''></p>";
$body .= "</body></html>".$eol.$eol;
# Hier beginnt die erste Grafik
$filename = "ÄÜÖ.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: image/gif;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: inline;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-ID: <image1>".$eol.$eol;
$body .= "R0lGODlhGgASANQUAEIyEsqaCvHSGphtBtSgCqaACOG7E9rVy2pTEqyOEHpqOurq4tuwEu7KGopi
App6DqWafZSKZGVKDv7imv7+8nJiMnpiOv7iIu7CCuLi2rqCArqOCsaqEv7y8v7aGgAAACH/C05F
VFNDQVBFMi4wAwEAAAAh+QQJCgAfACwAAAAAGgASAAAF2+AnftQBKZKkQAc1vvC4QEjCNA1XINAS
/4fKQ+ApegQNw6By+L0yCI7nQq0eMRtExvnpRBLTC6A69iQfEQpgDTsgBOT4RYBhrDUYDeAFAcvF
VGZ2Exp4eyMWBmGAVGMXZgZrhHmHHxINi1WakAATnZQjl5magQ12GBMToCIVDHCkmnQMGwAYqyIQ
BZiOpB4ABgQDEGuVIm4GRLyBtQwEEk0/XgUYDQLExHXBER1cUBsG1DgNGAbNO1tcH0EDDAwG5c0B
DkzpMhASAxsEBBsDEj31XpQ4kWJFi4AhAAAh+QQJCgAfACwAAAAAGAASAAAF3OAnftQBKZKkQAc1
vvC3QEjCNA1XINASw4fKQ+ApegQNw6By+IkyCI7nQq0eMRtE5teJJKYXQFXsST4iLoBadEAIxvCL
AMOQHAATDUYN+cbDVGUMA2p5GBoAFgZggFRiF2UGeHh6iBINjFWakQAYE3h5AJeZmoENDAGdExOH
ABUMb6WacwwbCp2tHxAFmI+lHgAGBAMQH2oAbAgGRL6BnQwEdjFdBRgNAsfHdMMRHT9QGwbWOA0Y
BtA7W05BAwwMBufQAQ5MTiMzEgMbBAQbAxI97L0ocSLFihYCQwAAIfkECQoAHwAsAAAAABoAEgAA
BeHgJ37UASmSpEAHNb7wuEBIwjQNVyDQEv+HykPgKXoEDcOgcvi9MgiO50KtHjEbRMb56UQS0wug
OvYkHxGXCMAWHRACsvwiwDAkzfVEw4aA52JUZgwDEGwAexh8FgZhgVRjF2YGGwqIiBqKABINjlWf
kwEIiIl8H5yen4INDKIAGBMTmh8VDHGqn3UMlR+vsx8QBZ2Rqh4ABgSFa21uCAZExIKvDAR4Tl4F
GA0Ch4d2yREdXFAbBto4DRgG1DtbXB9BAwwMBuvUAQ5M7zIQEgMbBAhsGCChx74XJU6kWNHiYAgA
IfkEBQoAHwAsAAAAABgAEgAABdzgJ37UASmSpEAHNb7wt0BIwjQNVyDQEsOHykPgKXoEDcOgcviJ
MgiO50KtHjEbRObXiSSmF0BV7Ek+Ii6AWnRACMbwiwDDkBwAEw1GDfnGw1RlDANqeRgaABYGYIBU
YhdlBnh4eogSDYxVmpEAGBN4eQCXmZqBDQwBnRMThwAVDG+lmnMMGwqdrR8QBZiPpR4ABgQDEB9q
AGwIBkS+gZ0MBHYxXQUYDQLHx3TDER0/UBsG1jgNGAbQO1tOQQMMDAbn0AEOTE4jMxIDGwQEGwMS
Pey9KHEixYoWAkMAACH+Km1hZGUgYnkgZGFtaWFuIGthbmcgYWthIGg0aGFtc3RlciBmb3IgaXBi
AAA7".$eol.$eol;
# Hier beginnt die zweite Grafik
$filename = "ßäöü.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: image/gif;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: inline;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-ID: <image2>".$eol.$eol;
$body .= "R0lGODlhJAASAMQVAAAAAEIxEGNSEHNjMXtjOZxjAJxzCJycY6WUe6Wce7WMCM6cCNalCN61EOe9
EO/GEPfOGPfWGP/eGP/nIf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05F
VFNDQVBFMi4wAwEAAAAh+QQJDwAVACwAAAAAJAASAAAF/mAljmSZEIJAJGXbJsLgVoigNJDDKAIy
Dz2S4KE4tAYGSCQyWUIaBlnpoHAISAbH4ypcTL7gZo5XGjoM2IejOKIyA/AJPDB5GowiqhY9GuCs
IwIQcmFgAREODVwVQ09SFQlADo40CkyFYRF2Pn45Kj4JBlAKEBBGBA2YhZoNCwQVB6UKogYwRAYC
E1uMDnJ0qnAOC1eCEwIGVSk4EEkQr0MRARRz1NIBwlcEpc2KA0AppdkN0RTl5ucBDQrPSikxQIMT
sxOvCKTk5+bXCwY+BBPIxAiAYQDXAGciBIzDh+5BKy4EIgApGMQMwFd5qiypFsDhggJ4KhAwMEEL
FxgpL0ImvPGgVCkHiRaQIXHAnY8ZJEY22Nkg5sdHOIOOqIGMwQ5cN4UqHXEiBYGkSkMAACH5BAkP
ABUALAAAAAAkABIAAAX+YCWOZJkQgkAkZTkISCuLiKA0kMMosHwoDgEpIRjIBgZIJDJZQhoGY0nw
cBhIVMVhuph4v80cj/RzPK4jg1k4+jED8Ak8MHkatiLqUyoyVLUjAhByYF8BEQ4NbAM4QQQxIow5
bAgKTIVgEXYxBxAQCgZQLAkvDnsVBA2YhZoNCwQVghMCBkACCaG1nlsCDnJ0q3AOC0IEnklPKQ+g
AhMPQlQRARRz1dMBw9BKKUUvOBDIsKnSFOXm5wENCuITtWHd3J5ClUrT5+bYCwYxBBEvBgZgyJoA
agKsWA2W2EP3wBUbVAYmrKlABGARCAfLKLTWcEEBPCIOcINExZeBg3ksbjzw5MlBogVjZowgkgLk
CAKhGuh86ZGPzJ8jatRisCMgJKBIZ6JQcRRpCAAAIfkECQ8AFQAsAAAAACQAEgAABf5gJY5kmRCC
QCRl2ybC4FaIoDSQwygCMg89kuChOLQGBkgkMllCGgZZ6aBwCEgGx+MqXEy+4GaOVxo6DNiHozii
MgPwCTwweRqMIqoWPRrgrCMCEHJhYAERDg1cFUNPUhUJQA6ONApMhWERdj5+OSo+CQZQChAQRgQN
mIWaDQsEFQelCqIGMEQGAhNbjA5ydKpwDgtXghMCBlUpOBBJEK9DEQEUc9TSAcJXBKXNigNAKaXZ
DdEU5ebnAQ0Kz0opMUCDE7MTrwik5Ofm1wsGPgQTyMQIgGEA1wBnIgSMw4fuQSsuBCIAKRjEDMBX
eaosqRbA4YICeCoQMDBBCxcYKS9CJrzxoFQpB4kWkCFxwJ2PGSRGNtjZIObHRziDjqiBjMEOXDeF
Kh1xIgWBpEpDAAAh+QQFDwAVACwAAAAAJAASAAAF/mBVJcIgnuhICAKRpDAsPMoRI4LSQA6jCIiY
0OB4CGADAyQSmTAhDYMJCUQZHo4aSrCYeL9O3i91UDiOp8HufCo3A/AJPDCBGmynmcNwSgwEDlBT
AhByYF8BEQ4NaBVlRXwjBlEKEBA2CApNh2ARdkEVM4IiMwoGAhNGFQQNnIeeDQsEFWo8LUECOxBK
ELOAcnSucA4LRweWplF+fyyWRzMRARRz1NIBxM+FAgZmzV6mE7Os0RTl5ucBDQrilryMJAanA70V
mUvS5+bXCwa4SywlTOiZYGAWqQZM8KF7EAsNAYIKwhwhwQKPiEcJqzFcUAAPgQh/4lURQkrHA0uW
LRwsWjDmBAEDE4o0IrlqUoObKzlOQXEAICiaInBwY+Dj1E+gSEUkWHErqYgQAAA7".$eol.$eol;
# Hier endet der HTML-mit-Grafiken-Teil
$body .= "--".$boundary2."--".$eol.$eol;
# Hier endet der Mail-Body
$body .= "--".$boundary1."--";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: multipart/alternative;".$eol;
$header .= " boundary=\"".$boundary1."\"".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
Über Content-Type: multipart/related (Zeile 18) wird die Information gegeben, dass die folgenden Bestandteile zusammen gehören. Im HTML-Quelltext wird nun statt eines normalen Grafik-Verweises eine Content-ID angegeben (cid, Zeilen 28 und 29), die sich bei der Deklaration der Grafik wiederfindet (Zeilen 41 und 73). Diese Content-ID kann ein beliebiger ASCII-String sein. Verschiedene Grafiken dürfen natürlich nicht die gleiche ID haben. Die Deklaration der Grafik wird durch Content-Disposition: inline ergänzt, um explizit auszudrücken, dass es sich nicht um einen Anhang (Content-Disposition: attachment) handelt.
HTML-Mails mit Grafiken und Anhängen
Die Krönung des E-Mail-Versands ist nun natürlich eine Mail, die alle der möglichen Komponenten enthält: HTML- und Nur-Text-Version, Inline-Grafiken und Anhänge.
Wieder muss die Verschachtelung der Bestandteile der E-Mail angepasst werden, wobei diese nun naheliegenderweise eine Kombination der letzten beiden Beispiele ist. In diesem Fall benötigt man drei Trennstrings.
Schematisch sieht das in diesem Fall dann etwa so aus:
--x------------mail_with_attachments
--x------------plain_text_and_html
Nur-Text-Version
--x------------plain_text_and_html
--x------------html_with_images
HTML-Version
--x------------html_with_images
Grafik1
--x------------html_with_images
Grafik2
--x------------html_with_images--
--x------------plain_text_and_html--
--x------------mail_with_attachments
Anhang1
--x------------mail_with_attachments
Anhang2
--x------------mail_with_attachments--
Daraus ergibt sich dann für das Beispiel folgendes Skript:
<?php
mb_internal_encoding("UTF-8");
$eol = PHP_EOL;
$subject = "HTML-Mail mit Grafiken und Anhängen";
$p1 = "Marokeile geck mof Bekühka mieghär. Tepohne lesuk begichakre womorne. Lirebe rekoh kilage letäur. Naisjakefein defetot seteuke re Jeschefe. Bejihahgge maudetjelohs meis tesch ginimuki daibubopil setebseschpes neidauta sewije pe juleupu sickgagi hus reetatistöh teg bes wegrussumu fulod le sen we, vemaame ketbewene zehai bauck Ribke, rihebe taktekgale föswafref fekrofohbke Tiegepurten keb lukam, konzühs nehneukubee re bo.";
$p2 = "Heilsubjöt mehuhckeno tegriskubhe libaar webopal gelite ke vaimohaub ravo vahnohde Matote sobgedadeu lobbuba döm vet te. Selegemep fobeke fel sühnaichohso gigichähte duk schu, tuzufmeekif, lakalzeresch süke res Woposieseb, lemjemigga, läh deinzul Faikes binöge. Fekogenef nerzischif fewekäh, ku he, log Kemek. Namohpmo kokegeme Heg dechuven, kati mofärerduk.";
$boundary1 = "x------------mail_with_attachments";
$boundary2 = "x------------plain_text_and_html";
$boundary3 = "x------------html_with_images";
# Hier beginnt der Mail-Body
$body = "--".$boundary1.$eol;
$body .= "Content-Type: multipart/alternative;".$eol;
$body .= " boundary=\"".$boundary2."\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
# Hier beginnt der Nur-Text-Teil
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= $p1.$eol.$eol.$p2.$eol.$eol;
# Hier beginnt der HTML-mit-Grafiken-Teil
$body .= "--".$boundary2.$eol;
$body .= "Content-Type: multipart/related;".$eol;
$body .= " boundary=\"".$boundary3."\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
# Hier beginnt der HTML-Teil
$body .= "--".$boundary3.$eol;
$body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
$body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
$body .= "<h3>HTML-Mail</h3>";
$body .= "<p>".$p1." <img src='cid:image1' alt=''></p>";
$body .= "<p>".$p2." <img src='cid:image2' alt=''></p>";
$body .= "</body></html>".$eol.$eol;
# Hier beginnt die erste Grafik
$filename = "ÄÜÖ.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary3.$eol;
$body .= "Content-Type: image/gif;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: inline;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-ID: <image1>".$eol.$eol;
$body .= "R0lGODlhGgASANQUAEIyEsqaCvHSGphtBtSgCqaACOG7E9rVy2pTEqyOEHpqOurq4tuwEu7KGopi
App6DqWafZSKZGVKDv7imv7+8nJiMnpiOv7iIu7CCuLi2rqCArqOCsaqEv7y8v7aGgAAACH/C05F
VFNDQVBFMi4wAwEAAAAh+QQJCgAfACwAAAAAGgASAAAF2+AnftQBKZKkQAc1vvC4QEjCNA1XINAS
/4fKQ+ApegQNw6By+L0yCI7nQq0eMRtExvnpRBLTC6A69iQfEQpgDTsgBOT4RYBhrDUYDeAFAcvF
VGZ2Exp4eyMWBmGAVGMXZgZrhHmHHxINi1WakAATnZQjl5magQ12GBMToCIVDHCkmnQMGwAYqyIQ
BZiOpB4ABgQDEGuVIm4GRLyBtQwEEk0/XgUYDQLExHXBER1cUBsG1DgNGAbNO1tcH0EDDAwG5c0B
DkzpMhASAxsEBBsDEj31XpQ4kWJFi4AhAAAh+QQJCgAfACwAAAAAGAASAAAF3OAnftQBKZKkQAc1
vvC3QEjCNA1XINASw4fKQ+ApegQNw6By+IkyCI7nQq0eMRtE5teJJKYXQFXsST4iLoBadEAIxvCL
AMOQHAATDUYN+cbDVGUMA2p5GBoAFgZggFRiF2UGeHh6iBINjFWakQAYE3h5AJeZmoENDAGdExOH
ABUMb6WacwwbCp2tHxAFmI+lHgAGBAMQH2oAbAgGRL6BnQwEdjFdBRgNAsfHdMMRHT9QGwbWOA0Y
BtA7W05BAwwMBufQAQ5MTiMzEgMbBAQbAxI97L0ocSLFihYCQwAAIfkECQoAHwAsAAAAABoAEgAA
BeHgJ37UASmSpEAHNb7wuEBIwjQNVyDQEv+HykPgKXoEDcOgcvi9MgiO50KtHjEbRMb56UQS0wug
OvYkHxGXCMAWHRACsvwiwDAkzfVEw4aA52JUZgwDEGwAexh8FgZhgVRjF2YGGwqIiBqKABINjlWf
kwEIiIl8H5yen4INDKIAGBMTmh8VDHGqn3UMlR+vsx8QBZ2Rqh4ABgSFa21uCAZExIKvDAR4Tl4F
GA0Ch4d2yREdXFAbBto4DRgG1DtbXB9BAwwMBuvUAQ5M7zIQEgMbBAhsGCChx74XJU6kWNHiYAgA
IfkEBQoAHwAsAAAAABgAEgAABdzgJ37UASmSpEAHNb7wt0BIwjQNVyDQEsOHykPgKXoEDcOgcviJ
MgiO50KtHjEbRObXiSSmF0BV7Ek+Ii6AWnRACMbwiwDDkBwAEw1GDfnGw1RlDANqeRgaABYGYIBU
YhdlBnh4eogSDYxVmpEAGBN4eQCXmZqBDQwBnRMThwAVDG+lmnMMGwqdrR8QBZiPpR4ABgQDEB9q
AGwIBkS+gZ0MBHYxXQUYDQLHx3TDER0/UBsG1jgNGAbQO1tOQQMMDAbn0AEOTE4jMxIDGwQEGwMS
Pey9KHEixYoWAkMAACH+Km1hZGUgYnkgZGFtaWFuIGthbmcgYWthIGg0aGFtc3RlciBmb3IgaXBi
AAA7".$eol.$eol;
# Hier beginnt die zweite Grafik
$filename = "ßäöü.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary3.$eol;
$body .= "Content-Type: image/gif;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: inline;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-ID: <image2>".$eol.$eol;
$body .= "R0lGODlhJAASAMQVAAAAAEIxEGNSEHNjMXtjOZxjAJxzCJycY6WUe6Wce7WMCM6cCNalCN61EOe9
EO/GEPfOGPfWGP/eGP/nIf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05F
VFNDQVBFMi4wAwEAAAAh+QQJDwAVACwAAAAAJAASAAAF/mAljmSZEIJAJGXbJsLgVoigNJDDKAIy
Dz2S4KE4tAYGSCQyWUIaBlnpoHAISAbH4ypcTL7gZo5XGjoM2IejOKIyA/AJPDB5GowiqhY9GuCs
IwIQcmFgAREODVwVQ09SFQlADo40CkyFYRF2Pn45Kj4JBlAKEBBGBA2YhZoNCwQVB6UKogYwRAYC
E1uMDnJ0qnAOC1eCEwIGVSk4EEkQr0MRARRz1NIBwlcEpc2KA0AppdkN0RTl5ucBDQrPSikxQIMT
sxOvCKTk5+bXCwY+BBPIxAiAYQDXAGciBIzDh+5BKy4EIgApGMQMwFd5qiypFsDhggJ4KhAwMEEL
FxgpL0ImvPGgVCkHiRaQIXHAnY8ZJEY22Nkg5sdHOIOOqIGMwQ5cN4UqHXEiBYGkSkMAACH5BAkP
ABUALAAAAAAkABIAAAX+YCWOZJkQgkAkZTkISCuLiKA0kMMosHwoDgEpIRjIBgZIJDJZQhoGY0nw
cBhIVMVhuph4v80cj/RzPK4jg1k4+jED8Ak8MHkatiLqUyoyVLUjAhByYF8BEQ4NbAM4QQQxIow5
bAgKTIVgEXYxBxAQCgZQLAkvDnsVBA2YhZoNCwQVghMCBkACCaG1nlsCDnJ0q3AOC0IEnklPKQ+g
AhMPQlQRARRz1dMBw9BKKUUvOBDIsKnSFOXm5wENCuITtWHd3J5ClUrT5+bYCwYxBBEvBgZgyJoA
agKsWA2W2EP3wBUbVAYmrKlABGARCAfLKLTWcEEBPCIOcINExZeBg3ksbjzw5MlBogVjZowgkgLk
CAKhGuh86ZGPzJ8jatRisCMgJKBIZ6JQcRRpCAAAIfkECQ8AFQAsAAAAACQAEgAABf5gJY5kmRCC
QCRl2ybC4FaIoDSQwygCMg89kuChOLQGBkgkMllCGgZZ6aBwCEgGx+MqXEy+4GaOVxo6DNiHozii
MgPwCTwweRqMIqoWPRrgrCMCEHJhYAERDg1cFUNPUhUJQA6ONApMhWERdj5+OSo+CQZQChAQRgQN
mIWaDQsEFQelCqIGMEQGAhNbjA5ydKpwDgtXghMCBlUpOBBJEK9DEQEUc9TSAcJXBKXNigNAKaXZ
DdEU5ebnAQ0Kz0opMUCDE7MTrwik5Ofm1wsGPgQTyMQIgGEA1wBnIgSMw4fuQSsuBCIAKRjEDMBX
eaosqRbA4YICeCoQMDBBCxcYKS9CJrzxoFQpB4kWkCFxwJ2PGSRGNtjZIObHRziDjqiBjMEOXDeF
Kh1xIgWBpEpDAAAh+QQFDwAVACwAAAAAJAASAAAF/mBVJcIgnuhICAKRpDAsPMoRI4LSQA6jCIiY
0OB4CGADAyQSmTAhDYMJCUQZHo4aSrCYeL9O3i91UDiOp8HufCo3A/AJPDCBGmynmcNwSgwEDlBT
AhByYF8BEQ4NaBVlRXwjBlEKEBA2CApNh2ARdkEVM4IiMwoGAhNGFQQNnIeeDQsEFWo8LUECOxBK
ELOAcnSucA4LRweWplF+fyyWRzMRARRz1NIBxM+FAgZmzV6mE7Os0RTl5ucBDQrilryMJAanA70V
mUvS5+bXCwa4SywlTOiZYGAWqQZM8KF7EAsNAYIKwhwhwQKPiEcJqzFcUAAPgQh/4lURQkrHA0uW
LRwsWjDmBAEDE4o0IrlqUoObKzlOQXEAICiaInBwY+Dj1E+gSEUkWHErqYgQAAA7".$eol.$eol;
# Hier endet der HTML-mit-Grafiken-Teil
$body .= "--".$boundary3."--".$eol.$eol;
# Hier endet der Nur-Text- plus HTML-Teil
$body .= "--".$boundary2."--".$eol.$eol;
# Hier beginnt der erste Anhang
$filename = "ÄÜÖ.gif";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: application/octet-stream;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment;".$eol;
$body .= " filename=\"".$filename."\"".$eol.$eol;
$body .= "R0lGODlhDwAPALMOAP/qAEVFRQAAAP/OAP8AAP/JAP+0AP6dAP/9E//+k///x///6zMzM//l
AAAAAAAAACH5BAEAAA4ALAAAAAAPAA8AAARd0EkZap3Y1aVSGhcWcAgCnMMRTEEnCCfwpquW
mHEOagoOn7+CKnADxoKGSiLHBBSSAROjCWA8KwPZa7sVrgJZAWE8FhR2msGgESAHziqWutB+
0zIVg94wzLAsNRMRADs=".$eol.$eol;
# Hier beginnt der zweite Anhang
$filename = "äöüß.rtf";
$filename = mb_encode_mimeheader($filename, "UTF-8", "B");
$body .= "--".$boundary1.$eol;
$body .= "Content-Type: application/octet-stream;".$eol;
$body .= " name=\"".$filename."\"".$eol;
$body .= "Content-Transfer-Encoding: base64".$eol;
$body .= "Content-Disposition: attachment;".$eol;
$body .= " filename=\"".$filename."\"".$eol.$eol;
$body .= "e1xydGYxXGFuc2lcZGVmZjNcYWRlZmxhbmcxMDI1CntcZm9udHRibHtcZjBcZnJvbWFuXGZwcnEy
XGZjaGFyc2V0MCBUaW1lcyBOZXcgUm9tYW47fXtcZjFcZnJvbWFuXGZwcnEyXGZjaGFyc2V0MiBT
eW1ib2w7fXtcZjJcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBBcmlhbDt9e1xmM1xmcm9tYW5cZnBy
cTJcZmNoYXJzZXQwIFRpbWVzIE5ldyBSb21hbjt9e1xmNFxmc3dpc3NcZnBycTJcZmNoYXJzZXQw
IEFyaWFsO317XGY1XGZzd2lzc1xmcHJxMlxmY2hhcnNldDEgRGVqYVZ1IFNhbnM7fXtcZjZcZm5p
bFxmcHJxMlxmY2hhcnNldDAgQXJpYWwgVW5pY29kZSBNUzt9e1xmN1xmbmlsXGZwcnEyXGZjaGFy
c2V0MCBGcmVlU2Fuczt9e1xmOFxmc3dpc3NcZnBycTBcZmNoYXJzZXQxIEZyZWVTYW5zO319Cntc
Y29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODt9Cntc
c3R5bGVzaGVldHtcczBcc25leHQwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlwaGxlYWQyXGh5
cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUyMDUyXGRiY2hc
YWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzEgTm9ybWFsO30Ke1xzMTVc
c2Jhc2Vkb24wXHNuZXh0MTZcc2IyNDBcc2ExMjBca2VlcG5cZGJjaFxhZjZcZGJjaFxhZjdcYWZz
MjhcbG9jaFxmNFxmczI4IFx1MjIwXCdkY2JlcnNjaHJpZnQ7fQp7XHMxNlxzYmFzZWRvbjBcc25l
eHQxNlxzYjBcc2ExMjAgVGV4dGtcdTI0NlwnZjZycGVyO30Ke1xzMTdcc2Jhc2Vkb24xNlxzbmV4
dDE3XHNiMFxzYTEyMFxkYmNoXGFmOCBMaXN0ZTt9CntcczE4XHNiYXNlZG9uMFxzbmV4dDE4XHNi
MTIwXHNhMTIwXG5vbGluZVxpXGRiY2hcYWY4XGFmczI0XGFpXGZzMjQgQmVzY2hyaWZ0dW5nO30K
e1xzMTlcc2Jhc2Vkb24wXHNuZXh0MTlcbm9saW5lXGRiY2hcYWY4IFZlcnplaWNobmlzO30KfXtc
aW5mb3tcYXV0aG9yIEhvbGdlciBLb2NofXtcY3JlYXRpbVx5cjIwMTRcbW8xMFxkeTIzXGhyMTBc
bWluMjZ9e1xyZXZ0aW1ceXIwXG1vMFxkeTBcaHIwXG1pbjB9e1xwcmludGltXHlyMFxtbzBcZHkw
XGhyMFxtaW4wfXtcY29tbWVudCBMaWJyZU9mZmljZX17XHZlcm42NzE3NTE3MH19XGRlZnRhYjcw
OQpcdmlld3NjYWxlNjkKe1wqXHBnZHNjdGJsCntccGdkc2MwXHBnZHNjdXNlNDUxXHBnd3N4bjEx
OTA2XHBnaHN4bjE2ODM4XG1hcmdsc3huMTEzNFxtYXJncnN4bjExMzRcbWFyZ3RzeG4xMTM0XG1h
cmdic3huMTEzNFxwZ2RzY254dDAgU3RhbmRhcmQ7fX0KXGZvcm1zaGFkZVxwYXBlcmgxNjgzOFxw
YXBlcncxMTkwNlxtYXJnbDExMzRcbWFyZ3IxMTM0XG1hcmd0MTEzNFxtYXJnYjExMzRcc2VjdGRc
c2Jrbm9uZVxzZWN0dW5sb2NrZWQxXHBnbmRlY1xwZ3dzeG4xMTkwNlxwZ2hzeG4xNjgzOFxtYXJn
bHN4bjExMzRcbWFyZ3JzeG4xMTM0XG1hcmd0c3huMTEzNFxtYXJnYnN4bjExMzRcZnRuYmpcZnRu
c3RhcnQxXGZ0bnJzdGNvbnRcZnRubmFyXGFlbmRkb2NcYWZ0bnJzdGNvbnRcYWZ0bnN0YXJ0MVxh
ZnRubnJsYwpccGduZGVjXHBhcmRccGxhaW4gXHMwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlw
aGxlYWQyXGh5cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUy
MDUyXGRiY2hcYWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzF7XHJ0bGNo
IFxsdHJjaFxsb2NoXGxvY2hcZjUKTnVyIGVpbiBUZXN0Li4ufQpccGFyIH0=".$eol.$eol;
# Hier endet der Mail-Body
$body .= "--".$boundary1."--";
$from_name = "Käthe Müller";
$from_email_address = "kaethe@example.org";
$to_name = "Hans Meyer";
$to_email_address = "hans@example.org";
$header = "MIME-Version: 1.0".$eol;
$header .= "Content-Type: multipart/mixed;".$eol;
$header .= " boundary=\"".$boundary1."\"".$eol;
$header .= "Content-Transfer-Encoding: 8bit".$eol;
$header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
if (PHP_OS == "Linux") $to = mb_encode_mimeheader($to_name, "UTF-8", "Q")." <".mb_encode_mimeheader($to_email_address, "UTF-8", "Q").">"; else $to = mb_encode_mimeheader($to_email_address, "UTF-8", "Q");
if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
else echo "Die Mail konnte nicht verschickt werden!";
?>
MIME-Typ ermitteln
Folgende Funktion ermittelt den MIME-Typ einer Datei, um diesen String im Mail-Quelltext zu verwenden:
function getmime($file) {
# returns mime type string for file
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file);
finfo_close($finfo);
return $mime;
}
E-Mails an mehrere Empfänger
Um eine E-Mail an mehrere Empfänger zu verschicken, gibt es zwei Möglichkeiten. Einerseits kann man den ersten Parameter der mb_send_mail()-Funktion ($to) um weitere, durch Komma getrennte Adressen ergänzen:
$to = "kontakt@example.org, mail@example.org, info@example.org";
Andererseits kann man im vierten Parameter ($header) noch Empfänger angeben, die eine Kopie der Mail erhalten sollen (Cc bzw. Bcc). In diesem Fall muss den Angaben ein Zeilenumbruch vorangestellt werden:
$header .= PHP_EOL."Cc: mail@example.org, kontakt@example.org";
$header .= PHP_EOL."Bcc: info@example.org, lisa@example.org";