Отправка файла по e-mail на PHP
В этой статье я собираюсь осветить тему отправки файлов по e-mail на PHP. Задача эта весьма популярная, а вот многие не знают, как это делается и научились только отправлять обычные письма без вложенных файлов. Этот пробел я постараюсь заполнить.
Я написал скрипт, который Вы смело можете копировать и использовать в своих скриптах. Данный код позволяет отправлять файлы по e-mail через PHP:
<?php
$filename = "form.txt"; //Имя файла для прикрепления
$to = "[email protected]"; //Кому
$from = "[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 сделан максимально коротким, он универсален, поэтому Вы можете его дорабатывать под свои нужды так, как пожелаете.
-
- Михаил Русаков
Комментарии (20):
Михайл Русаков ;). Со светлым Рождеством Христовым! Я тебя очень прошу каждые исходники и добавить и покажи "Результат данного примера показан" например как у htmlbook.ru Я тебя предлагаю мое мнение это удобно видеть примеры и все будет понял. Заранее спасибо большое ;). Удачи.
Ответить
У вас ошибочка! Написано "Данная код" Вы наверное имели ввиду "Данный код"
Ответить
Спасибо, исправил!
Ответить
Михаил здравствуйте, я хочу спросить, как можно отправлять несколько файлов. Очень надо!!! Заранее спасибо!
Ответить
Чтобы не изобретать велосипед, можете воспользоваться готовым классом наподобие PHPMailer, который это уже умеет.
Ответить
Как-то много долбался с этой ерундой, никак не собиралась работать. У формата email довольно жёсткий стандарт и все пересылаемые файлы кодируются в текстовом виде, запутаться легко. Кстати boundary не стоит делать слишком простым, иначе если эта последовательность попадётся в сегментах сообщения, то он решит, что это очередной разрыв и порвёт письмо.
Ответить
Михаил! Сделайте пожалуйста форму html для представленного здесь php обработчика, чтобы его можно было использовать или адаптировать под свои нужды. Такой код без примера html использовать могут только более менее знающие програмисты, а для начинающего разобраться без наглядного примера сложновато..
Ответить
Вот форма и скрипт, они должны быть в разных файлах, в action нужно вставить имя файла со скриптом, если он будет не в одной директории с формой то прописать полный путь. Форма: <form mame="mail1" method="post" action="xxxxxxx"> E-mail: <input size="29" type="email" name="email" placeholder="Ваш E-mail" value="" required><br /><br /> Тема: <input type="text" size="30" name="subject" value="" required><br /><br /> Сообщение:<br /> <textarea name="message" cols="35" rows="5" maxlength="1500" placeholder="Ваше сообщение" required></textarea><br /><br /> Файл: <input type="file" name="file" value=""><br /><br /> <input type="submit" name="button" value="Оправить"> </form> А это немного переделанный скрипт, так как форма уже была и я подогнал по неё скрипт и дописал вывод сообщения при отправке или ошибке. <?php $filename = $_POST['file']; $to = 'Здесь мэйл на который будут приходить сообщения'; $from = $_POST['email']; $subject = $_POST['subject']; $message = $_POST['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"; $sending = mail($to, $subject, $body, $headers); //Отправляем письмо if($sending == 'true') { echo 'Сообщение отправлено успешно'; } else { echo 'Ошибка отправки сообщения!'; } ?>
Ответить
А если нужно присоединить сообщение к оправке данных с полей формы, но только после действия (нажатия определённой кнопки) на другой странице сайта? И только после присоединения сообщения отправить. Как это прописать в скрипте? Я в программировании совсем ничего не понимаю.
Ответить
Михаил, спасибо за скрипт. Давно уже мучает такой вопрос, и не только меня наверное. Почему с сайта письма попадают в спам на gmail или бывает совсем не приходят? На все остальные почтовые сервисы письма приходят нормально.
Ответить
И ещё проблема. Ваш скрипт хорошо работает, но текст присылается со знаками вопросами ))) в ромбиках чёрных Что посоветуете?
Ответить
Поправить кодировку.
Ответить
Как именно? Кодировка UTF-8 стоит, сам файл тоже в ней.
Ответить
Здравствуйте, Не могу понять где универсальность скрипта. Почему прописано имя файла "form.txt" и соответственно на почту приходит файл с этим именем. Как сохранить оригинальное имя файла (то что было на момент отправики)? Вопрос 2: почему приходит файл нулевого размера?
Ответить
Здравствуйте Михаил! Подскажите пожалуйста как прописать, что бы отправка имела такой вот вид http://rghost.ru/7bRSxGzVb/image.png При выборе отправляло данный файл! Спасибо!
Ответить
Добрій вечер. Мучает один вопрос. Почему когда приходит сообщение на єлектронную почту, то оно отображается как файл "noname.txt"? Как можно сделать, чтобы отображалось как текст или как изменить "noname" на другое назнавание? Спасибо
Ответить
Ищу как мне сделать скрипт на товарный одностраничник с апселлом. У вас самое толковое объяснение, как отправлять сообщения на почту. Но мне нужно: 1. Отправляем на ЛОГИН@yandex.ru 2. Считываем данные с полей формы Имя и Телефон 3. При нажатии кнопки "Отправить" на форме, перебрасывает на дополнительную страничку upsell.php. НО ПРИ ЭТОМ ДАННЫЕ С ПОЛЕЙ ФОРМЫ НЕ ОТПРАВЛЯЮТСЯ НА Е-МЭЙЛ, А СОХРАНЯЮТСЯ-ОЖИДАЮТ КОМАНДЫ ОТПРАВКИ!!! 4. На странице с апселлом есть 2 кнопки (нет никакой формы): а) если покупатель жмёт кнопку "Добавить в посылку", то вступает в дело функция отправки сообщения mail с собранными данными с полей формы и добавляется название дополнительного товара. Это всё выражается в конечном итоге в виде сообщения на е-мэйл Имя: Телефон: Название дополнительного товара. б) если покупатель жмёт кнопку "Отказаться", то вступает в дело функция отправки сообщения mail с собранными данными с полей формы, но уже без добавления дополнительного товара. Это всё выражается в конечном итоге в виде сообщения на е-мэйл Имя: Телефон:
Ответить
Здравствуйте,Михаил.Не могли бы Вы подсказать как можно организовать следующее.Мне нужно что бы человек,на моем сайте,выбрав нужный видеофайл смог бы сразу послать его на указанный им E-mail без скачивания файла на свой компютер.Файлы не большого размера 2-6мб.Буду рад любым подсказкам.
Ответить
Код содержит множество ошибок: Неправильный перенос строки, неверный разделитель, отсутствие кодирования письма. http://prntscr.com/jgwp7m
Ответить
3 строки, следующие за комментарием: /* Присоединяем текстовое сообщение */ содержат ошибки. 1. Кодировку текста нужно заключать либо в кавычки, либо вообще не заключать. Апостофы "не переваривают" некоторые почтовые серверы (например, "Mail.ru"). 2. Во 2-й строке вместо "quoted-printablenn" должно быть "quoted-printable\n\n". 3. 3-я строка вообще лишняя.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.