问题
I can\'t seem to find the problem with this php function i wrote that should send an e-mail with attachment. I\'ve been struggling with it for quite a while.
function myMail($to, $subject, $mail_msg, $filename, $contentType){
$random_hash = md5(date(\'r\', time()));
$headers = \"From: webmaster@example.com\\r\\nReply-To: \".$to;
$headers .= \"\\r\\nContent-Type: \".$contentType.
\"; boundary=\\\"PHP-mixed-\".$random_hash.\"\\\"\";
$attachment = chunk_split(base64_encode(file_get_contents($filename)));
ob_start();
echo \"
--PHP-mixed-$random_hash
Content-Type: multipart/alternative; boundary=\\\"PHP-alt-$random_hash\\\"
--PHP-alt-$random_hash
Content-Type: text/plain; charset=\\\"utf-8\\\"
Content-Transfer-Encoding: 7bit
$mail_msg
--PHP-alt-$random_hash
--PHP-mixed-$random_hash--
Content-Type: text/plain; name=\\\"$filename\\\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment
--PHP-mixed-$random_hash--
\";
$message = ob_get_clean();
$mail_sent = @mail( $to, $subject, $message, $headers );
return $mail_sent ? \"Mail sent\" : \"Mail failed\";
}
Edit The problem is that the message of the mail is mixed with the file and send as an attachment.
回答1:
I've just looked at a couple of my emails, and I notice the the final attachment boundary ends with '--', while the opening boundary marker does not. In your code, you have:
--PHP-mixed-$random_hash--
Content-Type: text/plain; name=\"$filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment
--PHP-mixed-$random_hash--
Perhaps it should be:
--PHP-mixed-$random_hash
Content-Type: text/plain; name=\"$filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment
--PHP-mixed-$random_hash--
Have a look at the example here:
http://en.wikipedia.org/wiki/MIME#Multipart_messages
回答2:
Artefacto made me look at the output with more attention and i've found the fix:
function myMail($to, $subject, $mail_msg, $filename, $contentType, $pathToFilename){
$random_hash = md5(date('r', time()));
$headers = "From: webmaster@mysite.com\r\nReply-To: ".$to;
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
$attachment = chunk_split(base64_encode(file_get_contents($pathToFilename)));
ob_start();
echo "
--PHP-mixed-$random_hash
Content-Type: multipart/alternative; boundary=\"PHP-alt-$random_hash\"
--PHP-alt-$random_hash
Content-Type: text/plain; charset=\"utf-8\"
Content-Transfer-Encoding: 7bit
$mail_msg
--PHP-alt-$random_hash--
--PHP-mixed-$random_hash
Content-Type: $contentType; name=\"$filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment
--PHP-mixed-$random_hash--
";
$message = ob_get_clean();
$fh=fopen('log.txt','w');
fwrite($fh,$message);
$mail_sent = @mail( $to, $subject, $message, $headers );
return $mail_sent ? "Mail sent" : "Mail failed";
}
回答3:
Unless you are doing this to learn about the internal workings of MIME mails, the standard answer is to use a mailer library like PHPMailer or Swiftmailer that can deal with attachments out of the box.
SwiftMailer Examples on how to attach files are here.
回答4:
These are the headers I use and they have always worked like a charm.
$base = basename($_FILES['upload']['name']);
$file = fopen($randname_path,'rb');
$size = filesize($randname_path);
$data = fread($file,$size);
fclose($file);
$data = chunk_split(base64_encode($data));
//boundary
$div = "==Multipart_Boundary_x".md5(time())."x";
//headers
$head = "From: $from\n".
"MIME-Version: 1.0\n".
"Content-Type: multipart/mixed;\n".
" boundary=\"$div\"";
//message
$mess = "--$div\n".
"Content-Type: text/plain; charset=\"iso-8859-1\"\n".
"Content-Transfer-Encoding: 7bit\n\n".
"$message\n\n".
"--$div\n".
"Content-Type: application/octet-stream; name=\"$base\"\n".
"Content-Description: $base\n".
"Content-Disposition: attachment;\n".
" filename=\"$base\"; size=$size;\n".
"Content-Transfer-Encoding: base64\n\n".
"$data\n\n".
"--$div\n";
$return = "-f$from";
http://asdlog.com/Create_form_to_send_email_with_attachment
来源:https://stackoverflow.com/questions/3092821/php-send-e-mail-with-attachment