PHP Mail с вложением, но файл пуст

Создание сценария 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";
}
«Что может вызвать это?» - наивное использование mail вместо специального класса почтовой программы, такого как PHP Mailer или Swift Mailer… серьезно, не пытайтесь самостоятельно собирать подобные письма, используйте вместо этого проверенное решение.
misorude 10.12.2018 16:32

Что ж, если вы хотите сохранить эту копировальную пасту (в ней довольно много ошибок), посмотрите на полученное сообщение MIME и сравните с RFC2822 / RFC2387 и т. д.

mario 10.12.2018 16:41

У вас неправильно установлены типы контента и границы. Взгляните на этот вопрос: stackoverflow.com/questions/3902455/… Хотя, как упоминалось в комментариях и в связанном вопросе, почти наверняка лучше использовать Класс PHP Mailer, это избавит вас от нескольких головных болей.

markmoxx 10.12.2018 16:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
327
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы посмотрите на исходное электронное письмо:

--_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.

Магия !! Это мне очень помогло, большое спасибо !!

Andreas Persson 11.12.2018 00:50

Другие вопросы по теме