Kwert-soft.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

Вопросы и ответы

Не работает цикл php?

Не удаляются данные при повторном выполнении функции?

Как брать данные с другого сайта и добавлять на свой?

Вывод тестов по конкретному > PHP Простой 1 ответ

Что у меня в функции?

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.

Читать еще:  Обработка get запроса php

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отправка файла по 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 Я тебя предлагаю мое мнение это удобно видеть примеры и все будет понял. Заранее спасибо большое ;). Удачи.

    Читать еще:  Php оператор or

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

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

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

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

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

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

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

    Михаил, спасибо за скрипт. Давно уже мучает такой вопрос, и не только меня наверное. Почему с сайта письма попадают в спам на 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

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

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

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

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

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

    Ежу может и понятно, а мне вот нет.
    Искал в поиске — форму отправки с сайта, письма с вложением.
    Натолкнулся на эту страницу.
    Нихрена не понятно. Как использовать, чего куда вставлять ….

    Читать еще:  Загрузка картинок php

    Это полностью рабочий код отправки письма с вложением, в чем проблема?

    Если нужен был просто рабочий код, то читатели могли бы просто взять его с 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)?’Письмо отправлено’:’Ошибка. Письмо не отправлено!’;

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

    Отправлять вложения с помощью PHP Mail ()?

    Мне нужно отправить PDF с почтой, это возможно?

    Что мне не хватает?

    Решение

    Я согласен с @MihaiIorga в комментариях — используйте скрипт PHPMailer. Похоже, вы отвергаете это, потому что вы хотите более простой вариант. Поверь мне, PHPMailer является более простой вариант с очень большим отрывом по сравнению с попыткой сделать это самостоятельно с помощью встроенного в PHP mail() функция. РНР mail() функция действительно не очень хорошая.

    Чтобы использовать PHPMailer:

    • Загрузите скрипт PHPMailer здесь: http://github.com/PHPMailer/PHPMailer
    • Распакуйте архив и скопируйте папку скрипта в удобное место вашего проекта.
    • Включить основной файл скрипта — require_once(‘path/to/file/class.phpmailer.php’);

    Теперь отправка электронных писем с вложениями превращается из невероятно сложной в невероятно простую:

    Это просто одна строка $email->AddAttachment(); — Вы не могли бы попросить немного проще.

    Если вы делаете это с PHP mail() функция, вы будете писать стеки кода, и вам, вероятно, будет очень сложно найти ошибки.

    Другие решения

    Вы можете попробовать использовать следующий код:

    Изменить 14 июня 2018 года

    для большей читабельности в некоторых почтовых провайдеров
    использование

    $body .= $eol . $message . $eol . $eol; а также
    $body .= $eol . $content . $eol . $eol;

    Для PHP 5.5.27 обновление безопасности

    Swiftmailer еще один простой в использовании скрипт, который автоматически защищает от впрыск электронной почты и делает приложения на одном дыхании. Я также настоятельно не рекомендую использовать встроенный PHP mail() функция.

    • Скачать Swiftmailer , и поместите lib папка в вашем проекте
    • Включить основной файл, используя require_once ‘lib/swift_required.php’;

    Теперь добавьте код, когда вам нужно на почту:

    Более подробную информацию и варианты можно найти в Документы Swiftmailer .

    Чтобы отправить электронное письмо с вложением, нам нужно использовать MIME-тип multipart / mixed, который указывает, что смешанные типы будут включены в электронное письмо. Кроме того, мы хотим использовать многочастный / альтернативный тип MIME для отправки как электронной, так и текстовой версии электронной почты. Посмотрите на пример:

    Как видите, отправка электронного письма с вложением очень проста. В предыдущем примере мы имеем составной / смешанный тип MIME, а внутри него мы имеем составной / альтернативный тип MIME, который определяет две версии письма. Чтобы включить вложение в наше сообщение, мы читаем данные из указанного файла в строку, кодируем их с помощью base64, разделяем их на более мелкие фрагменты, чтобы убедиться, что они соответствуют спецификациям MIME, а затем включаем их в качестве вложения.

    После некоторой борьбы с плохо отформатированными вложениями я использовал следующий код:

    Это работает для меня. Он также прикрепляет несколько вложений тоже. без труда

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