Отправка письма из PHP: короткое руководство для новичка
Как отправить письмо из PHP-скрипта так, чтобы оно дошло, а не упало в спам. Разбираем связку PHPMailer + SMTP: от установки до первого доставленного письма примерно за 20 минут.

К концу этого руководства ваш PHP-скрипт отправит письмо через SMTP, и оно придёт в ящик, а не в спам. Займёт минут двадцать вместе с установкой библиотеки. Работаем с PHP 8.x и PHPMailer 6.x — это самый предсказуемый способ отправить письмо из PHP в 2024 году.
Сразу оговорка: встроенная функция mail() в этом руководстве не используется как основной путь, и ниже объясню почему. Если вы уже пробовали mail() и письма не доходят — вы попали по адресу.
Что нужно иметь до начала
Проверьте эти пункты, пока не открыли редактор. Если чего-то не хватает, дальше застрянете.
- PHP 8.0 или новее. Проверьте командой
php -vв терминале. - Composer — менеджер пакетов для PHP. Проверьте
composer --version. Если нет, установите с getcomposer.org. - Доступ к SMTP-серверу. Это ключевое. Нужны хост, порт, логин и пароль. Их даёт ваша почта: у Яндекса, Gmail, Mail.ru или у почтового сервиса вроде вашего хостинга есть раздел с этими данными.
- Пароль приложения, а не пароль от ящика. Gmail и Яндекс не пустят по обычному паролю, если включена двухфакторная аутентификация. Нужно создать отдельный «пароль приложения» в настройках безопасности почты.
Расширение ext-mbstring обычно уже включено в стандартной сборке PHP — PHPMailer его использует для кодировки. Если при запуске увидите ошибку про mbstring, включите его в php.ini.
Шаг 1. Установите PHPMailer
В папке проекта выполните в терминале:
composer require phpmailer/phpmailerКак понять, что получилось: в папке появится каталог vendor и файл composer.json, а в нём — строка с phpmailer/phpmailer. В терминале не должно быть красных сообщений об ошибке.
Шаг 2. Напишите скрипт отправки
Создайте файл send.php. Вставьте код целиком — он рабочий, замените только заглушки на свои данные.
<?php
// PHP 8.x, PHPMailer 6.x
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
// Подключаем автозагрузчик Composer
require __DIR__ . '/vendor/autoload.php';
// true — включаем режим исключений, чтобы видеть ошибки
$mail = new PHPMailer(true);
try {
// Настройки SMTP-сервера
$mail->isSMTP();
$mail->Host = 'smtp.example.com'; // хост вашего SMTP
$mail->SMTPAuth = true;
$mail->Username = 'YOUR_LOGIN'; // логин, обычно полный адрес
$mail->Password = 'YOUR_APP_PASSWORD'; // пароль приложения
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // шифрование
$mail->Port = 465; // 465 для SMTPS, 587 для STARTTLS
$mail->CharSet = 'UTF-8'; // чтобы кириллица не превратилась в кракозябры
// От кого. Адрес должен совпадать с ящиком, через который шлёте
$mail->setFrom('YOUR_LOGIN', 'Магазин Пример');
// Кому
$mail->addAddress('client@example.com', 'Иван Петров');
// Содержимое
$mail->isHTML(true);
$mail->Subject = 'Ваш заказ принят';
$mail->Body = '<h1>Спасибо за заказ</h1><p>Номер: 1024</p>';
// Текстовая версия для почтовиков без HTML
$mail->AltBody = 'Спасибо за заказ. Номер: 1024';
$mail->send();
echo 'Письмо отправлено';
} catch (Exception $e) {
// ErrorInfo даёт понятное описание, а не голое исключение
echo 'Ошибка отправки: ' . $mail->ErrorInfo;
}Порт и тип шифрования зависят от почтового провайдера. Типичные варианты: порт 465 с ENCRYPTION_SMTPS или порт 587 с ENCRYPTION_STARTTLS. Точные значения смотрите в справке вашей почты — их придумывать нельзя.
Запуск и проверка
Из терминала в папке проекта:
php send.phpКак понять, что получилось: в терминале появится строка Письмо отправлено, а в ящике получателя — само письмо. Проверьте и папку «Спам»: если письмо там, отправка технически сработала, но с репутацией домена есть вопросы (об этом ниже).
Главная ошибка новичка — считать, что письмо не ушло, если оно попало в спам. Ушло. Проблема не в PHP, а в настройках домена отправителя.
Шаг 3. Уберите пароль из кода
Пароль прямо в send.php — плохо: он попадёт в git и в бэкапы. Вынесите настройки в отдельный файл, который не коммитится. Простой вариант — обычный PHP-файл с массивом:
<?php
// config.php — добавьте в .gitignore
return [
'smtp_host' => 'smtp.example.com',
'smtp_user' => 'YOUR_LOGIN',
'smtp_pass' => 'YOUR_APP_PASSWORD',
];А в send.php подключите его: $config = require __DIR__ . '/config.php'; и берите значения из массива вместо строк с паролем.
Почему не mail()
Функция mail() есть в PHP из коробки, и в туториалах она встречается чаще всего. Но у неё три беды, из-за которых письма пропадают:
| Критерий | mail() | PHPMailer + SMTP |
|---|---|---|
| Настройка | Зависит от sendmail на сервере, часто не настроен | Свои SMTP-данные, работает где угодно |
| Аутентификация | Нет — письмо шлётся «от сервера» | Логин и пароль реального ящика |
| Доставляемость | Низкая, часто уходит в спам или отбивается | Выше — письмо идёт через доверенный почтовый сервис |
| Ошибки | Возвращает только true/false без причины | Понятный текст ошибки в ErrorInfo |
Вывод простой: для реального проекта берите SMTP. mail() оставьте для одноразовых внутренних скриптов, где всё равно, дойдёт письмо или нет.
Если не получилось
Пять ошибок, которые вы реально увидите, и что с ними делать.
- SMTP connect() failed — не удалось соединиться. Проверьте хост и порт. Частая причина — хостинг блокирует исходящие соединения на порт 25/465/587. Спросите поддержку хостинга, разрешены ли исходящие SMTP.
- SMTP Error: Could not authenticate — неверный логин или пароль. Если у почты включена двухфакторка, обычный пароль не подойдёт — создайте пароль приложения в настройках безопасности.
- Кракозябры вместо кириллицы в теме или тексте — не выставлен
$mail->CharSet = 'UTF-8';или ваш файл сохранён не в UTF-8. - Class "PHPMailer\PHPMailer\PHPMailer" not found — не подключён
vendor/autoload.phpили установка через Composer не прошла. Повторите шаг 1. - Письмо уходит, но падает в спам — это не ошибка кода. Нужны SPF, DKIM и DMARC для вашего домена. Настраиваются на стороне DNS и почтового сервиса, к PHP отношения не имеют.
Что делать дальше
Отправка одного письма работает. Дальше есть три направления, каждое — отдельная тема:
- Доставляемость. Настройте SPF, DKIM и DMARC для домена — без этого крупные почтовики режут письма в спам. Проверить настройку можно бесплатными валидаторами SPF/DKIM.
- Массовая рассылка. Отправка сотен писем из веб-скрипта заблокирует HTTP-запрос и упрётся в лимиты провайдера. Здесь нужна очередь и фоновый воркер — отдельная тема, тут не разворачиваем.
- Транзакционные сервисы. Если писем много, вместо своего SMTP смотрят в сторону сервисов рассылки с готовым API и статистикой доставки.
Для начала же достаточно рабочей связки PHPMailer + SMTP, которую вы только что подняли.
Мотивационное письмо и эссе: Поступление, стипендии, гранты, обмен
Спросить за 25 ₽Источники: PHPMailer — официальный репозиторий и документация, PHP: mail — руководство по PHP
Частые вопросы
У меня PHP 7.4, а не 8.x — код сработает?
Письмо отправляется, но приходит в спам. Что делать?
Обязательно ли использовать Composer? Можно без него?
Хостинг блокирует порт 465 и 587. Как быть?
Почему нельзя просто хранить пароль прямо в send.php?
Можно ли отправить письмо с вложением?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.