Отправка письма с вложением на php
В этой статье я приведу пример того, как можно с помощью 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; >
Отправка письма с вложением на php: 14 комментариев
Ежу может и понятно, а мне вот нет.
Искал в поиске — форму отправки с сайта, письма с вложением.
Натолкнулся на эту страницу.
Нихрена не понятно. Как использовать, чего куда вставлять ….
Если нужен был просто рабочий код, то читатели могли бы просто взять его с 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)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;
Отправка файла по e-mail на PHP
В этой статье я собираюсь осветить тему отправки файлов по e-mail на PHP. Задача эта весьма популярная, а вот многие не знают, как это делается и научились только отправлять обычные письма без вложенных файлов. Этот пробел я постараюсь заполнить.
Я написал скрипт, который Вы смело можете копировать и использовать в своих скриптах. Данный код позволяет отправлять файлы по e-mail через PHP:
$filename = «form.txt»; //Имя файла для прикрепления
$to /cdn-cgi/l/email-protection» data-cfemail=»76171415361b171f1a580403″>[email protected]»; //Кому
$from /cdn-cgi/l/email-protection» data-cfemail=»05616063456268646c692b666a68″>[email protected]»; //От кого
$subject = «Test»; //Тема
$message = «Текстовое сообщение»; //Текст письма
$boundary = «—«; //Разделитель
/* Заголовки */
$headers = «From: $from\nReply-To: $from\n»;
$headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»»;
$body = «—$boundary\n»;
/* Присоединяем текстовое сообщение */
$body .= «Content-type: text/html; charset=’utf-8’\n»;
$body .= «Content-Transfer-Encoding: quoted-printablenn»;
$body .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode($filename).»?=\n\n»;
$body .= $message.»\n»;
$body .= «—$boundary\n»;
$file = fopen($filename, «r»); //Открываем файл
$text = fread($file, filesize($filename)); //Считываем весь файл
fclose($file); //Закрываем файл
/* Добавляем тип содержимого, кодируем текст файла и добавляем в тело письма */
$body .= «Content-Type: application/octet-stream; name==?utf-8?B?».base64_encode($filename).»?=\n»;
$body .= «Content-Transfer-Encoding: base64\n»;
$body .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode($filename).»?=\n\n»;
$body .= chunk_split(base64_encode($text)).»\n»;
$body .= «—«.$boundary .»—\n»;
mail($to, $subject, $body, $headers); //Отправляем письмо
?>
Скрипт достаточно хорошо прокомментирован, но я добавлю ещё один важный момент. Обратите внимание, что если идут вложенные файлы, то текст письма нужно тоже делать, как прикрепление к письму, однако, тип содержимого будет другой. Это весьма серьёзная особенность, если не сделать так, то текст письма отправлен не будет. Это очень частая ошибка, поэтому обратите на это особое внимание.
Данный PHP-скрипт для отправки файлов по e-mail сделан максимально коротким, он универсален, поэтому Вы можете его дорабатывать под свои нужды так, как пожелаете.
Создано 06.01.2012 16:07:44
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 20 ):
Михайл Русаков ;). Со светлым Рождеством Христовым! Я тебя очень прошу каждые исходники и добавить и покажи «Результат данного примера показан» например как у htmlbook.ru Я тебя предлагаю мое мнение это удобно видеть примеры и все будет понял. Заранее спасибо большое ;). Удачи.
У вас ошибочка! Написано «Данная код» Вы наверное имели ввиду «Данный код»
Отправка почты средствами PHP
Работая над проектом, мне пришлось создать специфичную «анкету соискателя» в котором надо была отправлять всю анкету на указные за ране e-mail адрес, и я сразу же вспомнил про PHP функцию mail().
bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])
- E-mail получателя
- Заголовок письма
- Текст письма
- Дополнительные заголовки письма
- Дополнительные параметры командной строки
- true, если письмо было принято к доставке
- false, в противном случае.
Простейший пример
Перейдем к более сложному примеру
Текст письма 1-ая строчка 2-ая строчка '; $headers = "Content-type: text/html; charset=windows-1251 \r\n"; $headers . ; $headers .= "Reply-To: reply-to@example.com\r\n"; mail($to, $subject, $message, $headers); ?>
В начале мы определяем кому адресовано письмо, за это отвечает переменная &to, если же получателей несколько человек, то записываем через запятую адреса эл. почты.
Переменные $subject и $message, не буду описывать, это и так понятно.
- В первой строчке ми определяем ты отправляемого письма-HTML и кодировку windows-1251.
- В 2-ом мы указываем от кого пришло письмо.
- В 3-ем указываем e-mail адрес, для ответа на письмо.
А теперь самое интересное отправка письма c вложением (attachment)
$subject = "тема письма"; $message ="Текст сообщения"; // текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п. $filename = "file.doc"; // название файла $filepath = "files/file.doc"; // месторасположение файла //исьмо с вложением состоит из нескольких частей, которые разделяются разделителем $boundary = "--".md5(uniqid(time())); // генерируем разделитель $mailheaders = "MIME-Version: 1.0;\r\n"; $mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; // разделитель указывается в заголовке в параметре boundary $mailheaders . ; $mailheaders .= "Reply-To: $user_email\r\n"; $multipart = "--$boundary\r\n"; $multipart .= "Content-Type: text/html; charset=windows-1251\r\n"; $multipart .= "Content-Transfer-Encoding: base64\r\n"; $multipart .= \r\n; $multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message))); // первая часть само сообщение // Закачиваем файл $fp = fopen($filepath,"r"); if (!$fp) < print "Не удается открыть файл22"; exit(); >$file = fread($fp, filesize($filepath)); fclose($fp); // чтение файла $message_part = "\r\n--$boundary\r\n"; $message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n"; $message_part .= "Content-Transfer-Encoding: base64\r\n"; $message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; $message_part .= \r\n; $message_part .= chunk_split(base64_encode($file)); $message_part .= "\r\n--$boundary--\r\n"; // второй частью прикрепляем файл, можно прикрепить два и более файла $multipart .= $message_part; mail($to,$subject,$multipart,$mailheaders); // отправляем письмо //удаляем файлы через 60 сек. if (time_nanosleep(5, 0)) < unlink($filepath); >// удаление файла