Bitte warten...

E-Mails mit PHP verschicken

Übersicht
HTML-Mails
Mehrteilige E-Mails
E-Mails mit Anhängen
HTML-Mails mit Anhängen
HTML-Mails mit Grafiken
HTML-Mails mit Grafiken und Anhängen
MIME-Typ ermitteln
E-Mails an mehrere Empfänger

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.

Die Beispiele auf dieser Seite gelten für die Zeichenkodierung UTF-8. Daher müssen die Dateien auch in dieser Kodierung gespeichert werden, es sei denn, man passt die in den Skripten angegebene Kodierung an.

Die Beispiele wurden mit Mozilla Thunderbird sowie den Webmailern von GMX und Roundcube getestet.

Das folgende Skript veranschaulicht die Grundformulierung der mb_send_mail()-Funktion:

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "Nur-Text-Mail";
  5. $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;
  6. $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.";
  7. $from_name = "Käthe Müller";
  8. $from_email_address = "kaethe@example.org";
  9. $to_name = "Hans Meyer";
  10. $to_email_address = "hans@example.org";
  11. $header = "MIME-Version: 1.0".$eol;
  12. $header .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
  13. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  14. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  15. 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");
  16. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  17. else echo "Die Mail konnte nicht verschickt werden!";
  18. ?>

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.

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "HTML-Mail";
  5. $body = "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
  6. $body .= "<h3>HTML-Mail</h3>";
  7. $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>";
  8. $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>";
  9. $body .= "</body></html>";
  10. $from_name = "Käthe Müller";
  11. $from_email_address = "kaethe@example.org";
  12. $to_name = "Hans Meyer";
  13. $to_email_address = "hans@example.org";
  14. $header = "MIME-Version: 1.0".$eol;
  15. $header .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
  16. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  17. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  18. 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");
  19. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  20. else echo "Die Mail konnte nicht verschickt werden!";
  21. ?>

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.

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "Nur-Text- mit HTML-Mail";
  5. $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.";
  6. $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.";
  7. $boundary1 = "x------------plain_text_and_html";
  8. # Hier beginnt der Nur-Text-Teil
  9. $body = "--".$boundary1.$eol;
  10. $body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
  11. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  12. $body .= $p1.$eol.$eol.$p2.$eol.$eol;
  13. # Hier beginnt der HTML-Teil
  14. $body .= "--".$boundary1.$eol;
  15. $body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
  16. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  17. $body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
  18. $body .= "<h3>HTML-Mail</h3>";
  19. $body .= "<p>".$p1."</p>";
  20. $body .= "<p>".$p2."</p>";
  21. $body .= "</body></html>".$eol.$eol;
  22. # Hier endet der Mail-Body
  23. $body .= "--".$boundary1."--";
  24. $from_name = "Käthe Müller";
  25. $from_email_address = "kaethe@example.org";
  26. $to_name = "Hans Meyer";
  27. $to_email_address = "hans@example.org";
  28. $header = "MIME-Version: 1.0".$eol;
  29. $header .= "Content-Type: multipart/alternative;".$eol;
  30. $header .= " boundary=\"".$boundary1."\"".$eol;
  31. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  32. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  33. 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");
  34. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  35. else echo "Die Mail konnte nicht verschickt werden!";
  36. ?>

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).

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "Mail mit Anhängen";
  5. $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.";
  6. $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.";
  7. $boundary1 = "x------------mail_with_attachments";
  8. # Hier beginnt der Nur-Text-Teil
  9. $body = "--".$boundary1.$eol;
  10. $body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
  11. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  12. $body .= $p1.$eol.$eol.$p2.$eol.$eol;
  13. # Hier beginnt der erste Anhang
  14. $filename = "ÄÜÖ.gif";
  15. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  16. $body .= "--".$boundary1.$eol;
  17. $body .= "Content-Type: application/octet-stream;".$eol;
  18. $body .= " name=\"".$filename."\"".$eol;
  19. $body .= "Content-Transfer-Encoding: base64".$eol;
  20. $body .= "Content-Disposition: attachment;".$eol;
  21. $body .= " filename=\"".$filename."\"".$eol.$eol;
  22. $body .= "R0lGODlhDwAPALMOAP/qAEVFRQAAAP/OAP8AAP/JAP+0AP6dAP/9E//+k///x///6zMzM//l
  23. AAAAAAAAACH5BAEAAA4ALAAAAAAPAA8AAARd0EkZap3Y1aVSGhcWcAgCnMMRTEEnCCfwpquW
  24. mHEOagoOn7+CKnADxoKGSiLHBBSSAROjCWA8KwPZa7sVrgJZAWE8FhR2msGgESAHziqWutB+
  25. 0zIVg94wzLAsNRMRADs=".$eol.$eol;
  26. # Hier beginnt der zweite Anhang
  27. $filename = "äöüß.rtf";
  28. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  29. $body .= "--".$boundary1.$eol;
  30. $body .= "Content-Type: application/octet-stream;".$eol;
  31. $body .= " name=\"".$filename."\"".$eol;
  32. $body .= "Content-Transfer-Encoding: base64".$eol;
  33. $body .= "Content-Disposition: attachment;".$eol;
  34. $body .= " filename=\"".$filename."\"".$eol.$eol;
  35. $body .= "e1xydGYxXGFuc2lcZGVmZjNcYWRlZmxhbmcxMDI1CntcZm9udHRibHtcZjBcZnJvbWFuXGZwcnEy
  36. XGZjaGFyc2V0MCBUaW1lcyBOZXcgUm9tYW47fXtcZjFcZnJvbWFuXGZwcnEyXGZjaGFyc2V0MiBT
  37. eW1ib2w7fXtcZjJcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBBcmlhbDt9e1xmM1xmcm9tYW5cZnBy
  38. cTJcZmNoYXJzZXQwIFRpbWVzIE5ldyBSb21hbjt9e1xmNFxmc3dpc3NcZnBycTJcZmNoYXJzZXQw
  39. IEFyaWFsO317XGY1XGZzd2lzc1xmcHJxMlxmY2hhcnNldDEgRGVqYVZ1IFNhbnM7fXtcZjZcZm5p
  40. bFxmcHJxMlxmY2hhcnNldDAgQXJpYWwgVW5pY29kZSBNUzt9e1xmN1xmbmlsXGZwcnEyXGZjaGFy
  41. c2V0MCBGcmVlU2Fuczt9e1xmOFxmc3dpc3NcZnBycTBcZmNoYXJzZXQxIEZyZWVTYW5zO319Cntc
  42. Y29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODt9Cntc
  43. c3R5bGVzaGVldHtcczBcc25leHQwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlwaGxlYWQyXGh5
  44. cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUyMDUyXGRiY2hc
  45. YWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzEgTm9ybWFsO30Ke1xzMTVc
  46. c2Jhc2Vkb24wXHNuZXh0MTZcc2IyNDBcc2ExMjBca2VlcG5cZGJjaFxhZjZcZGJjaFxhZjdcYWZz
  47. MjhcbG9jaFxmNFxmczI4IFx1MjIwXCdkY2JlcnNjaHJpZnQ7fQp7XHMxNlxzYmFzZWRvbjBcc25l
  48. eHQxNlxzYjBcc2ExMjAgVGV4dGtcdTI0NlwnZjZycGVyO30Ke1xzMTdcc2Jhc2Vkb24xNlxzbmV4
  49. dDE3XHNiMFxzYTEyMFxkYmNoXGFmOCBMaXN0ZTt9CntcczE4XHNiYXNlZG9uMFxzbmV4dDE4XHNi
  50. MTIwXHNhMTIwXG5vbGluZVxpXGRiY2hcYWY4XGFmczI0XGFpXGZzMjQgQmVzY2hyaWZ0dW5nO30K
  51. e1xzMTlcc2Jhc2Vkb24wXHNuZXh0MTlcbm9saW5lXGRiY2hcYWY4IFZlcnplaWNobmlzO30KfXtc
  52. aW5mb3tcYXV0aG9yIEhvbGdlciBLb2NofXtcY3JlYXRpbVx5cjIwMTRcbW8xMFxkeTIzXGhyMTBc
  53. bWluMjZ9e1xyZXZ0aW1ceXIwXG1vMFxkeTBcaHIwXG1pbjB9e1xwcmludGltXHlyMFxtbzBcZHkw
  54. XGhyMFxtaW4wfXtcY29tbWVudCBMaWJyZU9mZmljZX17XHZlcm42NzE3NTE3MH19XGRlZnRhYjcw
  55. OQpcdmlld3NjYWxlNjkKe1wqXHBnZHNjdGJsCntccGdkc2MwXHBnZHNjdXNlNDUxXHBnd3N4bjEx
  56. OTA2XHBnaHN4bjE2ODM4XG1hcmdsc3huMTEzNFxtYXJncnN4bjExMzRcbWFyZ3RzeG4xMTM0XG1h
  57. cmdic3huMTEzNFxwZ2RzY254dDAgU3RhbmRhcmQ7fX0KXGZvcm1zaGFkZVxwYXBlcmgxNjgzOFxw
  58. YXBlcncxMTkwNlxtYXJnbDExMzRcbWFyZ3IxMTM0XG1hcmd0MTEzNFxtYXJnYjExMzRcc2VjdGRc
  59. c2Jrbm9uZVxzZWN0dW5sb2NrZWQxXHBnbmRlY1xwZ3dzeG4xMTkwNlxwZ2hzeG4xNjgzOFxtYXJn
  60. bHN4bjExMzRcbWFyZ3JzeG4xMTM0XG1hcmd0c3huMTEzNFxtYXJnYnN4bjExMzRcZnRuYmpcZnRu
  61. c3RhcnQxXGZ0bnJzdGNvbnRcZnRubmFyXGFlbmRkb2NcYWZ0bnJzdGNvbnRcYWZ0bnN0YXJ0MVxh
  62. ZnRubnJsYwpccGduZGVjXHBhcmRccGxhaW4gXHMwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlw
  63. aGxlYWQyXGh5cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUy
  64. MDUyXGRiY2hcYWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzF7XHJ0bGNo
  65. IFxsdHJjaFxsb2NoXGxvY2hcZjUKTnVyIGVpbiBUZXN0Li4ufQpccGFyIH0=".$eol.$eol;
  66. # Hier endet der Mail-Body
  67. $body .= "--".$boundary1."--";
  68. $from_name = "Käthe Müller";
  69. $from_email_address = "kaethe@example.org";
  70. $to_name = "Hans Meyer";
  71. $to_email_address = "hans@example.org";
  72. $header = "MIME-Version: 1.0".$eol;
  73. $header .= "Content-Type: multipart/mixed;".$eol;
  74. $header .= " boundary=\"".$boundary1."\"".$eol;
  75. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  76. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  77. 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");
  78. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  79. else echo "Die Mail konnte nicht verschickt werden!";
  80. ?>

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:

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "HTML-Mail mit Anhängen";
  5. $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.";
  6. $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.";
  7. $boundary1 = "x------------mail_with_attachments";
  8. $boundary2 = "x------------plain_text_and_html";
  9. # Hier beginnt der Nur-Text- plus HTML-Teil
  10. $body = "--".$boundary1.$eol;
  11. $body .= "Content-Type: multipart/alternative;".$eol;
  12. $body .= " boundary=\"".$boundary2."\"".$eol;
  13. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  14. # Hier beginnt der Nur-Text-Teil
  15. $body .= "--".$boundary2.$eol;
  16. $body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
  17. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  18. $body .= $p1.$eol.$eol.$p2.$eol.$eol;
  19. # Hier beginnt der HTML-Teil
  20. $body .= "--".$boundary2.$eol;
  21. $body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
  22. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  23. $body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
  24. $body .= "<h3>HTML-Mail</h3>";
  25. $body .= "<p>".$p1."</p>";
  26. $body .= "<p>".$p2."</p>";
  27. $body .= "</body></html>".$eol.$eol;
  28. # Hier endet der Nur-Text- plus HTML-Teil
  29. $body .= "--".$boundary2."--".$eol.$eol;
  30. # Hier beginnt der erste Anhang
  31. $filename = "ÄÜÖ.gif";
  32. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  33. $body .= "--".$boundary1.$eol;
  34. $body .= "Content-Type: application/octet-stream;".$eol;
  35. $body .= " name=\"".$filename."\"".$eol;
  36. $body .= "Content-Transfer-Encoding: base64".$eol;
  37. $body .= "Content-Disposition: attachment;".$eol;
  38. $body .= " filename=\"".$filename."\"".$eol.$eol;
  39. $body .= "R0lGODlhDwAPALMOAP/qAEVFRQAAAP/OAP8AAP/JAP+0AP6dAP/9E//+k///x///6zMzM//l
  40. AAAAAAAAACH5BAEAAA4ALAAAAAAPAA8AAARd0EkZap3Y1aVSGhcWcAgCnMMRTEEnCCfwpquW
  41. mHEOagoOn7+CKnADxoKGSiLHBBSSAROjCWA8KwPZa7sVrgJZAWE8FhR2msGgESAHziqWutB+
  42. 0zIVg94wzLAsNRMRADs=".$eol.$eol;
  43. # Hier beginnt der zweite Anhang
  44. $filename = "äöüß.rtf";
  45. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  46. $body .= "--".$boundary1.$eol;
  47. $body .= "Content-Type: application/octet-stream;".$eol;
  48. $body .= " name=\"".$filename."\"".$eol;
  49. $body .= "Content-Transfer-Encoding: base64".$eol;
  50. $body .= "Content-Disposition: attachment;".$eol;
  51. $body .= " filename=\"".$filename."\"".$eol.$eol;
  52. $body .= "e1xydGYxXGFuc2lcZGVmZjNcYWRlZmxhbmcxMDI1CntcZm9udHRibHtcZjBcZnJvbWFuXGZwcnEy
  53. XGZjaGFyc2V0MCBUaW1lcyBOZXcgUm9tYW47fXtcZjFcZnJvbWFuXGZwcnEyXGZjaGFyc2V0MiBT
  54. eW1ib2w7fXtcZjJcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBBcmlhbDt9e1xmM1xmcm9tYW5cZnBy
  55. cTJcZmNoYXJzZXQwIFRpbWVzIE5ldyBSb21hbjt9e1xmNFxmc3dpc3NcZnBycTJcZmNoYXJzZXQw
  56. IEFyaWFsO317XGY1XGZzd2lzc1xmcHJxMlxmY2hhcnNldDEgRGVqYVZ1IFNhbnM7fXtcZjZcZm5p
  57. bFxmcHJxMlxmY2hhcnNldDAgQXJpYWwgVW5pY29kZSBNUzt9e1xmN1xmbmlsXGZwcnEyXGZjaGFy
  58. c2V0MCBGcmVlU2Fuczt9e1xmOFxmc3dpc3NcZnBycTBcZmNoYXJzZXQxIEZyZWVTYW5zO319Cntc
  59. Y29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODt9Cntc
  60. c3R5bGVzaGVldHtcczBcc25leHQwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlwaGxlYWQyXGh5
  61. cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUyMDUyXGRiY2hc
  62. YWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzEgTm9ybWFsO30Ke1xzMTVc
  63. c2Jhc2Vkb24wXHNuZXh0MTZcc2IyNDBcc2ExMjBca2VlcG5cZGJjaFxhZjZcZGJjaFxhZjdcYWZz
  64. MjhcbG9jaFxmNFxmczI4IFx1MjIwXCdkY2JlcnNjaHJpZnQ7fQp7XHMxNlxzYmFzZWRvbjBcc25l
  65. eHQxNlxzYjBcc2ExMjAgVGV4dGtcdTI0NlwnZjZycGVyO30Ke1xzMTdcc2Jhc2Vkb24xNlxzbmV4
  66. dDE3XHNiMFxzYTEyMFxkYmNoXGFmOCBMaXN0ZTt9CntcczE4XHNiYXNlZG9uMFxzbmV4dDE4XHNi
  67. MTIwXHNhMTIwXG5vbGluZVxpXGRiY2hcYWY4XGFmczI0XGFpXGZzMjQgQmVzY2hyaWZ0dW5nO30K
  68. e1xzMTlcc2Jhc2Vkb24wXHNuZXh0MTlcbm9saW5lXGRiY2hcYWY4IFZlcnplaWNobmlzO30KfXtc
  69. aW5mb3tcYXV0aG9yIEhvbGdlciBLb2NofXtcY3JlYXRpbVx5cjIwMTRcbW8xMFxkeTIzXGhyMTBc
  70. bWluMjZ9e1xyZXZ0aW1ceXIwXG1vMFxkeTBcaHIwXG1pbjB9e1xwcmludGltXHlyMFxtbzBcZHkw
  71. XGhyMFxtaW4wfXtcY29tbWVudCBMaWJyZU9mZmljZX17XHZlcm42NzE3NTE3MH19XGRlZnRhYjcw
  72. OQpcdmlld3NjYWxlNjkKe1wqXHBnZHNjdGJsCntccGdkc2MwXHBnZHNjdXNlNDUxXHBnd3N4bjEx
  73. OTA2XHBnaHN4bjE2ODM4XG1hcmdsc3huMTEzNFxtYXJncnN4bjExMzRcbWFyZ3RzeG4xMTM0XG1h
  74. cmdic3huMTEzNFxwZ2RzY254dDAgU3RhbmRhcmQ7fX0KXGZvcm1zaGFkZVxwYXBlcmgxNjgzOFxw
  75. YXBlcncxMTkwNlxtYXJnbDExMzRcbWFyZ3IxMTM0XG1hcmd0MTEzNFxtYXJnYjExMzRcc2VjdGRc
  76. c2Jrbm9uZVxzZWN0dW5sb2NrZWQxXHBnbmRlY1xwZ3dzeG4xMTkwNlxwZ2hzeG4xNjgzOFxtYXJn
  77. bHN4bjExMzRcbWFyZ3JzeG4xMTM0XG1hcmd0c3huMTEzNFxtYXJnYnN4bjExMzRcZnRuYmpcZnRu
  78. c3RhcnQxXGZ0bnJzdGNvbnRcZnRubmFyXGFlbmRkb2NcYWZ0bnJzdGNvbnRcYWZ0bnN0YXJ0MVxh
  79. ZnRubnJsYwpccGduZGVjXHBhcmRccGxhaW4gXHMwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlw
  80. aGxlYWQyXGh5cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUy
  81. MDUyXGRiY2hcYWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzF7XHJ0bGNo
  82. IFxsdHJjaFxsb2NoXGxvY2hcZjUKTnVyIGVpbiBUZXN0Li4ufQpccGFyIH0=".$eol.$eol;
  83. # Hier endet der Mail-Body
  84. $body .= "--".$boundary1."--";
  85. $from_name = "Käthe Müller";
  86. $from_email_address = "kaethe@example.org";
  87. $to_name = "Hans Meyer";
  88. $to_email_address = "hans@example.org";
  89. $header = "MIME-Version: 1.0".$eol;
  90. $header .= "Content-Type: multipart/mixed;".$eol;
  91. $header .= " boundary=\"".$boundary1."\"".$eol;
  92. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  93. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  94. 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");
  95. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  96. else echo "Die Mail konnte nicht verschickt werden!";
  97. ?>

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.

Nebenbei bemerkt: Das Referenzieren von Grafiken, die sich auf einem entfernten Server befinden, à la <img src='http://www.example.org/bild.png' alt=''>, gilt als schlechter Stil beim Versenden von E-Mails, auch wenn so die Dateigröße klein gehalten werden kann. Das Referenzieren würde eine Verbindung zu dem entfernten Server erzwingen, was von dem Empfänger unter Umständen nicht gewünscht ist.

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:

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "HTML-Mail mit Grafiken";
  5. $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.";
  6. $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.";
  7. $boundary1 = "x------------plain_text_and_html";
  8. $boundary2 = "x------------html_with_images";
  9. # Hier beginnt der Nur-Text-Teil
  10. $body = "--".$boundary1.$eol;
  11. $body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
  12. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  13. $body .= $p1.$eol.$eol.$p2.$eol.$eol;
  14. # Hier beginnt der HTML-mit-Grafiken-Teil
  15. $body .= "--".$boundary1.$eol;
  16. $body .= "Content-Type: multipart/related;".$eol;
  17. $body .= " boundary=\"".$boundary2."\"".$eol;
  18. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  19. # Hier beginnt der HTML-Teil
  20. $body .= "--".$boundary2.$eol;
  21. $body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
  22. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  23. $body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
  24. $body .= "<h3>HTML-Mail</h3>";
  25. $body .= "<p>".$p1." <img src='cid:image1' alt=''></p>";
  26. $body .= "<p>".$p2." <img src='cid:image2' alt=''></p>";
  27. $body .= "</body></html>".$eol.$eol;
  28. # Hier beginnt die erste Grafik
  29. $filename = "ÄÜÖ.gif";
  30. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  31. $body .= "--".$boundary2.$eol;
  32. $body .= "Content-Type: image/gif;".$eol;
  33. $body .= " name=\"".$filename."\"".$eol;
  34. $body .= "Content-Transfer-Encoding: base64".$eol;
  35. $body .= "Content-Disposition: inline;".$eol;
  36. $body .= " name=\"".$filename."\"".$eol;
  37. $body .= "Content-ID: <image1>".$eol.$eol;
  38. $body .= "R0lGODlhGgASANQUAEIyEsqaCvHSGphtBtSgCqaACOG7E9rVy2pTEqyOEHpqOurq4tuwEu7KGopi
  39. App6DqWafZSKZGVKDv7imv7+8nJiMnpiOv7iIu7CCuLi2rqCArqOCsaqEv7y8v7aGgAAACH/C05F
  40. VFNDQVBFMi4wAwEAAAAh+QQJCgAfACwAAAAAGgASAAAF2+AnftQBKZKkQAc1vvC4QEjCNA1XINAS
  41. /4fKQ+ApegQNw6By+L0yCI7nQq0eMRtExvnpRBLTC6A69iQfEQpgDTsgBOT4RYBhrDUYDeAFAcvF
  42. VGZ2Exp4eyMWBmGAVGMXZgZrhHmHHxINi1WakAATnZQjl5magQ12GBMToCIVDHCkmnQMGwAYqyIQ
  43. BZiOpB4ABgQDEGuVIm4GRLyBtQwEEk0/XgUYDQLExHXBER1cUBsG1DgNGAbNO1tcH0EDDAwG5c0B
  44. DkzpMhASAxsEBBsDEj31XpQ4kWJFi4AhAAAh+QQJCgAfACwAAAAAGAASAAAF3OAnftQBKZKkQAc1
  45. vvC3QEjCNA1XINASw4fKQ+ApegQNw6By+IkyCI7nQq0eMRtE5teJJKYXQFXsST4iLoBadEAIxvCL
  46. AMOQHAATDUYN+cbDVGUMA2p5GBoAFgZggFRiF2UGeHh6iBINjFWakQAYE3h5AJeZmoENDAGdExOH
  47. ABUMb6WacwwbCp2tHxAFmI+lHgAGBAMQH2oAbAgGRL6BnQwEdjFdBRgNAsfHdMMRHT9QGwbWOA0Y
  48. BtA7W05BAwwMBufQAQ5MTiMzEgMbBAQbAxI97L0ocSLFihYCQwAAIfkECQoAHwAsAAAAABoAEgAA
  49. BeHgJ37UASmSpEAHNb7wuEBIwjQNVyDQEv+HykPgKXoEDcOgcvi9MgiO50KtHjEbRMb56UQS0wug
  50. OvYkHxGXCMAWHRACsvwiwDAkzfVEw4aA52JUZgwDEGwAexh8FgZhgVRjF2YGGwqIiBqKABINjlWf
  51. kwEIiIl8H5yen4INDKIAGBMTmh8VDHGqn3UMlR+vsx8QBZ2Rqh4ABgSFa21uCAZExIKvDAR4Tl4F
  52. GA0Ch4d2yREdXFAbBto4DRgG1DtbXB9BAwwMBuvUAQ5M7zIQEgMbBAhsGCChx74XJU6kWNHiYAgA
  53. IfkEBQoAHwAsAAAAABgAEgAABdzgJ37UASmSpEAHNb7wt0BIwjQNVyDQEsOHykPgKXoEDcOgcviJ
  54. MgiO50KtHjEbRObXiSSmF0BV7Ek+Ii6AWnRACMbwiwDDkBwAEw1GDfnGw1RlDANqeRgaABYGYIBU
  55. YhdlBnh4eogSDYxVmpEAGBN4eQCXmZqBDQwBnRMThwAVDG+lmnMMGwqdrR8QBZiPpR4ABgQDEB9q
  56. AGwIBkS+gZ0MBHYxXQUYDQLHx3TDER0/UBsG1jgNGAbQO1tOQQMMDAbn0AEOTE4jMxIDGwQEGwMS
  57. Pey9KHEixYoWAkMAACH+Km1hZGUgYnkgZGFtaWFuIGthbmcgYWthIGg0aGFtc3RlciBmb3IgaXBi
  58. AAA7".$eol.$eol;
  59. # Hier beginnt die zweite Grafik
  60. $filename = "ßäöü.gif";
  61. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  62. $body .= "--".$boundary2.$eol;
  63. $body .= "Content-Type: image/gif;".$eol;
  64. $body .= " name=\"".$filename."\"".$eol;
  65. $body .= "Content-Transfer-Encoding: base64".$eol;
  66. $body .= "Content-Disposition: inline;".$eol;
  67. $body .= " name=\"".$filename."\"".$eol;
  68. $body .= "Content-ID: <image2>".$eol.$eol;
  69. $body .= "R0lGODlhJAASAMQVAAAAAEIxEGNSEHNjMXtjOZxjAJxzCJycY6WUe6Wce7WMCM6cCNalCN61EOe9
  70. EO/GEPfOGPfWGP/eGP/nIf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05F
  71. VFNDQVBFMi4wAwEAAAAh+QQJDwAVACwAAAAAJAASAAAF/mAljmSZEIJAJGXbJsLgVoigNJDDKAIy
  72. Dz2S4KE4tAYGSCQyWUIaBlnpoHAISAbH4ypcTL7gZo5XGjoM2IejOKIyA/AJPDB5GowiqhY9GuCs
  73. IwIQcmFgAREODVwVQ09SFQlADo40CkyFYRF2Pn45Kj4JBlAKEBBGBA2YhZoNCwQVB6UKogYwRAYC
  74. E1uMDnJ0qnAOC1eCEwIGVSk4EEkQr0MRARRz1NIBwlcEpc2KA0AppdkN0RTl5ucBDQrPSikxQIMT
  75. sxOvCKTk5+bXCwY+BBPIxAiAYQDXAGciBIzDh+5BKy4EIgApGMQMwFd5qiypFsDhggJ4KhAwMEEL
  76. FxgpL0ImvPGgVCkHiRaQIXHAnY8ZJEY22Nkg5sdHOIOOqIGMwQ5cN4UqHXEiBYGkSkMAACH5BAkP
  77. ABUALAAAAAAkABIAAAX+YCWOZJkQgkAkZTkISCuLiKA0kMMosHwoDgEpIRjIBgZIJDJZQhoGY0nw
  78. cBhIVMVhuph4v80cj/RzPK4jg1k4+jED8Ak8MHkatiLqUyoyVLUjAhByYF8BEQ4NbAM4QQQxIow5
  79. bAgKTIVgEXYxBxAQCgZQLAkvDnsVBA2YhZoNCwQVghMCBkACCaG1nlsCDnJ0q3AOC0IEnklPKQ+g
  80. AhMPQlQRARRz1dMBw9BKKUUvOBDIsKnSFOXm5wENCuITtWHd3J5ClUrT5+bYCwYxBBEvBgZgyJoA
  81. agKsWA2W2EP3wBUbVAYmrKlABGARCAfLKLTWcEEBPCIOcINExZeBg3ksbjzw5MlBogVjZowgkgLk
  82. CAKhGuh86ZGPzJ8jatRisCMgJKBIZ6JQcRRpCAAAIfkECQ8AFQAsAAAAACQAEgAABf5gJY5kmRCC
  83. QCRl2ybC4FaIoDSQwygCMg89kuChOLQGBkgkMllCGgZZ6aBwCEgGx+MqXEy+4GaOVxo6DNiHozii
  84. MgPwCTwweRqMIqoWPRrgrCMCEHJhYAERDg1cFUNPUhUJQA6ONApMhWERdj5+OSo+CQZQChAQRgQN
  85. mIWaDQsEFQelCqIGMEQGAhNbjA5ydKpwDgtXghMCBlUpOBBJEK9DEQEUc9TSAcJXBKXNigNAKaXZ
  86. DdEU5ebnAQ0Kz0opMUCDE7MTrwik5Ofm1wsGPgQTyMQIgGEA1wBnIgSMw4fuQSsuBCIAKRjEDMBX
  87. eaosqRbA4YICeCoQMDBBCxcYKS9CJrzxoFQpB4kWkCFxwJ2PGSRGNtjZIObHRziDjqiBjMEOXDeF
  88. Kh1xIgWBpEpDAAAh+QQFDwAVACwAAAAAJAASAAAF/mBVJcIgnuhICAKRpDAsPMoRI4LSQA6jCIiY
  89. 0OB4CGADAyQSmTAhDYMJCUQZHo4aSrCYeL9O3i91UDiOp8HufCo3A/AJPDCBGmynmcNwSgwEDlBT
  90. AhByYF8BEQ4NaBVlRXwjBlEKEBA2CApNh2ARdkEVM4IiMwoGAhNGFQQNnIeeDQsEFWo8LUECOxBK
  91. ELOAcnSucA4LRweWplF+fyyWRzMRARRz1NIBxM+FAgZmzV6mE7Os0RTl5ucBDQrilryMJAanA70V
  92. mUvS5+bXCwa4SywlTOiZYGAWqQZM8KF7EAsNAYIKwhwhwQKPiEcJqzFcUAAPgQh/4lURQkrHA0uW
  93. LRwsWjDmBAEDE4o0IrlqUoObKzlOQXEAICiaInBwY+Dj1E+gSEUkWHErqYgQAAA7".$eol.$eol;
  94. # Hier endet der HTML-mit-Grafiken-Teil
  95. $body .= "--".$boundary2."--".$eol.$eol;
  96. # Hier endet der Mail-Body
  97. $body .= "--".$boundary1."--";
  98. $from_name = "Käthe Müller";
  99. $from_email_address = "kaethe@example.org";
  100. $to_name = "Hans Meyer";
  101. $to_email_address = "hans@example.org";
  102. $header = "MIME-Version: 1.0".$eol;
  103. $header .= "Content-Type: multipart/alternative;".$eol;
  104. $header .= " boundary=\"".$boundary1."\"".$eol;
  105. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  106. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  107. 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");
  108. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  109. else echo "Die Mail konnte nicht verschickt werden!";
  110. ?>

Ü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:

Code kopieren
  1. <?php
  2. mb_internal_encoding("UTF-8");
  3. $eol = PHP_EOL;
  4. $subject = "HTML-Mail mit Grafiken und Anhängen";
  5. $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.";
  6. $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.";
  7. $boundary1 = "x------------mail_with_attachments";
  8. $boundary2 = "x------------plain_text_and_html";
  9. $boundary3 = "x------------html_with_images";
  10. # Hier beginnt der Mail-Body
  11. $body = "--".$boundary1.$eol;
  12. $body .= "Content-Type: multipart/alternative;".$eol;
  13. $body .= " boundary=\"".$boundary2."\"".$eol;
  14. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  15. # Hier beginnt der Nur-Text-Teil
  16. $body .= "--".$boundary2.$eol;
  17. $body .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$eol;
  18. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  19. $body .= $p1.$eol.$eol.$p2.$eol.$eol;
  20. # Hier beginnt der HTML-mit-Grafiken-Teil
  21. $body .= "--".$boundary2.$eol;
  22. $body .= "Content-Type: multipart/related;".$eol;
  23. $body .= " boundary=\"".$boundary3."\"".$eol;
  24. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  25. # Hier beginnt der HTML-Teil
  26. $body .= "--".$boundary3.$eol;
  27. $body .= "Content-Type: text/html; charset=\"utf-8\"".$eol;
  28. $body .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
  29. $body .= "<!DOCTYPE html><html><head><title>Mail</title><meta charset='UTF-8'></head><body>";
  30. $body .= "<h3>HTML-Mail</h3>";
  31. $body .= "<p>".$p1." <img src='cid:image1' alt=''></p>";
  32. $body .= "<p>".$p2." <img src='cid:image2' alt=''></p>";
  33. $body .= "</body></html>".$eol.$eol;
  34. # Hier beginnt die erste Grafik
  35. $filename = "ÄÜÖ.gif";
  36. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  37. $body .= "--".$boundary3.$eol;
  38. $body .= "Content-Type: image/gif;".$eol;
  39. $body .= " name=\"".$filename."\"".$eol;
  40. $body .= "Content-Transfer-Encoding: base64".$eol;
  41. $body .= "Content-Disposition: inline;".$eol;
  42. $body .= " name=\"".$filename."\"".$eol;
  43. $body .= "Content-ID: <image1>".$eol.$eol;
  44. $body .= "R0lGODlhGgASANQUAEIyEsqaCvHSGphtBtSgCqaACOG7E9rVy2pTEqyOEHpqOurq4tuwEu7KGopi
  45. App6DqWafZSKZGVKDv7imv7+8nJiMnpiOv7iIu7CCuLi2rqCArqOCsaqEv7y8v7aGgAAACH/C05F
  46. VFNDQVBFMi4wAwEAAAAh+QQJCgAfACwAAAAAGgASAAAF2+AnftQBKZKkQAc1vvC4QEjCNA1XINAS
  47. /4fKQ+ApegQNw6By+L0yCI7nQq0eMRtExvnpRBLTC6A69iQfEQpgDTsgBOT4RYBhrDUYDeAFAcvF
  48. VGZ2Exp4eyMWBmGAVGMXZgZrhHmHHxINi1WakAATnZQjl5magQ12GBMToCIVDHCkmnQMGwAYqyIQ
  49. BZiOpB4ABgQDEGuVIm4GRLyBtQwEEk0/XgUYDQLExHXBER1cUBsG1DgNGAbNO1tcH0EDDAwG5c0B
  50. DkzpMhASAxsEBBsDEj31XpQ4kWJFi4AhAAAh+QQJCgAfACwAAAAAGAASAAAF3OAnftQBKZKkQAc1
  51. vvC3QEjCNA1XINASw4fKQ+ApegQNw6By+IkyCI7nQq0eMRtE5teJJKYXQFXsST4iLoBadEAIxvCL
  52. AMOQHAATDUYN+cbDVGUMA2p5GBoAFgZggFRiF2UGeHh6iBINjFWakQAYE3h5AJeZmoENDAGdExOH
  53. ABUMb6WacwwbCp2tHxAFmI+lHgAGBAMQH2oAbAgGRL6BnQwEdjFdBRgNAsfHdMMRHT9QGwbWOA0Y
  54. BtA7W05BAwwMBufQAQ5MTiMzEgMbBAQbAxI97L0ocSLFihYCQwAAIfkECQoAHwAsAAAAABoAEgAA
  55. BeHgJ37UASmSpEAHNb7wuEBIwjQNVyDQEv+HykPgKXoEDcOgcvi9MgiO50KtHjEbRMb56UQS0wug
  56. OvYkHxGXCMAWHRACsvwiwDAkzfVEw4aA52JUZgwDEGwAexh8FgZhgVRjF2YGGwqIiBqKABINjlWf
  57. kwEIiIl8H5yen4INDKIAGBMTmh8VDHGqn3UMlR+vsx8QBZ2Rqh4ABgSFa21uCAZExIKvDAR4Tl4F
  58. GA0Ch4d2yREdXFAbBto4DRgG1DtbXB9BAwwMBuvUAQ5M7zIQEgMbBAhsGCChx74XJU6kWNHiYAgA
  59. IfkEBQoAHwAsAAAAABgAEgAABdzgJ37UASmSpEAHNb7wt0BIwjQNVyDQEsOHykPgKXoEDcOgcviJ
  60. MgiO50KtHjEbRObXiSSmF0BV7Ek+Ii6AWnRACMbwiwDDkBwAEw1GDfnGw1RlDANqeRgaABYGYIBU
  61. YhdlBnh4eogSDYxVmpEAGBN4eQCXmZqBDQwBnRMThwAVDG+lmnMMGwqdrR8QBZiPpR4ABgQDEB9q
  62. AGwIBkS+gZ0MBHYxXQUYDQLHx3TDER0/UBsG1jgNGAbQO1tOQQMMDAbn0AEOTE4jMxIDGwQEGwMS
  63. Pey9KHEixYoWAkMAACH+Km1hZGUgYnkgZGFtaWFuIGthbmcgYWthIGg0aGFtc3RlciBmb3IgaXBi
  64. AAA7".$eol.$eol;
  65. # Hier beginnt die zweite Grafik
  66. $filename = "ßäöü.gif";
  67. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  68. $body .= "--".$boundary3.$eol;
  69. $body .= "Content-Type: image/gif;".$eol;
  70. $body .= " name=\"".$filename."\"".$eol;
  71. $body .= "Content-Transfer-Encoding: base64".$eol;
  72. $body .= "Content-Disposition: inline;".$eol;
  73. $body .= " name=\"".$filename."\"".$eol;
  74. $body .= "Content-ID: <image2>".$eol.$eol;
  75. $body .= "R0lGODlhJAASAMQVAAAAAEIxEGNSEHNjMXtjOZxjAJxzCJycY6WUe6Wce7WMCM6cCNalCN61EOe9
  76. EO/GEPfOGPfWGP/eGP/nIf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05F
  77. VFNDQVBFMi4wAwEAAAAh+QQJDwAVACwAAAAAJAASAAAF/mAljmSZEIJAJGXbJsLgVoigNJDDKAIy
  78. Dz2S4KE4tAYGSCQyWUIaBlnpoHAISAbH4ypcTL7gZo5XGjoM2IejOKIyA/AJPDB5GowiqhY9GuCs
  79. IwIQcmFgAREODVwVQ09SFQlADo40CkyFYRF2Pn45Kj4JBlAKEBBGBA2YhZoNCwQVB6UKogYwRAYC
  80. E1uMDnJ0qnAOC1eCEwIGVSk4EEkQr0MRARRz1NIBwlcEpc2KA0AppdkN0RTl5ucBDQrPSikxQIMT
  81. sxOvCKTk5+bXCwY+BBPIxAiAYQDXAGciBIzDh+5BKy4EIgApGMQMwFd5qiypFsDhggJ4KhAwMEEL
  82. FxgpL0ImvPGgVCkHiRaQIXHAnY8ZJEY22Nkg5sdHOIOOqIGMwQ5cN4UqHXEiBYGkSkMAACH5BAkP
  83. ABUALAAAAAAkABIAAAX+YCWOZJkQgkAkZTkISCuLiKA0kMMosHwoDgEpIRjIBgZIJDJZQhoGY0nw
  84. cBhIVMVhuph4v80cj/RzPK4jg1k4+jED8Ak8MHkatiLqUyoyVLUjAhByYF8BEQ4NbAM4QQQxIow5
  85. bAgKTIVgEXYxBxAQCgZQLAkvDnsVBA2YhZoNCwQVghMCBkACCaG1nlsCDnJ0q3AOC0IEnklPKQ+g
  86. AhMPQlQRARRz1dMBw9BKKUUvOBDIsKnSFOXm5wENCuITtWHd3J5ClUrT5+bYCwYxBBEvBgZgyJoA
  87. agKsWA2W2EP3wBUbVAYmrKlABGARCAfLKLTWcEEBPCIOcINExZeBg3ksbjzw5MlBogVjZowgkgLk
  88. CAKhGuh86ZGPzJ8jatRisCMgJKBIZ6JQcRRpCAAAIfkECQ8AFQAsAAAAACQAEgAABf5gJY5kmRCC
  89. QCRl2ybC4FaIoDSQwygCMg89kuChOLQGBkgkMllCGgZZ6aBwCEgGx+MqXEy+4GaOVxo6DNiHozii
  90. MgPwCTwweRqMIqoWPRrgrCMCEHJhYAERDg1cFUNPUhUJQA6ONApMhWERdj5+OSo+CQZQChAQRgQN
  91. mIWaDQsEFQelCqIGMEQGAhNbjA5ydKpwDgtXghMCBlUpOBBJEK9DEQEUc9TSAcJXBKXNigNAKaXZ
  92. DdEU5ebnAQ0Kz0opMUCDE7MTrwik5Ofm1wsGPgQTyMQIgGEA1wBnIgSMw4fuQSsuBCIAKRjEDMBX
  93. eaosqRbA4YICeCoQMDBBCxcYKS9CJrzxoFQpB4kWkCFxwJ2PGSRGNtjZIObHRziDjqiBjMEOXDeF
  94. Kh1xIgWBpEpDAAAh+QQFDwAVACwAAAAAJAASAAAF/mBVJcIgnuhICAKRpDAsPMoRI4LSQA6jCIiY
  95. 0OB4CGADAyQSmTAhDYMJCUQZHo4aSrCYeL9O3i91UDiOp8HufCo3A/AJPDCBGmynmcNwSgwEDlBT
  96. AhByYF8BEQ4NaBVlRXwjBlEKEBA2CApNh2ARdkEVM4IiMwoGAhNGFQQNnIeeDQsEFWo8LUECOxBK
  97. ELOAcnSucA4LRweWplF+fyyWRzMRARRz1NIBxM+FAgZmzV6mE7Os0RTl5ucBDQrilryMJAanA70V
  98. mUvS5+bXCwa4SywlTOiZYGAWqQZM8KF7EAsNAYIKwhwhwQKPiEcJqzFcUAAPgQh/4lURQkrHA0uW
  99. LRwsWjDmBAEDE4o0IrlqUoObKzlOQXEAICiaInBwY+Dj1E+gSEUkWHErqYgQAAA7".$eol.$eol;
  100. # Hier endet der HTML-mit-Grafiken-Teil
  101. $body .= "--".$boundary3."--".$eol.$eol;
  102. # Hier endet der Nur-Text- plus HTML-Teil
  103. $body .= "--".$boundary2."--".$eol.$eol;
  104. # Hier beginnt der erste Anhang
  105. $filename = "ÄÜÖ.gif";
  106. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  107. $body .= "--".$boundary1.$eol;
  108. $body .= "Content-Type: application/octet-stream;".$eol;
  109. $body .= " name=\"".$filename."\"".$eol;
  110. $body .= "Content-Transfer-Encoding: base64".$eol;
  111. $body .= "Content-Disposition: attachment;".$eol;
  112. $body .= " filename=\"".$filename."\"".$eol.$eol;
  113. $body .= "R0lGODlhDwAPALMOAP/qAEVFRQAAAP/OAP8AAP/JAP+0AP6dAP/9E//+k///x///6zMzM//l
  114. AAAAAAAAACH5BAEAAA4ALAAAAAAPAA8AAARd0EkZap3Y1aVSGhcWcAgCnMMRTEEnCCfwpquW
  115. mHEOagoOn7+CKnADxoKGSiLHBBSSAROjCWA8KwPZa7sVrgJZAWE8FhR2msGgESAHziqWutB+
  116. 0zIVg94wzLAsNRMRADs=".$eol.$eol;
  117. # Hier beginnt der zweite Anhang
  118. $filename = "äöüß.rtf";
  119. $filename = mb_encode_mimeheader($filename, "UTF-8", "B");
  120. $body .= "--".$boundary1.$eol;
  121. $body .= "Content-Type: application/octet-stream;".$eol;
  122. $body .= " name=\"".$filename."\"".$eol;
  123. $body .= "Content-Transfer-Encoding: base64".$eol;
  124. $body .= "Content-Disposition: attachment;".$eol;
  125. $body .= " filename=\"".$filename."\"".$eol.$eol;
  126. $body .= "e1xydGYxXGFuc2lcZGVmZjNcYWRlZmxhbmcxMDI1CntcZm9udHRibHtcZjBcZnJvbWFuXGZwcnEy
  127. XGZjaGFyc2V0MCBUaW1lcyBOZXcgUm9tYW47fXtcZjFcZnJvbWFuXGZwcnEyXGZjaGFyc2V0MiBT
  128. eW1ib2w7fXtcZjJcZnN3aXNzXGZwcnEyXGZjaGFyc2V0MCBBcmlhbDt9e1xmM1xmcm9tYW5cZnBy
  129. cTJcZmNoYXJzZXQwIFRpbWVzIE5ldyBSb21hbjt9e1xmNFxmc3dpc3NcZnBycTJcZmNoYXJzZXQw
  130. IEFyaWFsO317XGY1XGZzd2lzc1xmcHJxMlxmY2hhcnNldDEgRGVqYVZ1IFNhbnM7fXtcZjZcZm5p
  131. bFxmcHJxMlxmY2hhcnNldDAgQXJpYWwgVW5pY29kZSBNUzt9e1xmN1xmbmlsXGZwcnEyXGZjaGFy
  132. c2V0MCBGcmVlU2Fuczt9e1xmOFxmc3dpc3NcZnBycTBcZmNoYXJzZXQxIEZyZWVTYW5zO319Cntc
  133. Y29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODt9Cntc
  134. c3R5bGVzaGVldHtcczBcc25leHQwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlwaGxlYWQyXGh5
  135. cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUyMDUyXGRiY2hc
  136. YWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzEgTm9ybWFsO30Ke1xzMTVc
  137. c2Jhc2Vkb24wXHNuZXh0MTZcc2IyNDBcc2ExMjBca2VlcG5cZGJjaFxhZjZcZGJjaFxhZjdcYWZz
  138. MjhcbG9jaFxmNFxmczI4IFx1MjIwXCdkY2JlcnNjaHJpZnQ7fQp7XHMxNlxzYmFzZWRvbjBcc25l
  139. eHQxNlxzYjBcc2ExMjAgVGV4dGtcdTI0NlwnZjZycGVyO30Ke1xzMTdcc2Jhc2Vkb24xNlxzbmV4
  140. dDE3XHNiMFxzYTEyMFxkYmNoXGFmOCBMaXN0ZTt9CntcczE4XHNiYXNlZG9uMFxzbmV4dDE4XHNi
  141. MTIwXHNhMTIwXG5vbGluZVxpXGRiY2hcYWY4XGFmczI0XGFpXGZzMjQgQmVzY2hyaWZ0dW5nO30K
  142. e1xzMTlcc2Jhc2Vkb24wXHNuZXh0MTlcbm9saW5lXGRiY2hcYWY4IFZlcnplaWNobmlzO30KfXtc
  143. aW5mb3tcYXV0aG9yIEhvbGdlciBLb2NofXtcY3JlYXRpbVx5cjIwMTRcbW8xMFxkeTIzXGhyMTBc
  144. bWluMjZ9e1xyZXZ0aW1ceXIwXG1vMFxkeTBcaHIwXG1pbjB9e1xwcmludGltXHlyMFxtbzBcZHkw
  145. XGhyMFxtaW4wfXtcY29tbWVudCBMaWJyZU9mZmljZX17XHZlcm42NzE3NTE3MH19XGRlZnRhYjcw
  146. OQpcdmlld3NjYWxlNjkKe1wqXHBnZHNjdGJsCntccGdkc2MwXHBnZHNjdXNlNDUxXHBnd3N4bjEx
  147. OTA2XHBnaHN4bjE2ODM4XG1hcmdsc3huMTEzNFxtYXJncnN4bjExMzRcbWFyZ3RzeG4xMTM0XG1h
  148. cmdic3huMTEzNFxwZ2RzY254dDAgU3RhbmRhcmQ7fX0KXGZvcm1zaGFkZVxwYXBlcmgxNjgzOFxw
  149. YXBlcncxMTkwNlxtYXJnbDExMzRcbWFyZ3IxMTM0XG1hcmd0MTEzNFxtYXJnYjExMzRcc2VjdGRc
  150. c2Jrbm9uZVxzZWN0dW5sb2NrZWQxXHBnbmRlY1xwZ3dzeG4xMTkwNlxwZ2hzeG4xNjgzOFxtYXJn
  151. bHN4bjExMzRcbWFyZ3JzeG4xMTM0XG1hcmd0c3huMTEzNFxtYXJnYnN4bjExMzRcZnRuYmpcZnRu
  152. c3RhcnQxXGZ0bnJzdGNvbnRcZnRubmFyXGFlbmRkb2NcYWZ0bnJzdGNvbnRcYWZ0bnN0YXJ0MVxh
  153. ZnRubnJsYwpccGduZGVjXHBhcmRccGxhaW4gXHMwXG5vd2lkY3RscGFye1wqXGh5cGhlbjJcaHlw
  154. aGxlYWQyXGh5cGh0cmFpbDJcaHlwaG1heDB9XGNmMFxrZXJuaW5nMVxkYmNoXGFmNlxsYW5nZmUy
  155. MDUyXGRiY2hcYWY3XGFmczI0XGFsYW5nMTA4MVxsb2NoXGYzXGZzMjRcbGFuZzEwMzF7XHJ0bGNo
  156. IFxsdHJjaFxsb2NoXGxvY2hcZjUKTnVyIGVpbiBUZXN0Li4ufQpccGFyIH0=".$eol.$eol;
  157. # Hier endet der Mail-Body
  158. $body .= "--".$boundary1."--";
  159. $from_name = "Käthe Müller";
  160. $from_email_address = "kaethe@example.org";
  161. $to_name = "Hans Meyer";
  162. $to_email_address = "hans@example.org";
  163. $header = "MIME-Version: 1.0".$eol;
  164. $header .= "Content-Type: multipart/mixed;".$eol;
  165. $header .= " boundary=\"".$boundary1."\"".$eol;
  166. $header .= "Content-Transfer-Encoding: 8bit".$eol;
  167. $header .= "From: ".mb_encode_mimeheader($from_name, "UTF-8", "Q")." <".mb_encode_mimeheader($from_email_address, "UTF-8", "Q").">";
  168. 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");
  169. if (mb_send_mail($to, $subject, $body, $header)) echo "Die Mail wurde verschickt.";
  170. else echo "Die Mail konnte nicht verschickt werden!";
  171. ?>

MIME-Typ ermitteln

Folgende Funktion ermittelt den MIME-Typ einer Datei, um diesen String im Mail-Quelltext zu verwenden:

Code kopieren
  1. function getmime($file) {
  2. # returns mime type string for file
  3. $finfo = finfo_open(FILEINFO_MIME_TYPE);
  4. $mime = finfo_file($finfo, $file);
  5. finfo_close($finfo);
  6. return $mime;
  7. }

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";