Robert Ionescu: Mail: PDF als Anhang versenden

Hallo!
PHP soll eine e-mail generieren und an diese ein PDF anhängen, das zuvor auf der Festplatte gespeichert wurde (permanent). Hier das Script:

$anhang_content_type = "application/pdf";
$from_email="xy";
$datei=mssql_result($b->res,0,"document");
$datei = "C:\Programme\Apache Group\Apache\htdocs\ecommerce\" . $datei;
$dateiname = mssql_result($b->res,0,"pdf_name");
$datei_content = fread(fopen($datei,"r"),filesize($datei));
$datei_content = chunk_split(base64_encode($datei_content),72);
//$datei = chunk_split(base64_encode(fread(fopen($datei, "r"), filesize($datei))));
$boundary = strtoupper(md5(uniqid(time())));
$mail_header = "From: ".$from_email."\r\n"."Reply-To:".$from_email;
$mail_header .= "\nMIME-Version: 1.0";
$mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
$mail_header .= "\n\nThis is a multi-part message in MIME format";
$mail_header .= "\n--$boundary";
$mail_header .= "\nContent-Type: text/plain";
$mail_header .= "\nContent-Transfer-Encoding: 8bit";

$subject = "xy";
 $message = "texttexttext";
    $to = "me";

$mail_header .= "\n\n$message";
$mail_header .= "\n--$boundary";
$mail_header .= "\nContent-Type: $anhang_content_type; name="$dateiname"";
//$mail_header .= "\nContent-Transfer-Encoding: ".$anhang_content_type;
$mail_header .= "\nContent-Transfer-Encoding: base64";
$mail_header .= "\nContent-Disposition: attachment; filename="$dateiname"";
$mail_header .= "\n\n$datei_content";
$mail_header .= "\n--$boundary--";

$send = mail($to,$subject,"",$mail_header);

-----------
Inhalt der Datenbankresults:
$datei=C:\dd\eew\Apache\bg\ddd\eee\eee\FreieGestaltung_2003_07_08__09_28_08.pdf
$dateiname = FreieGestaltung_2003_07_08__09_28_08.pdf

Server: W2K, Apache

Das Versenden der e-mail funktioniert soweit, sobald aber $mail_header .= "\n\n$datei_content"; nicht auskommentiert ist, kommt immer ein HTTP 500-Internal Server Error. In der error.log steht dann immer
Premature end of script headers: [Pfad zu php.exe].

Zu Testzwecken habe ich einmal die base64-Codierung einer anderen (bereits empfangenen) mail eingefügt. Sobald die generierte Mail größer als 4KB (Anhang dann 1,92KB) ist, kommt der HTTP 500-Error.

Hat jemand eine Idee, was das seien kann?
Vielen Dank im Voraus!

Viele Grüße
Robert

  1. Hallo Robert,

    $datei_content = chunk_split(base64_encode($datei_content),72,"\n");

    Versuch mal als Zeilenendezeichen für chunk_split "\n" zu benutzten.
    Das könnte dein Problem beheben.

    Carsten

    1. Hallo Carsten,

      auch dann kommt der HTTP 500. Wenn ich mir die $datei_content außerhalb der Mail-Generierung ausgeben lasse (siehe Ausschnitt unten), ist der Zeilenumbruch zumindest da. Ich habe auch schon "\r\n" bzw. "\r" versucht...

      MyAKL0Nyb3BGaXhlZCBbMCAKMCAKNDU1IAo3OSAKXQovQ3JvcFJlY3QgWzAgCjAgCjQ1NSAK
      NzkgCl0KL1NpemUgWzQ1NSAKNzkgCl0KL0YgMTUgMCBSIAovUG9zaXRpb24gWzE0LjQ0OSAK
      MTIxLjM0MyAKMTQuNDQ5IAoxNDcuMDE4IAoxNjIuMzIzIAoxNDcuMDE4IAoxNjIuMzIzIAox
      MjEuMzQzIApdCj4+Cj4+ZW5kb2JqCjE1IDAgb2JqCjw8L1R5cGUgL0ZpbGVzcGVjIAovRiAo
      TWFjaW50b3NoIEhEOkpvYjpmZXJ0aWc6UGZlaWZmZXIgV2ViOkF1ZmJhdStMb2dvOlBBRyBM
      b2dvIDQvYy5lcHMpIAo+PmVuZG9iagoxMyAwIG9iago8PC9Qcm9jU2V0IFsvUERGIApdCi9Y
      T2JqZWN0IDw8L0ZtMSAxNiAwIFIgCj4+Ci9FeHRHU3RhdGUgPDwvR1MyIDE3IDAgUiAKPj4K
      Pj5lbmRvYmoKMTcgMCBvYmoKPDwvVHlwZSAvRXh0R1N0YXRlIAovU0EgdHJ1ZSAKL1NNIDAu
      MDIgCi9PUCBmYWxzZSAKL29wIGZhbHNlIAovT1BNIDEgCi9CRzIgL0RlZmF1bHQgCi9VQ1Iy
      IC9EZWZhdWx0IAovVFIyIC9EZWZhdWx0IAo+PmVuZG9iagoxNiAwIG9iago8PC9UeXBlIC9Y
      T2JqZWN0IAovU3VidHlwZSAvRm9ybSAKL0Zvcm1UeXBlIDEgCi9CQm94IFstMC4wOTggCi00
      LjcyNiAKMS41MzIgCjEuMzQ1IApdCi9SZXNvdXJjZXMgMTggMCBSIAovTWF0cml4IFsxIAow
      IAowIAoxIAowIAowIApdCi9MZW5ndGggMTU1OQovRmlsdGVyIC9GbGF0ZURlY29kZSAKL09Q
      SSAxOSAwIFIgCj4+c3RyZWFtCkiJrFfJjiRFDP2C+oc8jzQ14djjyhyQkEAa9YED4kJBD0sN
      0tAHfp/we44lu/qIWqr2y3R4t8P59SLHH8flvbu6eEj/0V9J6Xgv11Db8c9veNdqfxxEji+X

      1. Hallo Robert,

        ich habe das gerade als Funktion gebaut und da gab es auch Probleme mit den Zeilenumbrüchen bei base64. Ich habe dann dafür gesorgt, dass aller 76 Zeichen einen Zeilen umbuch mit "\n" und nicht mit "\r\n" eingefügt wurde und dass vor jeder Boundary auch eine Leerzeile stand. Dann hat es funktioniert.

        Außerdem soll man die Boundaries in Häkchen angeben, aber das bei Anderen hier auch keine Probleme ohne gemacht.

        Probier also nochmal, eine Leerzeile vor jeder Boundary einzufügen und nimm für base64-Umbrüche die Werte 76 und "\n". Damit funxt es bei mir. Allerdings auf einem Linux-Host. Wenn man in MSO-Express-Mails reinschaut, sind die aber auch so aufgebaut.

        Grüße

        Chris (C)

        1. Hallo Chris,

          auch das hatte keinen Erfolg. Es muss irgendwas mit der Mailgröße sein.
          Wenn ich von einer vorhandenen e-mail aus dem Quelltext den bereits codierten Anhang kopiere und dann in die mail schreiben möchte, schläft auch dies fehl. Wenn ich dann den eingefügten codierten Anhang auf eine bestimmte Anzahl von Zeilen kürze, wird die e-mail gesendet. Übersteigt der codierte Anhang eine Zeilenzahl, kommt der HTTP 500.

          Wenn ich meine anzuhängende Datei codiere und dann in den Mailtext schreiben möchte, schlägt auch dies fehl. Per echo kann ich mir aber die Codierung ausgeben lassen.

          Da die Datei nicht übertragen wird, spielt die max_post_size aus der PHP-Konfiguration ja keine Rolle, steht aber auch auf 10MB.

          Entweder liegt das an dem Windowssystem oder der Mailgröße. Komisch finde ich auch, dass ein HTTP 500 mit "Premature end of script headers: [Pfad zu php.exe]" kommt und keine PHP-Praser-Meldung.

          Grüße
          Robert