Mit PHP eine E-Mail mit Anhang schreiben [UPDATE]

UPDATE: Siehe unten im Text

Ich habe nun in den letzten Stunden viele Links und Code-Schnipsel gefunden mit denen man über die normale „mail“-Funktion von php einen Anhang an eine E-Mail hängen kann.

Leider führte kein Einziger davon zu Erfolg. Mein GMX-Webmailer hat nie den Anhang dargestellt sondern immer nur den MIME-Teil der E-Mail. Ich habe schon gedacht, dass irgendwas mit der PHP-Version oder dem nachgelagerten SSTMP nicht stimmt bis ich diesen Link gefunden habe:

http://www.immer-das-selbe.de/webmail-ansicht-gmx-zerstort-e-mailansicht-e-mail-anhang/

Und genau das war/ist die Lösung, Danke !

Keine Ahnung warum in den ganzen Beispielen immer ein \r\n steht aber bei mir hat das definitiv nicht geklappt. Lediglich mit einem \n versehen klappte es auf Anhieb!

Der Linefeed-Unterschied-Blödsinn zwischen DOS/Windows-Mac-Unix/Linux war schon immer blöd aber hier hatte ich nicht damit gerechnet. (Meiner unmaßgeblichen Meinung ist allerdings „\r\n“ das einzig grundsätzlich Richtige da das Ganze von der Schreibmaschine abstammt und ein Carriage Return nicht zwangläufig eine Newline beinhaltet…)

Was ich jetzt benutze kommt von http://www.finalwebsites.com/forums/topic/php-e-mail-attachment-script

ohne die \r dann also so:

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
 $file = $path.$filename;
 $file_size = filesize($file);
 $handle = fopen($file, "r");
 $content = fread($handle, $file_size);
 fclose($handle);
 $content = chunk_split(base64_encode($content));
 $uid = md5(uniqid(time()));
 $name = basename($file);
 $header = "From: ".$from_name." <".$from_mail.">\n";
 $header .= "Reply-To: ".$replyto."\n";
 $header .= "MIME-Version: 1.0\n";
 $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\n\n";
 $header .= "This is a multi-part message in MIME format.\n";
 $header .= "--".$uid."\n";
 $header .= "Content-type:text/plain; charset=iso-8859-1\n";
 $header .= "Content-Transfer-Encoding: 7bit\n\n";
 $header .= $message."\n\n";
 $header .= "--".$uid."\n";
 $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\n"; // use different content types here
 $header .= "Content-Transfer-Encoding: base64\n";
 $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\n\n";
 $header .= $content."\n\n";
 $header .= "--".$uid."--";
 if (mail($mailto, $subject, "", $header)) {
 echo "mail send ... OK"; // or use booleans here
 } else {
 echo "mail send ... ERROR!";
 }
 }

[UPDATE]

Plötzlich und unerwartet schlägt das z.B. beim Provider 1&1 fehl!

Es kommt die Fehlermeldung „PHP Warning:  mail(): Multiple or malformed newlines found in additional_header in“

Das liegt laut http://stackoverflow.com/questions/30887610/error-with-php-mail-multiple-or-malformed-newlines-found-in-additional-header

daran, dass es wohl ein Update in PHP gab welches dafür sorgt, dass das Ganze nun strikter gehandhabt wird. Die Lösung ist dort auch zu finden:

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
 $file = $path.$filename;
 $file_size = filesize($file);
 $handle = fopen($file, "r");
 $content = fread($handle, $file_size);
 fclose($handle);
 $content = chunk_split(base64_encode($content));
 $uid = md5(uniqid(time()));
 $name = basename($file);
 $header = "From: ".$from_name." <".$from_mail.">\n";
 $header .= "Reply-To: ".$replyto."\n";
 $header .= "MIME-Version: 1.0\n";
 $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\n\n";
 $emessage= "--".$uid."\n";
 $emessage.= "Content-type:text/plain; charset=iso-8859-1\n";
 $emessage.= "Content-Transfer-Encoding: 7bit\n\n";
 $emessage .= $message."\n\n";
 $emessage.= "--".$uid."\n";
 $emessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\n"; // use different content types here
 $emessage .= "Content-Transfer-Encoding: base64\n";
 $emessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\n\n";
 $emessage .= $content."\n\n";
 $emessage .= "--".$uid."--";

 if (mail($mailto, $subject, $emessage, $header)) {
 echo "mail send ... OK"; // or use booleans here
 } else {
 echo "mail send ... ERROR!";
 $error = error_get_last();
 echo "\nERROR: " . $error["message"] ."\n";
 }

 

Ein Gedanke zu „Mit PHP eine E-Mail mit Anhang schreiben [UPDATE]“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.