Hi Folks,
ich habe ein sehr spezielle Frage zur php-Mailfunktion und hoffe, es kann jemand einen Lichtschein in mein Halbdunkel bringen.
Ich habe vor kurzem ein php-Skript geschrieben, um eine E-Mail aus den Daten eines HTML-Formulars zu generieren. Die Empfänger werden dabei aus einer CSV-Datei ausgelesen und es können über das Formular bis zu 2 Attachments angehängt werden.
Ich habe das Skript nach viel Googlen und Forensuche zusammengepatched (danke für die vielen hilfreichen Postings) und auf meine Bedürfnisse angepaßt.
Nach etlichen Test-Versuchen lief es endlich, so daß ich den Startschuß gewagt habe und eine Mail mit 2 Attachments (Word-Docs) an meine Empfängerliste gesendet habe (falls es wichtig ist: Der Provider ist Strato). Allerdings habe ich von 2 meiner Empfänger die Rückmeldung erhalten, daß die beiden Attachments nicht angehängt seien. Die Mail an mich selbst und an viele andere kam aber einwandfrei durch. Ich habe dann die Mail 'zu Fuß' nochmal an die beiden über die Strato Webmail verschickt - die Attachments kamen an.
Kann es sein, daß meine Attachments, weil von mir ungünstig eingebunden, von einem Proxy geblockt wurden? Ich hatte als File-Type im Header schlichtweg den 'octet-stream' angegeben (s.u.), reicht das für manche Mailserver als Block-Kriterium aus?
Und reicht es dann, den richtigen File-Type der Datei anzugeben?
( bspw.: $datei_type = mime_content_type($datei_name); )
Leider kann ich die Empfänger zum Testen nicht beliebig oft zuspammen, da ich sie nicht persönlich kenne. Mir bleibt also nur die theoretische Ursachenforschung.
Bin dankbar für jede Anregung.
bmarc
Hier ein Auszug aus meinem Quelltext für den Header:
// .... viel Kram ........
/* Attachment 1 */
$datei_name = $_FILES['Datei']['name'];
$datei_temp = $_FILES['Datei']['tmp_name'];
$datei_type = "application/octet-stream";
$attach_file = fopen($datei_temp,'rb');
$attach_data = fread($attach_file,filesize($datei_temp));
fclose($attach_file);
$attach_data = chunk_split(base64_encode($attach_data));
// .... noch mehr Kram dazwischen ....
/* Boundary trennt jeweils die E-Mail-Abschnitte voneinander */
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
/* Header wird geschrieben: Absender */
$mail_from = "news@blablabla.blubb";
$mail_header = "From: ".$mail_from;
/* Header wird weiter geschrieben: MIME-Version: 1.0, mehrteilige Nachricht */
$mail_header .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary="{$mime_boundary}"";
/* mail_message wird, um Angaben vorweg ergänzt, in den Header geschrieben */
$mail_header .= "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/plain; charset="iso-8859-1"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$mail_message . "\n\n";
/* Das 1. Attachment wird in den Header gesetzt */
$mail_header .= "--{$mime_boundary}\n" .
"Content-Type: {$datei_type};\n" .
" name="{$datei_name}"\n" .
"Content-Disposition: attachment;\n" .
" filename="{$datei_name}"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$attach_data . "\n\n";
/* Sofern vorhanden, wird das 2. Attachment in den Header gesetzt */
if ($varAttach2 == true) {
$mail_header .= "--{$mime_boundary}\n" .
"Content-Type: {$datei_type_opt};\n" .
" name="{$datei_name_opt}"\n" .
"Content-Disposition: attachment;\n" .
" filename="{$datei_name_opt}"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$attach_data_opt . "\n\n";
}
/* Abschluß des Headers mit '--Boundary--' */
$mail_header .= "--{$mime_boundary}--\n";
// ..... Rest-Kram, Mail wird verschickt .......