PHP Mail
Функция mail() в PHP используется для отправки электронных писем прямо из скрипта без дополнительных библиотек.
Встроенная функция mail() в PHP отправляет электронную почту прямо из скрипта — без дополнительных библиотек. Это самый быстрый способ отправить уведомление, сообщение из формы «Связаться с нами» или ссылку для сброса пароля. В этой главе объясняется сигнатура функции, приводятся примеры для обычного текста и HTML, а также рассматриваются проблемы с безопасностью и доставкой, которые часто возникают в продакшне.
Что делает функция mail()
mail() передаёт сообщение локальному агенту передачи почты (MTA) на сервере — программе (например, Sendmail, Postfix или Exim), которая фактически пересылает письма во внешний мир. PHP сам не общается с удалёнными SMTP-серверами; он только ставит сообщение в локальную очередь. Если на хосте нет работающего MTA, mail() возвращает false и ничего не отправляется.
Функция возвращает boolean: true, если сообщение было принято к доставке (это не то же самое, что доставлено), и false при ошибке.
Синтаксис
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool| Параметр | Обязательный | Описание |
|---|---|---|
$to | Да | Адрес(а) получателя. Для нескольких адресов используйте запятую. |
$subject | Да | Тема письма. Не должна содержать символов новой строки. |
$message | Да | Тело письма. Строки должны разделяться \r\n и не превышать 70 символов. |
$additional_headers | Нет | Дополнительные заголовки, например From, Reply-To или Content-Type. Начиная с PHP 7.2 может быть ассоциативным массивом. |
$additional_params | Нет | Дополнительные флаги командной строки для MTA (например, отправитель конверта через -f). |
Отправка письма в виде обычного текста
Это наиболее распространённый случай: простое текстовое сообщение с несколькими заголовками.
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP.';
// Additional headers
$headers = 'From: [email protected]' . "\r\n";
$headers .= 'Reply-To: [email protected]' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();
if (mail($to, $subject, $message, $headers)) {
echo 'Email sent successfully.';
} else {
echo 'Failed to send email.';
}
?>Мы задаём получателя, тему и тело письма, затем формируем строку заголовков. Заголовок From идентифицирует отправителя, Reply-To определяет, куда направляются ответы, а X-Mailer является информационным. Заголовки соединяются с помощью \r\n (возврат каретки + перевод строки) — это завершение строки, которого требует протокол электронной почты.
Отправка HTML-письма
Чтобы отправить отформатированный HTML, добавьте Content-type: text/html в заголовки. Без него получатель увидит сырые теги вместо отрендеренной разметки.
<?php
$to = '[email protected]';
$subject = 'HTML email';
$message = '
<html>
<body>
<h1>Hello!</h1>
<p>This message is <strong>formatted with HTML</strong>.</p>
</body>
</html>';
// To send HTML mail, the Content-type header must be set
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
$headers .= 'From: [email protected]' . "\r\n";
mail($to, $subject, $message, $headers);
?>Отправка нескольким получателям
Передайте список адресов через запятую в $to или используйте заголовки Cc/Bcc:
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'Meeting moved to 3 PM.';
$headers = 'From: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";
mail($to, $subject, $message, $headers);
?>Защита от инъекции заголовков
Если какая-либо часть заголовка — особенно From или Reply-To — поступает из пользовательского ввода (например, из контактной формы), злоумышленник может внедрить лишние символы новой строки, добавить собственные заголовки и превратить ваш скрипт в спам-ретранслятор. Никогда не помещайте необработанный пользовательский ввод в заголовки. Предварительно проверяйте и очищайте данные:
<?php
// $_POST['email'] comes from an untrusted form
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
exit('Invalid email address.');
}
// Strip any line breaks that could be used to inject headers
$email = str_replace(["\r", "\n"], '', $email);
$headers = 'From: ' . $email . "\r\n";
mail('[email protected]', 'Contact form', 'New message', $headers);
?>Смотрите filter_var() и главу PHP Filter для получения дополнительной информации о проверке ввода, а также PHP Form Validation для безопасной обработки данных форм.
Доставляемость и замечания для продакшна
Примечание: Функция
mail()зависит от локального MTA на сервере. Во многих современных хостинговых средах она работает без видимых ошибок, но письма попадают в спам или вообще не отправляются без надлежащей настройки. Для реальных приложений предпочтительнее использовать проверенные библиотеки, например PHPMailer или Symfony Mailer, которые поддерживают SMTP-аутентификацию, вложения, кодировку и очереди. Какой бы путь вы ни выбрали, убедитесь, что у вашего домена настроены корректные записи SPF, DKIM и DMARC, чтобы почтовые провайдеры доверяли вашим письмам.
Возврат true означает лишь, что MTA принял сообщение — это не подтверждение доставки. Для отслеживания фактической доставки, отказов и открытий используйте сервис транзакционной электронной почты.
Распространённые варианты использования
- Контактные формы — сбор сообщений и отправка их владельцу сайта (в сочетании с PHP Form Handling).
- Уведомления — подтверждения заказов, оповещения, сброс паролей.
- Отчёты — запланированные скрипты, которые отправляют сводку по электронной почте.
Заключение
Функция mail() в PHP предлагает быстрый способ отправки электронной почты из скрипта без зависимостей: укажите получателя, тему и тело письма, затем добавьте заголовки для отправителя, адреса ответа или HTML-контента. Помните об её ограничениях — она зависит от настроенного MTA, возвращает признак принятия, а не доставки, и никогда не должна получать неочищенный пользовательский ввод в заголовках. Для всего, что выходит за рамки простых и малообъёмных рассылок, используйте специализированную библиотеку. Продолжайте изучение в главах PHP Functions и PHP Strings.