mail()
Функция mail() в PHP используется для отправки электронных писем непосредственно из PHP-скрипта.
Функция mail() отправляет электронные письма непосредственно из PHP-скрипта. Это простейший встроенный способ отправки почты. В этом руководстве рассматриваются синтаксис и параметры функции, принципы работы заголовков, отправка HTML-писем и сообщений нескольким получателям, угрозы безопасности, которых следует избегать, а также случаи, когда стоит использовать специализированные библиотеки.
Что такое функция mail()?
Функция mail() — это встроенная функция PHP, которая передаёт электронное письмо системному агенту передачи почты (MTA) — как правило, sendmail в Linux — или SMTP-серверу, настроенному в php.ini. Поскольку она зависит от локальной конфигурации, mail() нередко возвращает false (или молча не доставляет письмо) на машине разработчика, где не установлен MTA. Функция не открывает SMTP-соединение самостоятельно, поэтому она не может проходить аутентификацию у внешнего провайдера, например Gmail.
Возвращаемое значение true означает лишь то, что сообщение было принято MTA к доставке — это не гарантия того, что письмо попадёт во входящие получателя.
Синтаксис
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool| Параметр | Обязателен | Описание |
|---|---|---|
$to | Да | Адрес(а) получателя. Несколько адресов разделяются запятой, например "[email protected], [email protected]". |
$subject | Да | Тема письма. Не должна содержать символы новой строки. |
$message | Да | Тело письма. Строки должны разделяться \r\n и не превышать 70 символов. |
$additional_headers | Нет | Дополнительные заголовки, такие как From, Cc, Bcc, Content-Type. Строка (разделённая CRLF) или, начиная с PHP 7.2, ассоциативный массив. |
$additional_params | Нет | Дополнительные флаги для командной строки MTA (например, -f для установки адреса отправителя в конверте). |
Как использовать функцию mail()
Ниже приведён полный пример с простым текстом, в котором формируются заголовки и проверяется возвращаемое значение:
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP';
// Additional headers
$headers = 'From: [email protected]' . "\r\n"
. 'Reply-To: [email protected]' . "\r\n"
. 'X-Mailer: PHP/' . phpversion();
// Send the email and check the result
if (mail($to, $subject, $message, $headers)) {
echo "Email sent successfully.";
} else {
echo "Email delivery failed.";
}
?>Мы задаём получателя, тему и текст письма, затем формируем заголовки. Поскольку mail() возвращает булево значение, рекомендуется проверять результат, а не предполагать успех. Заголовок From важен: без него многие почтовые серверы отклоняют сообщение или помечают его как спам.
Отправка HTML-письма
Для отправки HTML вместо обычного текста добавьте Content-Type: text/html в заголовки. Без него почтовый клиент отобразит теги как обычный текст.
<?php
$to = '[email protected]';
$subject = 'HTML email test';
$message = '<h1>Hello</h1><p>This message is <b>HTML</b>.</p>';
$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);
?>Несколько получателей, Cc и Bcc
Укажите несколько адресов в $to (через запятую) для видимой строки «Кому», а для копий используйте заголовки Cc/Bcc:
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'See attached agenda.';
$headers = "From: [email protected]\r\n";
$headers .= "Cc: [email protected]\r\n";
$headers .= "Bcc: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Получатели в Bcc скрыты от всех остальных, тогда как адреса в Cc видны всем получателям.
Безопасность: предотвращение инъекций заголовков
Если какая-либо часть адреса получателя, темы или заголовков поступает из пользовательского ввода — например из контактной формы — злоумышленник может внедрить лишние символы новой строки, добавить свои заголовки Cc/Bcc и использовать ваш сервер для рассылки спама. Всегда проверяйте адреса и удаляйте переносы строк перед передачей в mail():
<?php
$email = $_POST['email'] ?? '';
// Reject anything that is not a valid email address
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('Invalid email address.');
}
// Strip CR/LF so the value can't inject new headers
$email = str_replace(["\r", "\n"], '', $email);
?>Используйте filter_var() с FILTER_VALIDATE_EMAIL для проверки; смотрите также Валидация форм в PHP и Обработка URL/E-mail в формах для получения безопасных паттернов обработки форм.
Ограничения и когда использовать библиотеку
mail() подходит для простых сообщений с небольшим объёмом, однако имеет реальные ограничения:
- Функция не может проходить аутентификацию у внешнего SMTP-сервера (нет имени пользователя/пароля, TLS-рукопожатия).
- Нет встроенной поддержки вложений — MIME-части придётся формировать вручную.
- Минимальное информирование об ошибках: возвращаемое значение
falseне объясняет, почему доставка не удалась.
Для продакшена, транзакционной почты или писем с вложениями используйте специализированную библиотеку, например PHPMailer или Symfony Mailer. Они обеспечивают SMTP-аутентификацию, кодирование, поддержку вложений и значительно более подробное сообщение об ошибках.
Заключение
Функция mail() предоставляет быстрый способ отправки электронной почты непосредственно из PHP и хорошо подходит для простых уведомлений при наличии работающего MTA. Помните, что её успешная работа зависит от конфигурации сервера, что при использовании пользовательских данных необходима защита от инъекций заголовков, а для продакшен-систем, как правило, лучше подходят PHPMailer или Symfony Mailer. Для дальнейшего изучения ознакомьтесь с разделом Функции PHP и функцией header().