Andreas: Dateianhang (PDF) mit sendmail aus PHP-Script versenden

Hallo,

ich befasse mich schon seit Tagen mit dem gleichen Problem und hab auch bei google.de etc. nichts passendes gefunden:

Aus Scripten heraus versenden wir Mails immer über eine Funktion, die direkt "sendmail" anspricht. Mit "text/plain"-Mails ist das auch kein Problem. Jetzt kommt allerdings hinzu, dass eine PDF-Datei als Anhang mit verschickt werden soll.

Folgende Funktion habe ich schon "zusammengeschustert":

function sendmail ($empfaenger, $subject, $str, $rechnr) {

$fp = popen('/usr/sbin/sendmail -f "xxx@xxx.de" "'.$empfaenger.'"',"w");

if(!$fp) {

return false;
        }
        else
        {
            $file = ("rechnungen/".$rechnr.".pdf");
            $fo = fopen ($file, "rb");
            $data = fread($fo,filesize($file));
            fclose($fo);

fputs ($fp, "From: xxx@xxx.de\n");
            fputs ($fp, "To: ".$empfaenger."\n");
            fputs ($fp, "Subject: Testmail\n");
            fputs ($fp, "MIME-Version: 1.0\n");
            fputs ($fp, "Content-Type: MULTIPART/MIXED; BOUNDARY=8323328-2120168431-824156555=:325\n");
            fputs ($fp, "--8323328-2120168431-824156555=:325\n");
            fputs ($fp, "Content-Type: application/octet-stream; name="".$rechnr.".pdf"\n");
            fputs ($fp, "Content-Transfer-Encoding: BASE64");
            fputs ($fp, "Content-Description:\n");
            fputs ($fp, $data);
            fputs ($fp, "--8323328-2120168431-824156555=:325--\n");
            fputs ($fp, "Content-Type: text/plain; charset=US-ASCII\n\n");
            fputs ($fp, "der normale mailtext\n";
            fputs ($fp, "--8323328-2120168431-824156555=:325\n");
            pclose($fp);

return true;
        }
    }

Egal, was ich schraube, es klappt nicht. Der normale Mailtext kommt allerdings so nie an. Das PDF als Anhang ist vorhanden, aber leider kein richtiges PDF. Müsste man das PDF auf andere Art encoden? Weiß jemand, warum der Text nicht ankommt?

Würde mich über Tipps freuen. Bin langsam am verzweifeln :)

PS: Mit reinen Text-Mails macht diese Funktion keine Probleme und ist so schon seit Monaten im Einsatz.

Andreas

  1. Hello,

    Hallo,

    ich befasse mich schon seit Tagen mit dem gleichen Problem und hab auch bei google.de etc. nichts passendes gefunden:

    Aus Scripten heraus versenden wir Mails immer über eine Funktion, die direkt "sendmail" anspricht. Mit "text/plain"-Mails ist das auch kein Problem. Jetzt kommt allerdings hinzu, dass eine PDF-Datei als Anhang mit verschickt werden soll.

    Folgende Funktion habe ich schon "zusammengeschustert":

    function sendmail ($empfaenger, $subject, $str, $rechnr) {

    $fp = popen('/usr/sbin/sendmail -f "xxx@xxx.de" "'.$empfaenger.'"',"w");

    if(!$fp) {

    return false;
            }
            else
            {
                $file = ("rechnungen/".$rechnr.".pdf");
                $fo = fopen ($file, "rb");
                $data = fread($fo,filesize($file));
                fclose($fo);

    fputs ($fp, "From: xxx@xxx.de\n");
                fputs ($fp, "To: ".$empfaenger."\n");
                fputs ($fp, "Subject: Testmail\n");
                fputs ($fp, "MIME-Version: 1.0\n");
                fputs ($fp, "Content-Type: MULTIPART/MIXED; BOUNDARY=8323328-2120168431-824156555=:325\n");
                fputs ($fp, "--8323328-2120168431-824156555=:325\n");
                fputs ($fp, "Content-Type: application/octet-stream; name="".$rechnr.".pdf"\n");
                fputs ($fp, "Content-Transfer-Encoding: BASE64");
                fputs ($fp, "Content-Description:\n");
                fputs ($fp, $data);
                fputs ($fp, "--8323328-2120168431-824156555=:325--\n");
                fputs ($fp, "Content-Type: text/plain; charset=US-ASCII\n\n");

    hier fängt der Mailbody an

    fputs ($fp, "der normale mailtext\n";
                fputs ($fp, "--8323328-2120168431-824156555=:325\n");
                pclose($fp);

    return true;
            }
        }

    Da sehe ich einen wwesentlichen Fehler und vermute weitere:

    1.
    Du versuchst das Attachment im Mailheader zu versenden. Das wird Sendmail nicht gerne sehen und die eMail einfach verwerfen. Andere Systeme würden wahrscheinlich sogar abstürzen... (hab ich jedenfalls schon erlebt)

    Das Attachment heisst "Anhang", weil es NACH der normalen email steht.
    Bau Dir eine eMail mit Attachment  mit einem Mailclient Deines Vertrauens und schau Dir an, wie der das macht.

    2.
    $data (base64-codiert) muss umgebrochen werden. Tut mir leid, wenn ich immer vergesse, nach wievielen Zeichen. Ich nehme immer 76 + \n. Das klappt immer. Dazu gibt es die Funktion chunk_split(), die aber per default das falsche Zeilenendezeichen (\r\n) benutzt. Du musst (\n) benutzten.

    Der Standardtext (plain) muss auch umgebrochen werden. Zeilen dürfen 1000 Zeichen nicht überschreiten und es ist auch ein Gebot der Höflichkeit, nach ca 70-80 Zeichen mittels wordwrap() umzubrechen.

    Probier das erstmal aus. Dann klappts auch mit sendmail...

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Danke. Da bastel ich das doch gleich mal dahingehend um. Das könnte ja tatsächlich zum Erfolg führen, liest sich jedenfalls recht schlüssig. Warum das Attachement im header steht, verwundert mich _jetzt_ allerdings auch. Wohl treudoof Cut-Copy-Paste gemacht :)

      Da sehe ich einen wwesentlichen Fehler und vermute weitere:

      [...]