Gunther: Mail mit Anhang verschicken

Hallo,

ich habe ein Problem mit dem versenden einer Datei per Mail.

Folgendes habe ich mir zurecht gebastelt:

[//Anhang speichern
$uploaddir = '../newsletter/';
$uploadfile = $uploaddir. $_FILES['datei']['name'];
move_uploaded_file($_FILES['datei']['tmp_name'], $uploadfile);

//verschicken einer Mail inkl. Datei
$grenze="grenzlinie";
$name_des_bildes=$HTTP_POST_FILES['datei']['name'];
$headers ="MIME-Version: 1.0\r\n";
$headers.="From: $autor\n";
$headers.="Content-Type: multipart/mixed;\n\tboundary=$grenze\n";
$botschaft="\n--$grenze\n";
$botschaft.="Content-transfer-encoding: 7BIT\r\n";
$botschaft.="Content-type: text/plain\n\n";
$botschaft.= $mailtext;
$botschaft.="\n\n";
$botschaft.="\n--$grenze\n";
$botschaft.="Content-Type: application/octetstream;\n\tname=$name_des_bildes\n";
$botschaft.="Content-Transfer-Encoding: base64\n";
$botschaft.="Content-Disposition: attachment;\n\tfilename=$name_des_bildes\n\n";
$zeiger_auf_datei=fopen("$uploadfile","rb");
$inhalt_der_datei=fread($zeiger_auf_datei,filesize("$uploadfile"));
fclose($zeiger_auf_datei);
$inhalt_der_datei=chunk_split(base64_encode($inhalt_der_datei));
$botschaft.=$inhalt_der_datei;
$botschaft.="\n\n";
$botschaft.="--$grenze";
mail($mailadresse,$betreff,$botschaft,$headers);
...]

Beim selektieren einer test.pdf-Datei bekommt der Empfänger die Mail mit ZWEI Anhängen! Die erste Datei trägt den Namen "ATT00001", der zweite Anhang "ATT00002.txt". Also keine pdf-Datei kommt an, und auch der Ursprungsname "test.pdf" taucht nirgens auf. Wenn ich die 1. Datei speichere und manuell die Endung pdf anfüge, kann ich die Datei öffnen. Das ist aber ja nicht das Ziel.

Hat jemand eine hilfreiche Idee?

Vielen Dank!

  1. Hallo Gunther,

    application/octetstream ist nicht der MIME-Type eines PDFs, application/pdf sollte es sein. Die kannst du über mime_content_type() feststellen.

    Gruß
    Julius

  2. Tach!

    $name_des_bildes=$HTTP_POST_FILES['datei']['name'];

    Die Verwendung von $HTTP_POST_FILES ist seit PHP 4.1, also seit 2001, nicht mehr vorgesehen. Den Dateinamen bekommst du auch aus $_FILES, was du ja schon

    $uploadfile = $uploaddir. $_FILES['datei']['name'];

    an dieser Stelle verwendet hast.

    Hat jemand eine hilfreiche Idee?

    Vertrödel nicht deine Zeit mit dem Zu-Fuß-Zusammenbauen von Mails mit Anhängen. Nimm eine fertige Komponente, mit der du die Aufgabe in wenigen Zeilen und funktionierend erledigt hast. Beispielsweise sei da der Swift Mailer genannt.

    dedlfix.

    1. Bestens! - Vielen Dank, jetzt klappt es richtig 😀

  3. Hello,

    Du hast die Mailheader nicht alle mit "\r\n" abgeschlossen. Das ist aber notwendig. Die mail()-Funktion von PHP ersetzt sie dann bei Bedarf (sendmail-script) wieder gegen "\n" oder lässt sie bei "\r\n" für die Verarbeitung des smtp-moduls in Windows (z. B. Mercury-Mail). Da das SMTP aber "\r\n" verlangt für die Header, ersetzt das sendmail-programm die "\n" wieder durch "\r\n".

    Bei so viel Hin- und Herersetzungen ist es verständlich, dass am Anfang schon besser alles stimmen sollte, wenn am Ende noch etwas herauskommen soll ;-)

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.