Webworking: emails mit Anhang mittels php-mail-Funktion erstellen
Die
mail()-Funktion in php ist eine geniale Funktion, da sie mit ein oder
zwei einfachen Befehlen die Übermittlung von emails ermöglicht. Mit der
Grundfunktion kommt deshalb jeder php-Programmierer klar.
Die Funktion erlaubt eigentlich auch den Versand von emails mit Anhang (Attachements). Hier tauchen aber enorme Probleme auf.
Im php-Handbuch (http://www.php.net/manual/de/function.mail.php) gibt es noch nicht einmal ein Anwendungsbeispiel, was zu denken gibt, sondern nur wenig hilfreiche Verweise. Zitat:
Der zititerte Aufsatz auf zend.com (in englisch) ist nicht wirklich hilfreich.
Auch in der php-FAQ findet man kein Beispiel. Zitat:
Die korrekte Programmierung ist voller Tücken. Bei den Beispielsskripten, die man im Internet findet, sind Fehler oder Schwachstellen enthalten, die sich oft nicht sofort bemerkbar machen. So passiert es oft, dass einzelne Empfänger keine oder verhackstückte email-Anhänge erhalten, was zu einem Dauerthema in Diskussionsforen führt. Ein sehr schönes Beispiel für die Komplexität ist folgender Forumsthread, der hier für viele steht:
Problem ist oft der "Boundery", der benötigte Trenner, der die E-Mail-Abschnitte voneinander trennt. Er wirdin den gängigen Beispielen zum Teil mit "--", z.T. mit "==" eingeleitet:
Da der Trenner aber in der email vorkommen könnte, was schädlich wäre, müsste eigentlich eine entsprechende Prüfung durchgeführt werden, genaugenommen: Es muß auf
geprüft werden. Dass die Skripten trotzdem funktionieren, scheint daran zu liegen, dass ein solches Vorkommen sehr selten ist.
Empfohlen wird in diesem Zusammenhang die Verwendung eines Zeichens, das nicht vorkommen kann, z.B. "=_"
Fazit: email-Skript-Routinen für Attachement-emails muss man sich
erst im Internet suchen. Diese von dritten übernommene Skript-Routinen
funktionieren in der Regel ohne Fehlermeldung, es kann aber vorkommen,
dass es aus unerklärlichen Gründen bei einzelnen mails oder bei einzelne
Empfänger zu Problemen kommt.
Empfehlenswert ist die Verwendung einer Klasse, in der diese Technik ausgereift ist. Die PEAR-Klasse ist etwas aufwändig. Daneben gibt es noch die Class "PHPMAiler" von http://phpmailer.codeworxtech.com (scheint das einfachste zu sein) und HTML Mime Mail for PHP von phpguru.org.
Die Funktion erlaubt eigentlich auch den Versand von emails mit Anhang (Attachements). Hier tauchen aber enorme Probleme auf.
Im php-Handbuch (http://www.php.net/manual/de/function.mail.php) gibt es noch nicht einmal ein Anwendungsbeispiel, was zu denken gibt, sondern nur wenig hilfreiche Verweise. Zitat:
Hinweis:
E-Mails mit Anhängen und speziellen Inhalten (wie HTML) können mit
dieser Funktion versendet werden. Dazu wird MIME-Encoding verwendet.
Weitere Informationen dazu finden Sie in einem » Zend-Artikel und in den » PEAR-Mime-Klassen.
Der zititerte Aufsatz auf zend.com (in englisch) ist nicht wirklich hilfreich.
Auch in der php-FAQ findet man kein Beispiel. Zitat:
Wie kann ich ein Attachment mit einer Mail versenden?
http://php-faq.de/q-mail-attachment.html
http://php-faq.de/q-mail-attachment.html
Bei der mail()-Funktion
von PHP kann man im vierten Argument jeden beliebigen zusätzlichen
Header angeben. Attachments werden MIME-kodiert. Eine HTML Mime Mail class
kapselt diese Funktionalität und macht die ganze Geschichte recht
einfach. Unter der genannten URL finden sich auch Anwendungsbeispiele.
Die korrekte Programmierung ist voller Tücken. Bei den Beispielsskripten, die man im Internet findet, sind Fehler oder Schwachstellen enthalten, die sich oft nicht sofort bemerkbar machen. So passiert es oft, dass einzelne Empfänger keine oder verhackstückte email-Anhänge erhalten, was zu einem Dauerthema in Diskussionsforen führt. Ein sehr schönes Beispiel für die Komplexität ist folgender Forumsthread, der hier für viele steht:
Beispiel: http://forum.de.selfhtml.org/archiv/2006/2/t123122/
Problem ist oft der "Boundery", der benötigte Trenner, der die E-Mail-Abschnitte voneinander trennt. Er wirdin den gängigen Beispielen zum Teil mit "--", z.T. mit "==" eingeleitet:
$mime_boundary = "==Multipart_Boundary_x{md5(time()}x";
oder
$mime_boundary = "--Multipart_Boundary_x{md5(time()}x";
Da der Trenner aber in der email vorkommen könnte, was schädlich wäre, müsste eigentlich eine entsprechende Prüfung durchgeführt werden, genaugenommen: Es muß auf
"\n--$mime_boundary\r\n"
geprüft werden. Dass die Skripten trotzdem funktionieren, scheint daran zu liegen, dass ein solches Vorkommen sehr selten ist.
Empfohlen wird in diesem Zusammenhang die Verwendung eines Zeichens, das nicht vorkommen kann, z.B. "=_"
Zitat Zeile 1146 aus Spezifikation RFC 2045
Since the hyphen character ("-") may be represented as itself in the
Quoted-Printable encoding, care must be taken, when encapsulating a
quoted-printable encoded body inside one or more multipart entities,
to ensure that the boundary delimiter does not appear anywhere in the
encoded body. (A good strategy is to choose a boundary that includes
a character sequence such as "=_" which can never appear in a
quoted-printable body. See the definition of multipart messages in
RFC 2046.)
Quoted-Printable encoding, care must be taken, when encapsulating a
quoted-printable encoded body inside one or more multipart entities,
to ensure that the boundary delimiter does not appear anywhere in the
encoded body. (A good strategy is to choose a boundary that includes
a character sequence such as "=_" which can never appear in a
quoted-printable body. See the definition of multipart messages in
RFC 2046.)
Empfehlenswert ist die Verwendung einer Klasse, in der diese Technik ausgereift ist. Die PEAR-Klasse ist etwas aufwändig. Daneben gibt es noch die Class "PHPMAiler" von http://phpmailer.codeworxtech.com (scheint das einfachste zu sein) und HTML Mime Mail for PHP von phpguru.org.
Der Artikel ist ursprünglich auf www.burkes.de erschienen
und im März 2012 hierher übertragen worden.