Функция отправки письма php
(PHP 4, PHP 5, PHP 7, PHP 8)
mail — Отправляет электронную почту
Описание
Отправляет электронную почту.
Список параметров
Получатель, или получатели письма.
Тема отправляемого письма.
Тема должна соответствовать » RFC 2047.
Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.
Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.
Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.
Если передан массив, то его ключи будут именами заголовка, а значения значениями.
До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.
Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Возвращаемые значения
Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Список изменений
| Версия | Описание |
|---|---|
| 7.2.0 | Параметр additional_headers может принимать значения типа массив. |
Примеры
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
Пример #3 Отправка письма с дополнительными заголовками, переданными массивом
В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).
Пример #4 Отправка письма с дополнительными аргументами командной строки.
Пример #5 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
// несколько получателей
$to = ‘johny@example.com, sally@example.com’ ; // обратите внимание на запятую
// тема письма
$subject = ‘Birthday Reminders for August’ ;
// текст письма
$message = ‘
Birthday Reminders for August
mail — Отправляет электронную почту
Описание
Отправляет электронную почту.
Список параметров
Получатель, или получатели письма.
Тема отправляемого письма.
Тема должна соответствовать » RFC 2047.
Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.
Строка, которая будет дополнительно вставлена в конец отправляемых заголовков письма.
Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.
Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): «sendmail_from» not set in php.ini or custom «From:» header missing. Заголовок From также определяет заголовок Return-Path в Windows.
Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.
Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Возвращаемые значения
Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Список изменений
Примеры
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
Пример #3 Отправка письма с дополнительными аргументами командной строки.
Параметр additional_parameters может быть использован для передачи дополнительных параметров программе, используемой для отправки писем с помощью директивы sendmail_path.
Пример #4 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
// тема письма
$subject = ‘Birthday Reminders for August’ ;
// текст письма
$message = ‘
Birthday Reminders for August
Отправка e-mail в PHP
Обычно я пишу вступление о том, почему данная тема так важна для изучения. Но не в этот раз, потому что здесь, уверен, ни у одного человека не возникнет вопрос: «Зачем отправлять e-mail в PHP?». Поэтому предлагаю сразу приступить к делу и узнать об этом более подробно, тем более, что проще реализации отправки e-mail через PHP и придумать нельзя, так что поймут даже те, кто не знаком с PHP вообще.
Для начала давайте с Вами разберёмся немного с теорией. Скучно, но поверьте важно. Для отправки e-mail необходим SMTP-сервер. На большинстве платных хостингах он обязательно имеется. Однако, если такой возможности нет (допустим, хостинг бесплатный или очень дешёвый), то тогда можно воспользоваться сторонним SMTP-сервером (например, mail.ru). То есть главное: для отправки необходим SMTP-сервер.
Как видите, всё интуитивно понятно: кому отправлять, какая тема и само сообщение. Если Вы используете пакет Denwer, то после запуска скрипта, Вы сможете найти файл в директории «tmp/!sendmail«, в котором и содержатся данные Вашего письма. Открыть эти файлы можно либо в блокноте, но лучше открыть их в какой-нибудь почтовой программе (например, The Bat или Microsoft Outlook).
Я не даром написал вперемешку русский и английский текст, чтобы проверить кодировку. Очень часто она распознаётся неправильно, и в результате, пользователи видят «абракадабру«. Чтобы этого избежать необходимо задать кодировку. И как раз для кодировки, а также для других особых параметров и существует четвёртый аргумент функции mail():
Также сообщения можно отправлять в HTML-формате. Для этого достаточно всего лишь заменить «text/plain» на «text/html«. И Вы сможете в сообщении использовать HTML-теги. Только не забывайте, что всякие теги, наподобие: «
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 20 ):
А как сделать автоматическое сообщение вот такие сообщения например это «вместо_этого_текста_приклепленный_фаил Вот файл который вы заказали с вместо_этого_текста_название_сайта. Если вы не заказывали данный файл просто игнорируйте это сообщение.» или «вместо_этого_текста_имя_пользователя на ваш комментарий ответили!»?
Для этого надо делать шаблон письма, например, такой: «%user% на Ваш комментарий ответили». Затем через PHP перед отправкой надо заменить с помощью функции str_replace %user% на конкретное имя пользователя.
Спасибо, но вопрос был как сделать письмо чтобы автоматический приходило всем зарегистрированным, или каким-то особенным пользователям, или вообще просто любым.
Это надо сделать в цикле. Если же пользователей много, то здесь всё гораздо сложнее, так как сервер может не выдержать. Для отправки письма большому количеству пользователей нужно запускать скрипт много раз, каждый раз отправляя небольшие партии. Например, при первом запуске отправить 20 писем. При втором ещё 20, при третьем ещё 20 и так далее, пока не будут отправлены все письма. Интервал надо делать хотя бы 30 секунд.
Да, письмо дойдёт до всех трёх ящиков. Однако, минус данного способа: каждый из получателей увидит адреса других получателей. Сделать уведомление автоматическим элементарно. Например, при добавлении нового сообщения на форум, надо вызвать функцию mail(). Тогда сразу же придёт уведомление.
Спасибо, а как сделать каждый из получателей не видел адрес других получателей? Или можете сказать как Вы делали такие уведомления?
Надо через цикл (например, for) по очереди вызывать функцию mail, каждый раз отправляя одному получателю.
Михаил, очень нужна ваша помощь. на моём тестовом хостинге не работает функция «mail», но там можно через сторонний SMTP сервер. Расскажите как им пользоваться,и как его настроить. Прошу расскажите мне или напишите статью. Оооочень надо
Проверьте можно ли на хостинге прямо указать сторонний SMTP, чтобы функция mail на него отправляла. Либо поищите скрипты, которые будут сами отправлять почту в обход стандартной функции.
извините за нелепый вопрос: а как на этот скрипт попадает пользователь? ведь РНР «сидит» и работает на сервере. и можно ли каким то образом РНР-скрипты вставлять в HTML страницы.
Пользователь к нему обращается, отправляя запрос. В HTML-страницах нельзя использовать PHP, но в PHP-коде можно использовать HTML.
Как грамотно отправлять почту из скриптов (в частности — на PHP)
Первая часть текста взята из инструкции хостинг-провайдера Netangels. Вторая — авторская.
Отправка почты из скриптов на PHP — вещь, которая очень часто встречается в веб-приложениях. К сожалению, как показывает практика, большинство разработчиков используют эту функцию неправильно, допуская в своих скриптах одни и те же ошибки. В результате оказывается, что письмо получателю пришло в неверной кодировке, просто не дошло, или дошло, но отображается совсем не так, как этого хотел автор.
Для того, чтобы быть уверенным, что ваше сообщение отправляется действительно верно, необходимо иметь по меньшей мере базовые представления о формате почтового сообщения. Формат почтового сообщения описан в нескольких стандартизирующих документах, основными из которых являются RFC 822 (описывает формат передачи простого текста на английском языке) и RFC 2045 и далее (описывает расширения этого формата для передачи произвольных данных).
Формат почтового сообщения
Ниже приведен самый простой пример текстового сообщения, составленного в соответствии с приведенными выше стандартами и готового к отправке.
To: =?windows-1251?b?0J/QvtC70YPRh9Cw0YLQtdC70Yw/PQ==?=
Subject: =?windows-1251?b?0Y3RgtC+INGC0LXQvNCwINGB0L7QvtCx0YnQtdC90LjRjz89?=
Content-Type: text/plain; charset=«windows-1251»
Content-Transfer-Encoding: 8bit
Это почтовое сообщение на русском языке
Содержит несколько строк
Именно в таком формате клиент для отправки почты (MS Outlook или Mozilla Thunderbird) подготавливает сообщение, а затем отправляет его получателю (кстати, большинство почтовых клиентов позволяют просмотреть исходный код сообщения, в Mozilla Thunderbird, например, для этого служит комбинация клавиш Ctrl+U). Задача нашего скрипта языке PHP — добиться точно такого же формата письма.
Как видно из приведенного выше примера, электронное письмо содержит две части: в одной (верхней) размещаются заголовки, а в другой (нижней) собствено текст письма. Отделены эти части друг от друга пустой строкой. Заголовки состоят из строк, в которых содержится тема письма (Subject), имя и адрес отправителя (From), получателя (To) и другая информация. В самом простом случае каждая строка содержит пару «ИмяЗаголовка: ЗначениеЗаголовка». Особенно необходимо подчеркнуть, что, согласно стандартам, в заголовках ни при каких обстоятельствах не должны содержаться символы, не присутствующие в ASCII таблице — латинские буквы, цифры, знаки пунктуации и псевдографики.
Грамотное использование русских символов в заголовках почтового сообщения
=? кодировка? способ кодирования? закодированный текст?=
Кодировка может быть любой из списка «windows-1251», «koi8-r», «utf-8» и т.д. Во всех случаях, как правило, кодировка сообщения будет совпадать с кодировкой в которой работает сайт. То есть в большинстве случаев это будет «windows-1251», реже — «utf-8».
Способ кодирования указывает на то, каким именно образом русские символы будут преобразованы в безопасный набор. Способа определяется два: так называемый «Q-encoding» (обозначается одной буквой «Q») и «Base64» (обозначается одной буквой «B»).
К сожалению, штатной функции, которая бы могла бы обычную строку преобразовать в Q-encoded текст, в PHP нет, зато есть функция, которая умеет выполнять аналогичное преобразование в Base64. Итак, PHP код правильного создания заголовка темы почтового сообщения может выглядеть следующим образом:
Content-type: multipart/.
С этим заголовком знаком любой разработчик, которому доводилось решать проблемы отправки писем с вложениями или HTML письмами. И зачастую письма, сформированные без использования библиотек вроде PEAR::Mail_mime отображаются не очень корректно. Практика показывает, что если при формировании письма жестко придерживаться стандарта, которы задается в RFC (в частности — RFC 2046) — подавляющее большинство клиентских программ (включая таких любителей придерживаться стандартов, как Mozilla Thunderbird) отображает письмо корректно. Далее мы будем исходить из того, что читатель этого документа представляет себе основной синтаксис команд и понимает, что таке boundary и почему необходимо указывать Content-type для каждой из частей письма. Постараемся отметить основные ошибки.
Ошибка первая — неверный subtype
Ошибка вторая — неверный порядок частей
Ошибка третья — выбор только одного субтипа
Зачастую разработчик, формирующий из программы письмо забывает, что любая из частей письма может так же иметь Content-type: multipart, а значит можно выстроить некоторое подобие древовидной структуры, гарантирующей, что каждая из частей письма займет правильное место. Вот как примерно может выглядеть структура письма, имеющего текстовую и HTML версию (HTML с картинками), а так же приложенный документ MS Word:
Отправка Email с PHP Mail и PHPMailer: Полное Руководство
Электронная почта — неотъемлемая часть любого проекта или бизнеса. Хотя существует множество платформ для корпоративной почты, включая Hostinger, Zoho Mail и G Suite, вы также можете отправлять письма с помощью PHP. В этом руководстве мы расскажем, как работает отправка email с PHP mail() — встроенной функции, PHPMailer и простым протоколом передачи почты (SMTP).
Функция PHP mail()
Функция PHP mail() вызывает программу Sendmail, обычно настраиваемую системным администратором, которая и позволяет отправлять электронные письма.
Чтобы использовать эту функцию, убедитесь, что ваш хостинг-провайдер позволяет вам вручную управлять службой Sendmail.
Возникли проблемы с отправкой писем? Hostinger предусмотрена функция PHP mail().
Служба Sendmail должна быть включена по умолчанию. Однако рекомендуем перепроверить это в вашей панели управления хостингом.
Создание Тестового Файла PHP Mail
Прежде всего, вам необходимо создать файл для PHP-скрипта и поместить его в каталог public_html, чтобы к нему можно было легко получить доступ через доменное имя.
Компоненты PHP mail
Как мы и обещали, сейчас мы более подробно рассмотрим компоненты PHP-скрипта для отправки сообщений. В примере ниже вы увидите базовый синтаксис email, который поможет лучше понять эту функцию.
Однако, если вам нужна дополнительная информация о функции Sendmail и её компонентах, вы можете обратиться к официальной документации PHP.
Вот синтаксис PHP, который мы использовали в предыдущем разделе:
Теперь давайте рассмотрим каждую его часть отдельно.
Эти первые две строки охватывают отчёты об ошибках. Они сообщат вам, если скрипт не удалось выполнить.
Эта строка должна содержать адрес электронной почты отправителя. Большинство хостинг-провайдеров не разрешают использовать случайные адреса, так как это может быть использовано с целью спуфинга (англ.) — подделки писем. Всегда указывайте адреса, созданные для вашего доменного имени или бренда, тогда отправка email c PHP mail должна быть успешной.
Здесь вы вводите адрес электронной почты получателя.
Здесь мы вводим тему письма.
Здесь мы вводим текст сообщения.
Указывает важную информацию, такую как адрес отправителя.
Эта строка используется при выполнении функции. Оставьте её без изменений.
Сообщение, которое появится в случае успешного выполнения скрипта.
Отправка Писем с PHPMailer
PHPMailer — популярная библиотека отправки почты для PHP. Она поддерживает отправку писем, как через функцию mail(), так и через простой протокол передачи почты (SMTP). Библиотека значительно упрощает сложный процесс отправки писем с помощью PHP, предоставляя набор готовых функций для создания и отправки почты.
Установить PHPMailer довольно просто, особенно если у вас установлен Composer. Если вы используете Hostinger, вам не нужно об этом беспокоиться, поскольку он по умолчанию включен в каждый пакет хостинга.
Однако, если вам нужно установить PHPMailer вручную, тогда подключите свою учётную запись хостинга через терминал SSH. Следуй этой инструкции:
ПРИМЕЧАНИЕ: PuTTY НЕ показывает пароли. Не волнуйтесь, если вы не увидите ваш пароль на экране.
Использование PHPMailer с SMTP Hostinger
Теперь, когда PHPMailer готов к работе, вы можете начать использовать его для отправки почты средствами PHP и через Hostinger SMTP.
ПРИМЕЧАНИЕ. Для того чтобы отправить письмо через PHPMailer, вам нужно знать имя пользователя учётной записи электронной почты, пароль к учётной записи, хост SMTP и порт SMTP.
Компоненты PHPMailer
Чтобы понять, как работает PHPMailer, давайте разберём приведённый выше пример скрипта, который использует SMTP для отправки электронной почты. Вот подробное объяснение каждого компонента:
Эта строка импортирует класс PHPMailer в глобальное пространство имён.
Включает различные библиотеки, необходимые PHPMailer.
Все похожие переменные содержат важную информацию, такую как сведения о сервере, заголовки сообщений, вложения и многое другое. Короче говоря, они гарантируют, что отправитель защищён аутентификацией SMTP.
Определяет, что происходит при выполнении скриптов.
В случае сбоя отправки скрипта отобразится сообщение об ошибке с пояснением.
Определяет, что произойдёт, если скрипт будет выполнен.
Если письмо успешно отправлено, появится это сообщение.
СОВЕТ: строка SMTPDebug = 2; полезна лишь в том случае, если вы тестируете скрипт и хотите увидеть, как он работает. Измените её на SMTPDebug = 0; если вы закончили тест. Таким образом, конечный пользователь не увидит отчёт по SMTP.
Если вы обратили внимание, то, наверняка, заметили, что в этом примере мы делаем что-то немного по-другому. Вместо обычного текста, мы отправляем HTML-сообщение.
Следовательно, содержимое вашего сообщения будет загружаться из файла message.html, расположенного в том же каталоге — public_html.
Этот формат обеспечивает больше функциональности по сравнению с обычными текстовыми сообщениями. HTML предлагает много опций для настройки. Например, вы можете изменить цвет, стиль, изображение или даже включить мультимедийные файлы, которые обычно устаревают в обычном текстовом сообщении.
Контактная Форма PHPMailer
Возможности PHPMailer не ограничиваются только отправкой PHP-почты. Ещё один вариант его применения — создание контактной формы, с помощью которой ваша аудитория сможет с вами связаться.
Вот пример скрипта:
Делаем всё то же самое, что и с предыдущими скриптами. Вам нужно создать новый файл в папке public_html. В данном случае мы назвали файл formscript.php. Отредактируйте информацию внутри скрипта соответствующим образом. После этого вам нужно только запустить скрипт из вашего браузера.
Вот как выглядит результат:

СОВЕТ: если контактная форма PHPMailer не работает, добавьте строку $mail->SMTPDebug = 2;, чтобы узнать, что вызывает проблему. Не забудьте удалить эту строку или поменять 2 на 0, когда закончите.
Устранение Распространённых Ошибок PHP Mail и PHPMailer
Отправка Email с PHP или PHPMailer время от времени может сопровождаться ошибками. Вот список наиболее распространённых проблем и способы их решения.
Адрес Отправителя Отклонён: Не Принадлежит Пользователю
Эта ошибка означает, что серверу не удалось пройти аутентификацию с использованием предоставленных данных.
Чтобы исправить это, проверьте адрес электронной почты, который вы использовали для отправки сообщения, и убедитесь, что он соответствует существующему ящику электронной почты. Если он указывает не на тот почтовый ящик, измените его соответствующим образом. Также убедитесь, что вы включили SPF-запись (англ).
Системе Gmail не Удалось Подтвердить, что Это Письмо Отправлено из Домена VashDomen.com
Если вы увидели это предупреждение при тестировании почтового скрипта PHP, это может означать одно из следующих:
Сообщения Попадают в Спам
Есть несколько причин, по которым сообщения PHP могут попадать в спам. Вот некоторые из самых распространённых:
Заключение
Теперь вы знаете, как происходит отправка email с PHP, а также, как использовать PHPMailer для отправки писем с аутентификацией SMTP. Не смотря на то, что в этом руководстве представлены базовые примеры, тот же синтаксис можно использовать в разработке контактной формы и других расширений для вашего сайта.
Для более подробной информации не забудьте посетить страницу проекта PHPMailer. Если у вас есть какие-либо советы, рекомендации или идеи, мы будем рады услышать их в разделе комментариев ниже.
Елена имеет профессиональное техническое образование в области информационных технологий и опыт программирования на разных языках под разные платформы и системы. Более 10 лет посвятила сфере веб, работая с разными CMS, такими как: Drupal, Joomla, Magento и конечно же наиболее популярной в наши дни системой управления контентом – WordPress. Её статьи всегда технически выверены и точны, будь то обзор для WordPress или инструкции по настройке вашего VPS сервера.



