Mein Problem:
ich habe für den Mitgliederbereich einer Website ein Mailformular erstellt, mit dem man Dateianhänge verschicken können soll;
das funktioniert auch soweit wie beabsichtigt, nur die Anhänge sind, wenn sie im Postfach landen, beschädigt.
Die Fehler im Attachment sind auch nicht wahllos verteilt:
Der erste Teil des Anhangs (etwa die ersten 650 Bytes) werden korrekt angezeigt, der Rest ist unlesbar...
Dieses Problem tritt unabhängig vom Typ der Datei auf.
Ich habe schon einiges an Zeit in diversen Foren nach Fehlerquellen gesucht, kann somit manches an möglichen Ursachen ausschließen...
Da der Fehler aber meist im Detail liegt und ich PHP schließlich nicht mit der Muttermilch aufgesogen habe, hier mein Quelltext:
PHP-Code:
extract($_POST); // Formulardaten...
$eol = "\r\n"; // PHP_OS ist WIN
$boundary = md5(uniqid(time()));
$body_footer = "\n\n\n";
$body_footer .= "Mailformular auf Name_meiner_Site.\n";
$body_footer .= "".date("d.m.Y, H:i")." Uhr";
$headers = "From: ".$from_name." <".$from_email.">".$eol;
$headers .= "To: ".$to_name." <".$to_email.">".$eol;
if(!empty($cc_email)) {$headers .= "Cc: ".$cc_name." <".$cc_email.">".$eol;}
if(!empty($bcc_email)) {$headers .= "Bcc: ".$bcc_name." <".$bcc_email.">".$eol;}
$headers .= "Subject: ".$subject.$eol;
$headers .= "Date: ".date("r").$eol;
$headers .= "Message-ID: <".md5(uniqid($from_name.$to_name))."@DNS-Name_des_SMTP-Servers>".$eol;
$headers .= "Reply-To: ".$from_name." <".$from_email.">".$eol;
$headers .= "Return-Path: ".$from_name." <".$from_email.">".$eol;
$headers .= "X-Sender: ".$from_name." <".$from_email.">".$eol;
$headers .= "X-Mailer: PHP v".phpversion().$eol;
if(!empty($attachment)) {
$headers .= "X-Attachments: \"".$_FILES["attachment"]["name"]."\"".$eol;
}
$headers .= "MIME-Version: 1.0".$eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"".$eol;
$message = "";
if(!empty($attachment)) {
$message .= "--".$boundary.$eol;
$message .= "Content-Type: ".$_FILES["attachment"]["type"]."; name=\"".$_FILES["attachment"]["name"]."\"".$eol;
$message .= "Content-Transfer-Encoding: base64".$eol;
$message .= "Content-Disposition: attachment; filename=\"".$_FILES["attachment"]["name"]."\"".$eol.$eol;
$message .= encode_attachment($_FILES["attachment"]["tmp_name"]).$eol.$eol;
}
$message .= "--".$boundary.$eol;
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"".$eol;
$message .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$message .= "".stripslashes($body)."";
$message .= "".$body_footer.$eol.$eol;
$message .= "--".$boundary."--".$eol.$eol;
$mail = mail("".$to_email."", "".$subject."", "".$message."", "".$headers."");
if($mail == "true") {
echo "Deine E-Mail wurde erfolgreich versandt.\n";
} else {
echo "Beim Versenden Deiner E-Mail trat ein Problem auf.\n";
}
...und der Code zum Enkodieren des Anhangs:
PHP-Code:
function encode_attachment($att) {
$fp = fopen($att, "rb");
$data = fread($fp, filesize($att));
fclose($fp);
$data = chunk_split(base64_encode($data));
return $data;
}
Und noch ein paar Bytes aus der Dummy-Datei, wie sie aussah, nachdem sie als Attachment verschickt wurde:
- die ersten 623 Bytes korrekterweise:
Lorem ipsum dolor sit amet, consectetuer adipis...
- danach:
XÙ[˜\ÈXØÝ[\Ø[ˆ[H™XÈYÝ[KˆÜ™[H\Ý[HÛ܈Ú][Y]ÛÛœÙXÝ...
für Hinweise jetzt schon mal vielen Dank!
P.S.:
Ja klar, natürlich könnte ich Klassen wie HTML Mime Mail oder PHPMailer benutzen...
Aber ich code eben aus Spaß; und ein Problem, an dem ich so lange hänge, weckt eben meinen Ehrgeiz...