Кажется, я не могу найти проблему с этой php-функцией, которую я написал, чтобы отправить электронное письмо с приложением. Я долгое время боролся с этим.
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"; }
Изменить Проблема заключается в том, что сообщение почты смешивается с файлом и отправляется как вложение.
Я просто посмотрел на пару своих писем, и я заметил, что окончательная граница прикрепления заканчивается на «-», а маркер открытия границы – нет. В вашем коде у вас есть:
--PHP-mixed-$random_hash-- Content-Type: text/plain; name=\"$filename\" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --PHP-mixed-$random_hash--
Возможно, это должно быть:
--PHP-mixed-$random_hash Content-Type: text/plain; name=\"$filename\" Content-Transfer-Encoding: base64 Content-Disposition: attachment $attachment --PHP-mixed-$random_hash--
Взгляните на пример здесь:
Artefacto заставил меня взглянуть на результат с большим вниманием, и я нашел исправление:
функция myMail ($ to, $ subject, $ mail_msg, $ filename, $ contentType, $ pathToFilename) { $ random_hash = md5 (дата ('r', time ())); $ headers = "From: webmaster@mysite.com \ r \ nReply-To:". $ to; $ headers. = "\ r \ nContent-Type: multipart / mixed; border = \" PHP-mixed - ". $ random_hash." \ ""; $ attachment = chunk_split (base64_encode (file_get_contents ($ pathToFilename))); ob_start (); эхо " --PHP-смешанно $ random_hash Content-Type: multipart / alternative; граница = \ "PHP-alt- $ random_hash \" --PHP-alt- $ random_hash Content-Type: text / plain; кодировка = \ "UTF-8 \" Content-Transfer-Encoding: 7 бит $ mail_msg --PHP-alt- $ random_hash-- --PHP-смешанно $ random_hash Content-Type: $ contentType; имя = \ "$ имя_файла \" Content-Transfer-Encoding: base64 Content-Disposition: вложение $ прикрепление --PHP-смешанно $ random_hash-- «; $ message = ob_get_clean (); $ ФХ = Еореп ( 'log.txt', 'W'); FWRITE ($ ФХ, $ сообщение); $ mail_sent = @mail ($ to, $ subject, $ message, $ headers); return $ mail_sent? «Почта отправлена»: «Не удалось отправить почту»; }
Если вы этого не сделаете, чтобы узнать о внутренней работе MIME-писем, стандартным ответом является использование библиотеки почтовых сообщений, такой как PHPMailer или Swiftmailer, которая может обрабатывать вложения из коробки.
Примеры SwiftMailer о том, как прикреплять файлы, приведены здесь .
Это заголовки, которые я использую, и они всегда работали как шарм.
$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";