SMTP timeout обычно означает, что сайт не смог дождаться ответа от почтового сервера. Пользователь при этом видит зависшую форму, ошибку отправки или обычное сообщение “попробуйте позже”. Причина может быть в неверном порте, firewall, DNS, SSL, блокировке исходящих соединений или неправильном SMTP-хосте.
Диагностику лучше начинать не с переписывания формы, а с проверки сетевого подключения с того же сервера, где работает сайт.
Проверить настройки mailer
Сначала нужно открыть конфиг mailer и проверить host, port, encryption, username и useFileTransport.
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.example.ru',
'username' => 'no-reply@example.ru',
'password' => 'password',
'port' => 465,
'encryption' => 'ssl',
],
],
Для порта 465 обычно используется ssl. Для 587 чаще tls. Если перепутать порт и тип шифрования, подключение может зависать или завершаться ошибкой.
Проверить доступность порта
Проверять нужно с сервера сайта, а не с локального компьютера. Именно сервер сайта должен подключаться к SMTP.
nc -vz smtp.example.ru 465
nc -vz smtp.example.ru 587
Если nc нет, можно использовать telnet или openssl.
openssl s_client -connect smtp.example.ru:465
Для 587 с STARTTLS:
openssl s_client -starttls smtp -connect smtp.example.ru:587
Блокировка исходящей почты
Некоторые хостинги и серверные провайдеры блокируют исходящие SMTP-порты, особенно 25. Иногда блокируются и внешние SMTP-подключения, пока их не разрешить в панели или через поддержку.
Если с сервера нет подключения к SMTP, а с локального компьютера есть, это сильный признак сетевого ограничения на стороне хостинга или firewall.
sudo iptables -L
sudo ufw status
На shared-хостинге таких команд может не быть. Тогда остаётся проверка через панель и обращение к провайдеру.
DNS и имя SMTP-сервера
Иногда в конфиге указан неправильный SMTP host. Например, mail.example.ru не существует или указывает не туда. Проверка простая:
dig smtp.example.ru
dig mail.example.ru
Если почта обслуживается внешним сервисом, SMTP-хост нужно брать из его документации или панели, а не угадывать по домену.
Timeout в коде
У транспорта можно задать timeout, чтобы форма не висела слишком долго. Это не исправляет причину, но делает поведение сайта более управляемым.
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.example.ru',
'username' => 'no-reply@example.ru',
'password' => 'password',
'port' => 587,
'encryption' => 'tls',
'timeout' => 10,
],
Если отправка писем влияет на скорость формы, лучше выносить письма в очередь. Тогда пользователь не ждёт SMTP в момент отправки заявки.
Логи отправки
В Yii2 стоит логировать ошибку mailer, но не пароль и не полный набор персональных данных.
try {
$sent = Yii::$app->mailer
->compose()
->setFrom(['no-reply@example.ru' => 'Site'])
->setTo('manager@example.ru')
->setSubject('Тест SMTP')
->setTextBody('Проверка')
->send();
Yii::info(['sent' => $sent], 'mail');
} catch (\Throwable $e) {
Yii::error($e->getMessage(), 'mail');
}
По тексту ошибки часто видно, что именно произошло: connection timed out, connection refused, certificate verify failed, authentication failed.
SSL-сертификат
Если соединение устанавливается, но падает на SSL, нужно проверить цепочку сертификатов SMTP-сервера и правильность host. Ошибка сертификата может появиться, если подключаться не к тому имени, на которое выдан сертификат.
openssl s_client -connect smtp.example.ru:465 -servername smtp.example.ru
Чек-лист диагностики
- Проверить host, port и encryption в конфиге.
- Убедиться, что useFileTransport выключен.
- Проверить nc или openssl с сервера сайта.
- Проверить DNS SMTP-хоста.
- Проверить firewall и ограничения хостинга.
- Проверить SSL-соединение.
- Добавить разумный timeout.
- Посмотреть логи mailer после тестовой отправки.
SMTP timeout — это чаще инфраструктурная проблема, а не проблема текста письма. Код должен быть проверен, но главный вопрос: может ли сервер сайта вообще подключиться к нужному SMTP-хосту на нужном порту.