В этой статье я приведу пример того, как можно с помощью php и функции mail() отправлять письма с прикрепленными файлами.
Чтобы было наглядней и понятней всю основную часть я вынес в функцию. Код подробно прокомментирован, поэтому что-либо писать нет смысла, просто приведу код:
// пример использования
$file = "./files/test.txt"; // файл
$mailTo = "admin@vk-book.ru"; // кому
$from = "test@files.com"; // от кого
$subject = "Test file"; // тема письма
$message = "Тестовое письмо с вложением"; // текст письма
$r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением
echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';
//$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
//echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!';
/**
* Отправка письма с вложением
* @param string $mailTo
* @param string $from
* @param string $subject
* @param string $message
* @param string|bool $file - не обязательный параметр, путь до файла
*
* @return bool - результат отправки
*/
function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){
$separator = "---"; // разделитель в письме
// Заголовки для письма
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: $from\nReply-To: $from\n"; // задаем от кого письмо
$headers .= "Content-Type: multipart/mixed; boundary=\"$separator\""; // в заголовке указываем разделитель
// если письмо с вложением
if($file){
$bodyMail = "--$separator\n"; // начало тела письма, выводим разделитель
$bodyMail .= "Content-type: text/html; charset='utf-8'\n"; // кодировка письма
$bodyMail .= "Content-Transfer-Encoding: quoted-printable"; // задаем конвертацию письма
$bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n"; // задаем название файла
$bodyMail .= $message."\n"; // добавляем текст письма
$bodyMail .= "--$separator\n";
$fileRead = fopen($file, "r"); // открываем файл
$contentFile = fread($fileRead, filesize($file)); // считываем его до конца
fclose($fileRead); // закрываем файл
$bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=\n";
$bodyMail .= "Content-Transfer-Encoding: base64\n"; // кодировка файла
$bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n";
$bodyMail .= chunk_split(base64_encode($contentFile))."\n"; // кодируем и прикрепляем файл
$bodyMail .= "--".$separator ."--\n";
// письмо без вложения
}else{
$bodyMail = $message;
}
$result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма
return $result;
}

(6 оценок, среднее: 4,33 из 5)
Ежу может и понятно, а мне вот нет.
Искал в поиске — форму отправки с сайта, письма с вложением.
Натолкнулся на эту страницу.
Нихрена не понятно. Как использовать, чего куда вставлять ….
Это полностью рабочий код отправки письма с вложением, в чем проблема?
Если нужен был просто рабочий код, то читатели могли бы просто взять его с PEAR. Вам стоило внести больше объяснения в код.
а если мне нужно отправить два файла в одном письме? что нужно добавить в этот скрипт?
Чувак хорошо все расписал, написал красиво код и все понятно комментировал.
Кто не понял, ну блин, почитайте в книге, там может понятнее.
Ошибка у тебя при таком расположении ,
Fatal error: Uncaught Error: Call to undefined function sendMailAttachment()
а если поставить в таком то работает :
function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){
$separator = «—«; // разделитель в письме
// Заголовки для письма
$headers = «MIME-Version: 1.0\r\n»;
$headers .= «From: $from\nReply-To: $from\n»; // задаем от кого письмо
$headers .= «Content-Type: multipart/mixed; boundary=\»$separator\»»; // в заголовке указываем разделитель
// если письмо с вложением
if($file){
$bodyMail = «—$separator\n»; // начало тела письма, выводим разделитель
$bodyMail .= «Content-type: text/html; charset=’utf-8’\n»; // кодировка письма
$bodyMail .= «Content-Transfer-Encoding: quoted-printable»; // задаем конвертацию письма
$bodyMail .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode(basename($file)).»?=\n\n»; // задаем название файла
$bodyMail .= $message.»\n»; // добавляем текст письма
$bodyMail .= «—$separator\n»;
$fileRead = fopen($file, «r»); // открываем файл
$contentFile = fread($fileRead, filesize($file)); // считываем его до конца
fclose($fileRead); // закрываем файл
$bodyMail .= «Content-Type: application/octet-stream; name==?utf-8?B?».base64_encode(basename($file)).»?=\n»;
$bodyMail .= «Content-Transfer-Encoding: base64\n»; // кодировка файла
$bodyMail .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode(basename($file)).»?=\n\n»;
$bodyMail .= chunk_split(base64_encode($contentFile)).»\n»; // кодируем и прикрепляем файл
$bodyMail .= «—«.$separator .»—\n»;
// письмо без вложения
}else{
$bodyMail = $message;
}
$result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма
return $result;
}
// пример использования
$file = «./files/test.txt»; // файл
$mailTo = «admin@vk-book.ru»; // кому
$from = «test@files.com»; // от кого
$subject = «Test file»; // тема письма
$message = «Тестовое письмо с вложением»; // текст письма
$r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением
echo ($r)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;
//$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
//echo ($r)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;
ток в таком порядке отправляет пустой файл с размером 0байт . как это исправить?
Почему приходит письмо не в той кодировке?
проверьте кодировку скрипта, который отправляет письмо, она должна быть UTF-8
Здравствуйте. Скрипт работает отлично, а как можно сделать отправку через SMTP?
Добрый день, вот тут в статье описана отправка письма с помощью smtp: https://vk-book.ru/otpravka-pisem-cherez-smtp-s-avtorizaciej-po-protokolu-ssl-na-php/
В конце статьи есть дополнения, и одно из них, про отправку файла
Как сделать прикрепление нескольких файлов?
Каждый файл нужно по от отдельности разбивать и кодировать. Можете посмотреть в исходниках класса для отправки писем по SMTP: https://vk-book.ru/novaya-versiya-klassa-sendmailsmtpclass-otpravka-fajlov-cherez-smtp-s-avtorizaciej-po-protokolu-ssl-na-php/ Там есть метод, который умеет прикреплять любое количество файлов.
На почту приходит пустой файл с изменённым названием. Что можно с этим сделать?
Пробовал, как сдесь предлагал автор — не получилось.
Нашёл другой вариант, сразу сработало:
https://snipp.ru/php/mail-attachment
ч первого разаЁ