Создание сценария PHP, который также имеет текстовый файл, включенный в качестве вложения. Он отлично работает, когда я отправляю на GMAIL-адрес, но когда я отправляю на адрес, расположенный у другого веб-хостера, я вижу, что файл прикреплен, но когда я его открываю, файл пуст (без содержимого). .Что может быть причиной этого ?? Это код, который я использую:
$filename = basename($dirfilename);
$body = "File is included in mail";
$path = "downloads/";
$file = $path.$filename;
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$eol = PHP_EOL;
// Headers
$header = "From: ".$from_name." <".$from_mail.">".$eol;
$header .= "Reply-To: ".$replyto.$eol;
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"";
// Message
$message = "--".$uid.$eol;
$message .= "Content-Type: text/html; charset=UTF-8".$eol;
$message .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
$message .= $body.$eol;
$message .= "--".$uid.$eol;
$message .= "Content-Type: text/plain; name=\"".$filename."\"".$eol;
$message .= "Content-Transfer-Encoding: base64".$eol;
$message .= "Content-Disposition: attachment;\r\n filename*=utf-8''" . rawurlencode($filename).$eol;
$message .= $content.$eol;
$message .= "--".$uid."--";
if (mail($mail_to, $subject, $message, $header))
{
echo "File sent";
} else {
echo "Fail";
}
Что ж, если вы хотите сохранить эту копировальную пасту (в ней довольно много ошибок), посмотрите на полученное сообщение MIME и сравните с RFC2822 / RFC2387 и т. д.
У вас неправильно установлены типы контента и границы. Взгляните на этот вопрос: stackoverflow.com/questions/3902455/… Хотя, как упоминалось в комментариях и в связанном вопросе, почти наверняка лучше использовать Класс PHP Mailer, это избавит вас от нескольких головных болей.






Если вы посмотрите на исходное электронное письмо:
--_004_8b72e1a6b3f242208a89b3fa9240bcf3avode_
Content-Type: application/pdf; name = "TA1_031_21204-2.pdf"
Content-Description: TA1_031_20181204-2.pdf
Content-Disposition: attachment; filename = "TA1_031_21204-2.pdf";
size=230847; creation-date = "Mon, 10 Dec 2018 11:33:32 GMT";
modification-date = "Mon, 10 Dec 2018 09:44:35 GMT"
Content-Transfer-Encoding: base64
JVBERi0xLjUNJeLjz9MNCjI4MDYgMCBvYmoNPDwvTGluZWFyaXplZCAxL0wgMjMwODQ3L08gMjgw
OC9FIDMzOTcvTiAyOC9UIDIzMDE2NS9IIFsgNDY3IDM0NF0+Pg1lbmRvYmoNICAgICAgICAgICAg
DQoyODEyIDAgb2JqDTw8L0RlY29kZVBhcm1zPDwvQ29sdW1ucyA0L1ByZWRpY3RvciAxMj4+L0Zp
bHRlci9GbGF0ZURlY29kZS9JRFs8MDU4QTRCNjk5OEFDNzE0M0JCRUZEMDFENjJCOEE5ODg+PDZG
Q0FDM0U1RTAyOTNDNDU5QzE2MkQzMTczMjM5RTYyPl0vSW5kZXhbMjgwNiAxM10vSW5mbyAyODA1
Кстати, вы пишете письмо
$message .= "Content-Disposition: attachment;\r\n filename*=utf-8''" . rawurlencode($filename).$eol;
вы добавляете ненужные символы '\ r \ n' и $ eol перед содержимым вашего файла.
Попробуйте что-нибудь вроде:
$message .= 'Content-Disposition: attachment; filename = ". rawurlencode($filename).";'.$eol.$eol;
Но это автоматически сделает PHPMailer.
Магия !! Это мне очень помогло, большое спасибо !!
mailвместо специального класса почтовой программы, такого как PHP Mailer или Swift Mailer… серьезно, не пытайтесь самостоятельно собирать подобные письма, используйте вместо этого проверенное решение.