Top-office11.ru

IT и мир ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php письмо с вложением

Отправка почты средствами PHP

Работая над проектом, мне пришлось создать специфичную «анкету соискателя» в котором надо была отправлять всю анкету на указные за ране e-mail адрес, и я сразу же вспомнил про PHP функцию mail().

Обязательные параметры:

  • E-mail получателя
  • Заголовок письма
  • Текст письма

Необязательные параметры:

  • Дополнительные заголовки письма
  • Дополнительные параметры командной строки

Возвращаемое значение:

  • true, если письмо было принято к доставке
  • false, в противном случае.
Простейший пример
Перейдем к более сложному примеру

В начале мы определяем кому адресовано письмо, за это отвечает переменная &to, если же получателей несколько человек, то записываем через запятую адреса эл. почты.

Переменные $subject и $message, не буду описывать, это и так понятно.

В нашем примере переменная $headers состоит из 3-строк:

  • В первой строчке ми определяем ты отправляемого письма-HTML и кодировку windows-1251.
  • В 2-ом мы указываем от кого пришло письмо.
  • В 3-ем указываем e-mail адрес, для ответа на письмо.
А теперь самое интересное отправка письма c вложением (attachment)

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

  • Скопировать ссылку
  • Facebook
  • Twitter
  • ВКонтакте
  • Telegram
  • Pocket

Похожие публикации

  • 18 августа 2011 в 10:19

Обработка входящей почты на PHP

Замыкания в php

PHP mail под Windows

Вакансии

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Комментарии 19

Серьезно? 2019 год на дворе. Скрывайте в черновик.
Это же в документации все есть.

UPD:
С телефона не заметил. Все вопросы к RigelGL

Приглашён
21 марта 2019 в 20:01 по приглашению пользователя RigelGL

Плюс еще cp1251.

Вы бы ещё показали, как echo() пользоваться… И ладно, если бы синтаксических ошибок в тексте и в самом коде не было.

[сарказм]
Отличная и полезная статья, а главное — актуальная для 2019го.
Реквестую статью про strtr и str_replace.
[/ссрказм]

«Неправильно ты, дядя Федор, бутерброд ешь»

Функция mail дергает локальный, для сервера на котором работает PHP-скрипт, MTA — а это потенциальный источник проблем:

  • локальный MTA может отсутствовать
  • локальный MTA может давно и прочно прописаться во всех blacklist-ах какие только бывают и администратор сервера может не торопиться его оттуда вытаскивать
  • локальный MTA может упасть и администратор может забить на это на денек другой
  • локальный MTA может вызывать у получателей серьезные сомнения относительно того, не СПАМ ли это
  • mail, как написано в документации, норовит открывать и закрывать соединение с MTA при каждом вызове, что негативно сказывается на производительности

Мораль — используйте полноценный почтовый сервер и обращайтесь к нему через SMTP (для удобства есть соответствующие библиотеки, например PHPMailer)

Локальный MTA вполне можно настроить, чтобы он пересылал письма через другой сторонний сервер. Если отправка писем идёт прямо во время генерации страницы на севере, то локальный MTA правильнее. Меньше шансов получить тормоза из-за сетевых проблем на удаленном почтовом сервере.

Машина времени, однако (без обид). Но вы (автор) как то запоздали на пару лет.

Попробую сделать эту статью полезной для Хабросообщества, вот вам Code Review данного куска кода:

1. Двойные кавычки и лишние переменные
Все строки, которые не содержат управляющие символы nr или подстановки переменных, рекомендуется использовать одинарные кавычки. И лучше вынести в константы то, что не меняется в процессе выполнения кода.

2. Расположение и название файла
Тут есть ряд комментариев:

  • Путь до файла лучше указывать с использованием магической переменной __DIR__
  • Также лучше работать с абсолютным путем, использую функцию realpath()
  • Переменную $filename не нужно задавать, можно получить ее из сформированного пути функцией basename($filepath)

3. Комментарии снизу
Комментарии в коде обычно оставляют либо на той же строке, если это //, либо над строкой, которую планируете прокомментировать.

4. Формирование многострочной переменной
Для улучшения читаемости кода, лучше не конкатинировать много строк, а использовать HEREDOC или NOWDOC:

5. Нет корректной обработки ошибокЕсли хоть одна функция поведет себя не так, как ожидается, то весь кусок кода непредсказуемо отработает.
Не информативная ошибка, тем более с какими-то непонятными цифрами 22. Рекомендуется выводить более доступный текст ошибки. Например «При чтении файла <$filepath>возникла ошибка.»

6. Чтение файлаЕсли понадобилось читать файл, но не обязательно использовать потоки, можно вытащить контент тем же самым file_get_contents.

7. Нет кавычекНе уверен, что этот код вообще отработает.

8. Удаление файла
Если это файл, который будет запускаться из cli, то еще может быть ок, но тоже не ясно зачем. А если этот скрипт будет запускаться через вебсервер, то скорее всего он отвалится по timeout.

9. Код оформлен не по PSR

P.S. Если что-то пропустил, то дополняйте, коллеги!

Это очень забавный комментарий. В стиле, я не знаю, «Вы тут представили телегу без лошади как средство передвижения. Чтобы сделать её более полезной для общества, вот мои замечания: колеса лучше перекрасить в чуть более розовый цвет, борта лучше сделать не из дерева, а из картона потому что красивше и вот еще на узорчиках лучше листики заменить на цветочки.»

Читать еще:  Как записывать формулы в html

Все эти замечания не делают код полезнее. Чтобы сделать его полезнее, его надо переписать, целиком. С использованием современных инструментов. О чем и говорили все предыдущие комментаторы.

Все что написано вверху — это мелкие придирки, половина из которых — это вкусовщина про цветочки. Какие кавычки использовать и применять ли хередок — это исключительно на вкус автора.

При этом построчная конкатенация является стандартом при составлении заголовков, поскольку упрощает отладку, позволяя произвольно комментировать отдельные заголовки. Плюс такой формат гарантирует использование строго определенных символов перевода строки, а не тех, что настроены в редакторе по умолчанию.

Корректная обработка ошибок не имеет ничего общего с добавлением проверок на каждый чих. И уж тем более с выплевыванием сообщений об ошибке прямо в браузер. Пользователю сайта нет ни малейшего интереса читать про файлы на сервере. Такого рода сообщения должны писаться в лог. И РНР с этим великолепно справляется сам, помогать ему не требуется.

Без обид, но чтобы сделать нормальный code review, надо сначала научиться кодить самому. Пока у вас получилось не code review, а cosmetic review. Ваш обзор не делает код лучше, он делает его чуть красивше и более подходящим под ваши субъективные вкусы.

Это очень забавный комментарий. В стиле, я не знаю, «Вы тут представили комментарии по телеге без лошади, которую представили как средство передвижения. И ваши комментарии по цвету колес и бортам из картона не делают из этой телеги средство передвижения. Да и узорчики из цветочков не всем подходят и это вкусовщина. Вместо добавления своих замечаний, я представлюсь Д’Артаньяном на белом коне и налью желчи. „

Все эти замечания не делают код полезнее.

Никто и не говорил, что код от моих замечаний станет полезнее. Это замечания, которые нужны для того, чтобы прочитавший в своих проектах так не писал.

При этом построчная конкатенация является стандартом при составлении заголовков, поскольку упрощает отладку, позволяя произвольно комментировать отдельные заголовки. Плюс такой формат гарантирует использование строго определенных символов перевода строки, а не тех, что настроены в редакторе по умолчанию.

Код нужно писать не так, чтобы программисту было удобно что-то закомментировать в процессе написания, а чтобы потом было проще прочитать и понять.

Без обид, но чтобы сделать нормальный code review, надо сначала научиться кодить самому. Пока у вас получилось не code review, а cosmetic review. Ваш обзор не делает код лучше, он делает его чуть красивее и более подходящим под ваши субъективные вкусы.

Отправка письма с вложением на php

В этой статье я приведу пример того, как можно с помощью php и функции mail() отправлять письма с прикрепленными файлами.
Чтобы было наглядней и понятней всю основную часть я вынес в функцию. Код подробно прокомментирован, поэтому что-либо писать нет смысла, просто приведу код:

Отправка письма с вложением на 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.0rn»;
$headers .= «From: $fromnReply-To: $fromn»; // задаем от кого письмо
$headers .= «Content-Type: multipart/mixed; boundary=»$separator»»; // в заголовке указываем разделитель
// если письмо с вложением
if($file) <
$bodyMail = «—$separatorn»; // начало тела письма, выводим разделитель
$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)).»?=nn»; // задаем название файла
$bodyMail .= $message.»n»; // добавляем текст письма
$bodyMail .= «—$separatorn»;
$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: base64n»; // кодировка файла
$bodyMail .= «Content-Disposition: attachment; filename==?utf-8?B?».base64_encode(basename($file)).»?=nn»;
$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)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;

Читать еще:  Вертикальный список css

ток в таком порядке отправляет пустой файл с размером 0байт . как это исправить?

Отправка файла по e-mail на PHP

В этой статье я собираюсь осветить тему отправки файлов по e-mail на PHP. Задача эта весьма популярная, а вот многие не знают, как это делается и научились только отправлять обычные письма без вложенных файлов. Этот пробел я постараюсь заполнить.

Я написал скрипт, который Вы смело можете копировать и использовать в своих скриптах. Данный код позволяет отправлять файлы по e-mail через PHP:

Скрипт достаточно хорошо прокомментирован, но я добавлю ещё один важный момент. Обратите внимание, что если идут вложенные файлы, то текст письма нужно тоже делать, как прикрепление к письму, однако, тип содержимого будет другой. Это весьма серьёзная особенность, если не сделать так, то текст письма отправлен не будет. Это очень частая ошибка, поэтому обратите на это особое внимание.

Данный PHP-скрипт для отправки файлов по e-mail сделан максимально коротким, он универсален, поэтому Вы можете его дорабатывать под свои нужды так, как пожелаете.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 19 ):

    Михайл Русаков ;). Со светлым Рождеством Христовым! Я тебя очень прошу каждые исходники и добавить и покажи «Результат данного примера показан» например как у htmlbook.ru Я тебя предлагаю мое мнение это удобно видеть примеры и все будет понял. Заранее спасибо большое ;). Удачи.

    У вас ошибочка! Написано «Данная код» Вы наверное имели ввиду «Данный код»

    Михаил здравствуйте, я хочу спросить, как можно отправлять несколько файлов. Очень надо. Заранее спасибо!

    Чтобы не изобретать велосипед, можете воспользоваться готовым классом наподобие PHPMailer, который это уже умеет.

    Как-то много долбался с этой ерундой, никак не собиралась работать. У формата email довольно жёсткий стандарт и все пересылаемые файлы кодируются в текстовом виде, запутаться легко. Кстати boundary не стоит делать слишком простым, иначе если эта последовательность попадётся в сегментах сообщения, то он решит, что это очередной разрыв и порвёт письмо.

    Михаил! Сделайте пожалуйста форму html для представленного здесь php обработчика, чтобы его можно было использовать или адаптировать под свои нужды. Такой код без примера html использовать могут только более менее знающие програмисты, а для начинающего разобраться без наглядного примера сложновато..

    Вот форма и скрипт, они должны быть в разных файлах, в action нужно вставить имя файла со скриптом, если он будет не в одной директории с формой то прописать полный путь. Форма: А это немного переделанный скрипт, так как форма уже была и я подогнал по неё скрипт и дописал вывод сообщения при отправке или ошибке.

    А если нужно присоединить сообщение к оправке данных с полей формы, но только после действия (нажатия определённой кнопки) на другой странице сайта? И только после присоединения сообщения отправить. Как это прописать в скрипте? Я в программировании совсем ничего не понимаю.

    Михаил, спасибо за скрипт. Давно уже мучает такой вопрос, и не только меня наверное. Почему с сайта письма попадают в спам на gmail или бывает совсем не приходят? На все остальные почтовые сервисы письма приходят нормально.

    И ещё проблема. Ваш скрипт хорошо работает, но текст присылается со знаками вопросами ))) в ромбиках чёрных Что посоветуете?

    Как именно? Кодировка UTF-8 стоит, сам файл тоже в ней.

    Здравствуйте, Не могу понять где универсальность скрипта. Почему прописано имя файла «form.txt» и соответственно на почту приходит файл с этим именем. Как сохранить оригинальное имя файла (то что было на момент отправики)? Вопрос 2: почему приходит файл нулевого размера?

    Здравствуйте Михаил! Подскажите пожалуйста как прописать, что бы отправка имела такой вот вид http://rghost.ru/7bRSxGzVb/image.png При выборе отправляло данный файл! Спасибо!

    Добрій вечер. Мучает один вопрос. Почему когда приходит сообщение на єлектронную почту, то оно отображается как файл «noname.txt»? Как можно сделать, чтобы отображалось как текст или как изменить «noname» на другое назнавание? Спасибо

    Читать еще:  Css new line

    Ищу как мне сделать скрипт на товарный одностраничник с апселлом. У вас самое толковое объяснение, как отправлять сообщения на почту. Но мне нужно: 1. Отправляем на ЛОГИН@yandex.ru 2. Считываем данные с полей формы Имя и Телефон 3. При нажатии кнопки «Отправить» на форме, перебрасывает на дополнительную страничку upsell.php. НО ПРИ ЭТОМ ДАННЫЕ С ПОЛЕЙ ФОРМЫ НЕ ОТПРАВЛЯЮТСЯ НА Е-МЭЙЛ, А СОХРАНЯЮТСЯ-ОЖИДАЮТ КОМАНДЫ ОТПРАВКИ. 4. На странице с апселлом есть 2 кнопки (нет никакой формы): а) если покупатель жмёт кнопку «Добавить в посылку», то вступает в дело функция отправки сообщения mail с собранными данными с полей формы и добавляется название дополнительного товара. Это всё выражается в конечном итоге в виде сообщения на е-мэйл Имя: Телефон: Название дополнительного товара. б) если покупатель жмёт кнопку «Отказаться», то вступает в дело функция отправки сообщения mail с собранными данными с полей формы, но уже без добавления дополнительного товара. Это всё выражается в конечном итоге в виде сообщения на е-мэйл Имя: Телефон:

    Здравствуйте,Михаил.Не могли бы Вы подсказать как можно организовать следующее.Мне нужно что бы человек,на моем сайте,выбрав нужный видеофайл смог бы сразу послать его на указанный им E-mail без скачивания файла на свой компютер.Файлы не большого размера 2-6мб.Буду рад любым подсказкам.

    Код содержит множество ошибок: Неправильный перенос строки, неверный разделитель, отсутствие кодирования письма. http://prntscr.com/jgwp7m

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    mail() c вложениями

    Привет,
    вопрос достаточно бональный КАК ОТПРАВИТЬ mail() c текстовым файлом?

    В интернете в том числе и на этом форуме нашла большое кол-во примеров отправки (одна из функций ниже), но есть ряд вопросов:
    Зачем нужен ограничитель строк ?
    Зачем считывать файл в бинарном режиме?
    Либо не понимаю комент «любая строка, которой не будет ниже в потоке данных»?

    Кто отпрвлял mail c вложениями-поделитесь опытом, ссылками или просто более подробный комент к этому коду, чтобы понять что делаю и почему.

    p.s.
    С функцией mail() без вложений работала.

    29.11.2010, 19:27

    Отправка писем с вложениями
    Добрый день. На сайте в коде есть функция, которая отправляет письма с вложениями (файл xls и файл.

    Письмо с вложениями
    Всем привет, есть вот такой код для отправки писем на почту. Сообщение отправлено .

    Отправка письма с вложениями загружаемыми на сайт
    Доброго времени суток, Форумчане. Делаю форму обратной связи на сайте, помимо обычного отправки.

    Проблемы в кодировках при отправке письма с вложениями
    Добрый день! При отправке письма с вложением вместо нормальных русских букв в тексте приходит типа.

    29.11.2010, 19:402

    Обработчик simple_mail.php HTML-формы index.php может выглядеть следующим образом

    подробно и с коментами.

    HTML5
    29.11.2010, 21:50 [ТС]3

    Nazz,
    Вопросы остаются открытыми
    Зачем нужен ограничитель строк ?
    Зачем считывать файл в бинарном режиме?
    Либо не понимаю комент «любая строка, которой не будет ниже в потоке данных»?

    Код функции send_mail() Я видела и совпадает с приведённым мной. только ответа на свои вопросы в коментариях к этому коду Я не нашла.

    01.12.2010, 14:03 [ТС]4

    Хочу поделиться информацией которую мне удалось найти. Может пригодиться кому-н в будущем.

    Сообщение в почтовом сервере выглядит так:
    From:yourmail@yourdomen.xxx

    To:mymail@mydomen.xxx
    Subject:Пример
    MIME-Version: 1.0
    Content-Type:multipart/mixed; boundary=»unique-boundary»
    То что здесь будет игнорироваться почтовой программой
    —unique-boundary
    Content-Type:text/html; charset=windows-1251

    текст с гипертекстовой разметкой

    —unique-boundary
    Content-Type:image/jpeg; name=»file.jpg»
    Content-Transfer-Encoding:base64
    Кодированное в base64 графическое изображение
    —unique-boundary—
    То что здесь будет игнорироваться почтовой программой

    И функцией send_mail() строим сообщение подобного вида. Оттуда и беруться разделители тк в письме (в данном случае 3 части) 1-header c информацией о том как другие 2 части соотносятся друг с другом. (Content-Type:multipart/mixed).

    Тип multipart имеет три субтипа — mixed, alternative и related, которые используются синтаксически одинаково, но имеют разное предназначение

    mixed — используется, когда в рамках одного почтового сообщения имеется несколько независимых друг от друга, и равнозначных частей. Самый простой пример такого письма — сообщение с вложением.
    alternative — используется, когда в одном почтовом сообщении содержится несколько частей, содержащих одну и ту же информацию, предназначенную для отображения на различном клиентском ПО — например текстовая и HTML версия одного и того же письма.
    related — используется, когда в одном почтовом сообщении содержится несколько частей, формирующих один итоговый документ. Яркий пример — HTML письмо с картинками. Запомните, по стандарту только в этом случае должны работать ссылки на Contend-id элементов (вида ).

    Во 2 части письма — текст с гипертекст. разметкой (Content-Type: text/html; charset=$kodn)
    В 3 части — рисунок закодированный в base 64.

    Способа кодировки два, определён. стандартом название которого Я забыла:»quoted printable encoding» и «Base64 encoding».

    Пока всё. Продолжаю ковырять в этом напрвлении.

    Ссылка на основную публикацию
    Adblock
    detector