
PHP предоставляет несколько способов отправки электронных писем, начиная от встроенной функции mail() до использования внешних библиотек, таких как PHPMailer и SwiftMailer. Прямое использование mail() подходит для простых уведомлений, но для работы с вложениями, HTML-шаблонами и SMTP-реле рекомендуется применять специализированные библиотеки.
При отправке писем через SMTP важно указывать точные настройки сервера: адрес SMTP, порт, метод шифрования (SSL или TLS) и корректные учетные данные. Ошибки в этих параметрах чаще всего приводят к недоставке сообщений или попаданию в папку «Спам».
Использование PHPMailer позволяет формировать письма с HTML-содержимым, добавлять вложения, управлять кодировкой и получать детализированные сообщения об ошибках. Такой подход повышает надежность и прозрачность процесса отправки писем, особенно при массовой рассылке или интеграции с CRM-системами.
Далее будут представлены рабочие примеры кода, демонстрирующие как отправку простого текста с помощью mail(), так и более сложные письма через PHPMailer с HTML-разметкой и вложениями, с подробными пояснениями каждого шага.
Настройка функции mail() для отправки писем

Функция mail() в PHP требует корректной настройки почтового сервера на стороне сервера. На Linux обычно используется sendmail или postfix, а на Windows – SMTP-сервер через файл php.ini.
Для Linux убедитесь, что путь к sendmail указан верно: sendmail_path = /usr/sbin/sendmail -t -i. Параметр -t передает получателя из заголовков письма, -i предотвращает преждевременное завершение письма при встрече с точкой на новой строке.
На Windows настройка SMTP осуществляется через php.ini: SMTP = smtp.example.com, smtp_port = 25. Укажите корректный сервер, порт и при необходимости логин и пароль, если сервер требует аутентификацию. Без правильного SMTP-пути письма не будут отправляться.
При вызове mail() обязательно указывайте заголовки: From, Reply-To и Content-type. Например:
$headers = "From: info@example.com\r\nReply-To: info@example.com\r\nContent-type: text/html; charset=UTF-8\r\n";
Это гарантирует корректное отображение письма и уменьшает риск попадания в спам.
Для тестирования отправки используйте простой скрипт:
mail('user@example.com', 'Тема', 'Текст письма', $headers);
и проверяйте результат через лог сервера или функцию error_get_last() для выявления ошибок.
Если письма не уходят, проверьте: включен ли почтовый сервер, правильны ли права на sendmail, нет ли блокировки портов и корректны ли DNS-записи SPF и DKIM для домена.
Отправка HTML-письма с вложением изображений

Для отправки HTML-письма с изображениями в PHP рекомендуется использовать библиотеку PHPMailer. Она обеспечивает корректную обработку заголовков, кодировку и вложения.
Создайте объект PHPMailer и настройте SMTP-сервер:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
Для HTML-содержимого включите:
$mail->isHTML(true);
$mail->Subject = 'Тема письма';
$mail->Body = '<h1>Отчет</h1><p>Смотрите вложенные изображения.</p><img src="cid:logo_img">';
Добавление изображений как вложений с указанием CID для отображения внутри письма:
$mail->addEmbeddedImage('/path/to/logo.png', 'logo_img', 'logo.png');
$mail->addAttachment('/path/to/report.pdf', 'report.pdf');
Отправка письма выполняется командой:
if($mail->send()) {
echo 'Письмо отправлено';
} else {
echo 'Ошибка: ' . $mail->ErrorInfo;
}
При работе с изображениями важно использовать абсолютные пути и корректно задавать MIME-типы. CID-ссылки позволяют вставлять изображения прямо в тело HTML без необходимости внешних URL.
Для нескольких изображений создавайте уникальные идентификаторы для каждого и используйте их в соответствующих тегах <img>.
Добавление нескольких получателей и скрытой копии

Для отправки письма нескольким адресатам в PHP используется разделитель запятой. В функции mail() это реализуется через параметр $to:
<?php
$to = "user1@example.com, user2@example.com, user3@example.com";
$subject = "Отчет за неделю";
$message = "Здравствуйте, во вложении отчет.";
$headers = "From: sender@example.com\r\n";
mail($to, $subject, $message, $headers);
?>
Если требуется скрытая копия (BCC), добавление выполняется через заголовок Bcc:
<?php
$to = "user1@example.com";
$subject = "Отчет за неделю";
$message = "Здравствуйте, во вложении отчет.";
$headers = "From: sender@example.com\r\n";
$headers .= "Bcc: manager@example.com, auditor@example.com\r\n";
mail($to, $subject, $message, $headers);
?>
Для массовой рассылки рекомендуется ограничивать количество адресов в одном письме, чтобы избежать блокировки на стороне почтового сервера. Оптимально разделять адресатов на группы по 50–100 человек и отправлять письма партиями.
При использовании нескольких получателей и BCC важно корректно формировать заголовки: каждая строка должна заканчиваться \r\n, а From обязательно указывать реальный адрес, иначе письмо может попасть в спам.
Для динамического добавления получателей в массиве удобно применять цикл:
<?php
$recipients = ["user1@example.com", "user2@example.com"];
$bcc = ["manager@example.com", "auditor@example.com"];
$to = implode(", ", $recipients);
$headers = "From: sender@example.com\r\n";
$headers .= "Bcc: " . implode(", ", $bcc) . "\r\n";
mail($to, $subject, $message, $headers);
?>
Использование PHPMailer для отправки через SMTP
PHPMailer предоставляет надёжный способ отправки писем через SMTP-сервер с поддержкой аутентификации и шифрования. Для работы требуется подключение файла PHPMailer и настройка объекта класса PHPMailer.
Пример минимальной конфигурации для SMTP:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'securepassword';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('user@example.com', 'Имя Отправителя');
$mail->addAddress('recipient@example.com', 'Имя Получателя');
$mail->isHTML(true);
$mail->Subject = 'Тема письма';
$mail->Body = 'Содержимое письма в HTML
';
$mail->AltBody = 'Содержимое письма в текстовом формате';
$mail->send();
echo 'Письмо отправлено';
} catch (Exception $e) {
echo "Ошибка отправки: {$mail->ErrorInfo}";
}
Рекомендуется использовать порт 465 с PHPMailer::ENCRYPTION_SMTPS для прямого TLS-соединения. При работе с SMTP важно проверять:
| Параметр | Рекомендация |
|---|---|
| Host | Указывать полный домен SMTP-сервера (например, smtp.gmail.com) |
| SMTPAuth | Всегда включать для серверов, требующих авторизацию |
| Username / Password | Использовать отдельный аккаунт для отправки и хранить пароль безопасно |
| SMTPSecure | Использовать STARTTLS или SMTPS для шифрования |
| Port | 587 для STARTTLS, 465 для SMTPS |
| setFrom | Указывать email, совпадающий с учетной записью SMTP, иначе сервер может отклонить письмо |
Для отладки можно включить $mail->SMTPDebug = 2; чтобы видеть обмен сообщениями с сервером и точнее диагностировать ошибки. PHPMailer поддерживает добавление вложений через $mail->addAttachment(‘файл.pdf’); и отправку копий через $mail->addCC() и $mail->addBCC().
Обработка ошибок при неудачной отправке письма

Функция mail() возвращает true, если письмо принято системой для отправки, и false при ошибке. Для выявления причины сбоя используйте error_get_last():
$success = mail($to, $subject, $message, $headers);
if (!$success) {
$error = error_get_last();
echo "Ошибка отправки: " . $error['message'];
}
Для SMTP и более сложной логики применяются библиотеки PHPMailer и SwiftMailer, которые возвращают подробные сообщения об ошибках и поддерживают исключения:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'password';
$mail->setFrom('from@example.com');
$mail->addAddress('to@example.com');
$mail->Subject = 'Тема письма';
$mail->Body = 'Текст письма';
$mail->send();
} catch (Exception $e) {
echo "Ошибка PHPMailer: " . $mail->ErrorInfo;
}
Рекомендации по обработке ошибок:
- Всегда проверяйте результат mail() или ловите исключения в PHPMailer/SwiftMailer.
- Логируйте ошибки в файл или базу данных с точным временем и деталями SMTP-сессии.
- Проверяйте доступность SMTP-сервера и корректность учетных данных перед отправкой.
- При массовой рассылке внедряйте повторные попытки отправки и уведомления администратору при сбоях.
Эти меры позволяют точно идентифицировать сбои, корректировать конфигурацию и обеспечивать доставку писем без потерь.
Отправка писем с кодировкой UTF-8 и русскими символами

Для корректной отправки писем с русскими символами в PHP необходимо использовать кодировку UTF-8 и правильно формировать заголовки письма.
Пример минимальной отправки письма с русскими символами через функцию mail():
<?php
$to = 'example@example.com';
$subject = 'Тема письма';
$message = 'Привет! Это тестовое письмо с русскими символами.';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=UTF-8\r\n";
$headers .= "From: sender@example.com\r\n";
mail($to, $subject, $message, $headers);
?>
Рекомендации по работе с UTF-8:
- Использовать заголовок
Content-type: text/plain; charset=UTF-8илиtext/html; charset=UTF-8для HTML-писем. - Кодировать тему письма с помощью функции
mb_encode_mimeheader(), чтобы избежать проблем с кириллицей:
$subject = mb_encode_mimeheader('Тема письма', 'UTF-8');
<meta charset="UTF-8"> в начале тела письма:$message = '<html><head><meta charset="UTF-8"></head><body>Привет!</body></html>';
Пример отправки письма через PHPMailer с UTF-8 и русским текстом:
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->CharSet = 'UTF-8';
$mail->setFrom('sender@example.com', 'Отправитель');
$mail->addAddress('example@example.com');
$mail->Subject = 'Тема письма';
$mail->Body = 'Привет! Это письмо с русскими символами.';
$mail->send();
} catch (Exception $e) {
echo "Ошибка отправки: {$mail->ErrorInfo}";
}
Следование этим правилам гарантирует корректное отображение русских символов у получателя и предотвращает искажение текста при передаче.
