Problem: PHP Versand mit Anhang fehlerhaft

Sehr oft tritt bei eigenen Servern das Problem auf, dass der interne Mailversand über PHP Fehler ergibt. Speziell beim Versand von Nachrichten mit Anhang erscheint bei einigen der Fehler „Multiple or malformed newlines found in additional_header„.

Als Lösung wird in den Foren sehr oft auf fertige Mailerklassen hingewiesen, um das Problem zu umgehen bzw. zu lösen. Doch warum? Die Lösung ist eine korrekte PHP Programmierung.

Hier Anhand eines Beispiels bei Versand einer Email mit PDF Anhang:

Die Lösung: PHP Versand mit Anhang fehlerfrei.

Um eine Email mit einem Anhang (Hier ein PDF) zu senden, wird der folgende PHP Code erfolgreich funktionieren. Wichtig hierbei ist der Unterschied zwischen „\n“ und „\r\n“.

\n – Bedeutet Zeilenvorschub

\r – Bedeutet Wagenrücklauf

Viele werden festgestellt haben, dass das eigene Script auf Server 1 super läuft und plötzlich bei Server 2 entsprechend den Fehler der multiplen Newlines ausgibt. Das liegt an den jeweiligen Endungen der Header bzw. Contentbefehle.

Einige Server (Php Versionen) erwarten nur ein \n wobei grundsätzlich die \r\n Variante korrekt ist.

h

Der PHP Sourcecode:

<?php
# Diese Variablen sind für die Datei
$file = „./pfadzurdatei/dokument.pdf“;
$file_name = „neuername.pdf“;
$file_content = fread(fopen($file,“r“),filesize($file));
$file_content = chunk_split(base64_encode($file_content));

# Hier ist die Variable mit einer Beispielnachricht
$betreff = „Eine Nachricht mit PDF Anhang“;
$message = „Als Anhang erhalten Sie ein Dokument im PDF Format.“;

# Nun die Variablen für Empfänger und Versender
$empfaenger = „email@empfaengerdomain.de“;
$absender = „Absendername“;
$absender_mail = „email@ihredomain.de“;
$reply = „email@ihredomain.de“;

$boundary = „—–=“ . md5(uniqid(mt_rand(), 1));

# Hier beginnt der Header der PHP Email:
$header =“From:“.$absender.“<„.$absender_mail.“>\n“;
$header .= „Reply-To: „.$reply.“\n“;

$header.= „MIME-Version: 1.0\r\n“;
$header.= „Content-Type: multipart/mixed;\r\n“;
$header.= “ boundary=\““.$boundary.“\“\r\n“;

# Nun folgt der Content der PHP Email
# Erst der Text
$content = „This is a multi-part message in MIME format.\r\n\r\n“;
$content.= „–„.$boundary.“\r\n“;
$content.= „Content-Type: text/html charset=\“iso-8859-1\“\r\n“;
$content.= „Content-Transfer-Encoding: 8bit\r\n\r\n“;
$content.= $message.“\r\n“;

# Dann der entsprechende Anhang
# Hierbei wird der eigentliche Dateiname durch den neuen $file_name ersetzt
# und an den Empfänger übergeben
$content .= „–„.$boundary.“\r\n“;
$content .= „Content-Type: application/octet-stream; name=\“$file_name\“\r\n“;
$content .= „Content-Disposition: attachment; filename=\“$file_name\“\r\n“;
$content .= „Content-Transfer-Encoding: base64\r\n\r\n“;
$content .= $file_content.“\r\n“;

# Zuletzt der eigentliche Versand der kompletten Nachricht
mail($empfaenger, $betreff, $content, $header)
?>

Sicherheit bei Variablen beachten

Im Sourcecode sind keine Sicherheitsfunktionen oder Sonstiges implementiert.
Er soll nur zeigen, dass sehr wohl über PHP mail ein Versand einer Email mit Anhang ohne entsprechend fertige Klassen durchgeführt werden kann.

Somit sind Sie jetzt in der Lage, Ihr eigentliches Programm mit dieser Funktion korrekt zu erweitern und haben mehr Zeit für andere PHP Fehler 🙂

Viel Erfolg

www.beruni.de