В этой статье я приведу пример того, как можно с помощью 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; }
Ежу может и понятно, а мне вот нет.
Искал в поиске — форму отправки с сайта, письма с вложением.
Натолкнулся на эту страницу.
Нихрена не понятно. Как использовать, чего куда вставлять ….
Это полностью рабочий код отправки письма с вложением, в чем проблема?
Если нужен был просто рабочий код, то читатели могли бы просто взять его с 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
ч первого разаЁ