Обновлено 2026-10-08
Как отправлять почту через PHPMailer по SMTP
Чтобы PHPMailer отправлял почту через SMTP-релей, вызовите isSMTP() и задайте Host = smtp.bulko.io, SMTPAuth = true, Username и Password из переменных окружения, SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS и Port = 587. Для порта 465 используйте PHPMailer::ENCRYPTION_SMTPS.
Что указать в PHPMailer
| Поле | Значение |
|---|---|
| Host | smtp.bulko.io |
| SMTPAuth | true |
| Username | getenv('SMTP_USERNAME') (вида smtp_xxxxxxxxxxxxxxxx) |
| Password | getenv('SMTP_PASSWORD') |
| SMTPSecure | PHPMailer::ENCRYPTION_STARTTLS для 587/2525, PHPMailer::ENCRYPTION_SMTPS для 465 |
| Port | 587 (или 2525 при блокировке, 465 вместе с SMTPS) |
| setFrom() | Адрес на вашем домене, например [email protected] |
Настройка по шагам
- Купите SMTP-пакет на странице Bulko SMTP Relay и скопируйте логин и пароль в разделе Dashboard -> SMTP Access.
- Установите PHPMailer командой
composer require phpmailer/phpmailerи подключитеvendor/autoload.php. - Передайте доступы через переменные окружения
SMTP_USERNAMEиSMTP_PASSWORD(в настройках веб-сервера, пула PHP-FPM или через загрузчик .env вашего фреймворка) и читайте их черезgetenv(). - Создайте
new PHPMailer(true), чтобы ошибки выбрасывались исключениями, вызовитеisSMTP()и задайтеHost,SMTPAuth = true,UsernameиPassword. - Подберите шифрование под порт.
PHPMailer::ENCRYPTION_STARTTLS(строкаtls) для 587 или 2525.PHPMailer::ENCRYPTION_SMTPS(строкаssl) для 465. Путаница между ними встречается в PHPMailer чаще всего. - В
setFrom()укажите адрес на своём домене. Для выровненных SPF, DKIM и DMARC подтвердите домен в разделе Sending Domains личного кабинета Bulko. - Заполните
Subject,Body,AltBodyи вызовитеsend()внутриtry, а при ошибке выведите$mail->ErrorInfo.
На виртуальном хостинге исходящие 587 и 465 иногда закрыты. Тогда оставьте ENCRYPTION_STARTTLS и поставьте Port = 2525. Подробнее в статье о SMTP-портах.
send-test.php
<?php
// send-test.php (composer require phpmailer/phpmailer)
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require __DIR__ . '/vendor/autoload.php';
$mail = new PHPMailer(true); // true = выбрасывать исключения при ошибках
try {
// $mail->SMTPDebug = SMTP::DEBUG_SERVER; // раскомментируйте, чтобы увидеть диалог с SMTP-сервером
$mail->isSMTP();
$mail->Host = 'smtp.bulko.io';
$mail->SMTPAuth = true;
$mail->Username = getenv('SMTP_USERNAME');
$mail->Password = getenv('SMTP_PASSWORD');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // 587 или 2525
$mail->Port = 587;
// Вместо этого порт 465:
// $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
// $mail->Port = 465;
$mail->CharSet = PHPMailer::CHARSET_UTF8;
$mail->setFrom('[email protected]', 'Your App');
$mail->addAddress('[email protected]');
$mail->Subject = 'PHPMailer SMTP test';
$mail->isHTML(true);
$mail->Body = '<p>It works.</p>';
$mail->AltBody = 'It works.';
$mail->send();
echo "Message sent\n";
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}\n";
}
Проверка
Запустите из консоли SMTP_USERNAME=smtp_xxx SMTP_PASSWORD=yourpass php send-test.php, указав в addAddress() реальный адрес. Ответ Message sent значит, что релей принял письмо. Проверьте ящик через минуту-две.
Если не получилось, раскомментируйте $mail->SMTPDebug = SMTP::DEBUG_SERVER; и запустите ещё раз. В выводе будет весь диалог с сервером, и сразу видно, где проблема: подключение, TLS, авторизация (535) или содержимое (554 5.7.1). Перед продакшеном отладку выключите.
Ошибки и решения
| Проблема | Решение |
|---|---|
| SMTP Error: Could not authenticate. | Неверный логин или пароль, либо getenv() возвращает false, потому что переменные не заданы для процесса PHP. Подробнее: https://bulko.io/ru/smtp-errors/535/ |
| SMTP Error: Could not connect to SMTP host. | Порт закрыт хостингом или SMTPSecure не соответствует порту. Попробуйте Port 2525 с ENCRYPTION_STARTTLS и посмотрите отладочный вывод. |
| SSL routines: wrong version number | ENCRYPTION_SMTPS указан для порта 587. На 587 нужен ENCRYPTION_STARTTLS, либо смените Port на 465. |
| Зависание и таймаут на 465 | Для порта 465 указан ENCRYPTION_STARTTLS. Порту 465 нужен ENCRYPTION_SMTPS. |
| Class "PHPMailer\PHPMailer\PHPMailer" not found | Автозагрузчик не подключён или пакет не установлен. Выполните composer require phpmailer/phpmailer и подключите vendor/autoload.php. |
| SMTP Error: data not accepted (554 5.7.1) | Письмо отклонил ИИ-фильтр контента (фишинг, вредоносное ПО, имитация бренда, мошенничество). Правила: https://bulko.io/ru/acceptable-use/ |
Частые вопросы
Что ставить в SMTPSecure: tls или ssl?
PHPMailer::ENCRYPTION_STARTTLS (tls) для портов 587 и 2525, PHPMailer::ENCRYPTION_SMTPS (ssl) для порта 465. Константы понятнее, чем строки.
Зачем PHPMailer, если есть mail()?
mail() передаёт письмо локальному sendmail без SMTP-авторизации, поэтому такие письма часто попадают в спам или блокируются хостингом. PHPMailer авторизуется на настоящем SMTP-релее.
Можно ли читать входящую почту через этот сервер?
Нет. Bulko SMTP работает только на отправку, без IMAP и ящика. Ответы приходят на адрес From или Reply-To.
Есть ли лимит отправки?
По умолчанию 2 000 писем в сутки на один SMTP-аккаунт. Чтобы его поднять, напишите на [email protected].
Сколько это стоит?
Разовые пакеты: $5 за 5 000 писем, $15 за 20 000, $30 за 50 000, $60 за 150 000. Неиспользованные письма не сгорают, бесплатного пробного периода для SMTP нет.
Получить SMTP-доступ для PHPMailer
Разовая оплата картой или криптой, без подписки. Неиспользованные письма не сгорают. Лимит 2 000 писем в сутки на один доступ.
Что можно отправлять: правила использования.