W3docs

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().

Практика

Практика
Что верно относительно функции PHP mail() согласно содержимому по указанному URL?
Что верно относительно функции PHP mail() согласно содержимому по указанному URL?
Was this page helpful?