SMTP timeout: почему сайт не может подключиться к почтовому серверу
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-хосту на нужном порту.
Комментарии (0)
Пока нет комментариев. Будьте первым!