Обновлено 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.

Серверsmtp.bulko.io
Порт587 · 465 · 2525
ШифрованиеSTARTTLS · SSL
Логин и парольиз кабинета

Что указать в PHPMailer

ПолеЗначение
Hostsmtp.bulko.io
SMTPAuthtrue
Usernamegetenv('SMTP_USERNAME') (вида smtp_xxxxxxxxxxxxxxxx)
Passwordgetenv('SMTP_PASSWORD')
SMTPSecurePHPMailer::ENCRYPTION_STARTTLS для 587/2525, PHPMailer::ENCRYPTION_SMTPS для 465
Port587 (или 2525 при блокировке, 465 вместе с SMTPS)
setFrom()Адрес на вашем домене, например [email protected]

Настройка по шагам

  1. Купите SMTP-пакет на странице Bulko SMTP Relay и скопируйте логин и пароль в разделе Dashboard -> SMTP Access.
  2. Установите PHPMailer командой composer require phpmailer/phpmailer и подключите vendor/autoload.php.
  3. Передайте доступы через переменные окружения SMTP_USERNAME и SMTP_PASSWORD (в настройках веб-сервера, пула PHP-FPM или через загрузчик .env вашего фреймворка) и читайте их через getenv().
  4. Создайте new PHPMailer(true), чтобы ошибки выбрасывались исключениями, вызовите isSMTP() и задайте Host, SMTPAuth = true, Username и Password.
  5. Подберите шифрование под порт. PHPMailer::ENCRYPTION_STARTTLS (строка tls) для 587 или 2525. PHPMailer::ENCRYPTION_SMTPS (строка ssl) для 465. Путаница между ними встречается в PHPMailer чаще всего.
  6. В setFrom() укажите адрес на своём домене. Для выровненных SPF, DKIM и DMARC подтвердите домен в разделе Sending Domains личного кабинета Bulko.
  7. Заполните 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 numberENCRYPTION_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 писем в сутки на один доступ.

SMTP Relay 5K: $5 · 5000SMTP Relay 20K: $15 · 20000SMTP Relay 50K: $30 · 50000SMTP Relay 150K: $60 · 150000
Тарифы SMTP-релея

Что можно отправлять: правила использования.