Freitag, 2. März 2012

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:

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

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.

Der Artikel ist ursprünglich auf www.burkes.de erschienen 
und im März 2012 hierher übertragen worden.

  © Blogger template 'Fly Away' by Ourblogtemplates.com 2008

Back to TOP