Ваше Laravel-приложение работает на XAMPP, но после развертывания на cPanel первое письмо для сброса пароля завершается ошибкой  Connection could not be established with host . Иногда вы получаете  535 Incorrect authentication data ,  Expected response code "250" but got code "530"  или ошибку проверки SSL-сертификата.

Если  Laravel SMTP на cPanel выдает ошибку, быстрее всего проверить почтовый сервер исходящей почты, указанный в cPanel, сопоставить SMTP-порт с правильной схемой шифрования, подтвердить учетные данные почтового ящика и очистить кэш конфигурации Laravel.

Большинство сбоев SMTP относятся к одной из пяти категорий: подключение, шифрование, аутентификация, конфигурация или доставка сообщений. Конкретная ошибка подскажет, что именно нужно исследовать.

 Быстрый ответ: Откройте  cPanel → Учетные записи электронной почты (Email Accounts) → Подключение устройств (Connect Devices), найдите хост исходящего SMTP и используйте безопасные настройки, предоставленные для вашего почтового ящика. Для типичной современной установки Laravel используйте порт  465  с  MAIL_SCHEME=smtps  или порт  587  с  MAIL_SCHEME=smtp  и STARTTLS. Используйте полный адрес почтового ящика в качестве имени пользователя, очистите кэш конфигурации и отправьте тестовое письмо через Laravel Tinker.

Не отключайте проверку SSL-сертификата ради того, чтобы SMTP заработал. Ошибка сертификата обычно означает, что для подключения требуется другое имя хоста или сертификат почтового сервера нуждается в исправлении.

1. Laravel SMTP на cPanel: определяем ошибку

Laravel использует Symfony Mailer для связи с SMTP-серверами. Это означает, что исключение может возникнуть на разных этапах соединения.

Перед тем как менять настройки  .env , прочитайте полное сообщение об ошибке.

Сообщение об ошибке Вероятная причина Что проверить
 Connection could not be established with host  Проблема с сетью, именем хоста, портом или TLS SMTP-хост, порт и файрвол хостинга
 Connection timed out  Сервер не может установить соединение Разрешение DNS, ограничения на исходящий SMTP или недоступность сервера
 Connection refused  Узел назначения отклонил TCP-соединение Неверный порт, остановленная служба SMTP или ограничения на подключение
 SSL routines: wrong version number  Несоответствие протокола TLS Ожидает ли порт неявный TLS (implicit TLS) или STARTTLS
 certificate verify failed  Проблема доверия, срока действия или имени хоста сертификата Цепочка сертификатов и имя хоста SMTP
 Peer certificate CN did not match  Имя в сертификате не совпадает с  MAIL_HOST  Используйте имя хоста, покрываемое сертификатом
 Expected response code "250" but got code "530"  Сервер требует аутентификации или другого предварительного условия Прочитайте полный ответ SMTP, включая информацию о необходимости STARTTLS
 535 Incorrect authentication data  Аутентификация отклонена Имя пользователя почтового ящика, пароль или ограничения учетной записи
 The "" scheme is not supported  Проблема совместимости со старыми версиями Laravel/Symfony Установленные версии и настройка схемы SMTP

Что на самом деле означает каждая ошибка?

 Connection timed out (Превышено время ожидания соединения)

Laravel попытался связаться с SMTP-сервером, но не завершил соединение в течение настроенного времени ожидания.

Возможные причины включают неверное имя хоста, заблокированные исходящие порты, сбои DNS или недоступность сервера.

Смена пароля почтового ящика не исправит сетевой тайм-аут.

 Connection refused (В соединении отказано)

Узел назначения активно отклонил соединение. Например, приложение все еще может использовать адрес разработки SMTP, такой как  127.0.0.1:2525 , даже если там нет запущенного SMTP-слушателя.

Проверьте разрешенную почтовую конфигурацию, а не полагайтесь на предположение, что Laravel загрузил ваш последний файл  .env .

 SSL wrong version number (Неверный номер версии SSL)

Это часто происходит, когда приложение инициирует зашифрованное TLS-соединение на порту, ожидающем обычное SMTP-приветствие, или наоборот.

Типичный пример — сочетание  MAIL_SCHEME=smtps  с портом  587 .

 530 authentication or STARTTLS required (Требуется аутентификация или STARTTLS)

Ответ  530  не всегда означает отсутствие имени пользователя.

В зависимости от SMTP-сервера это может указывать на то, что требуется аутентификация или что сначала нужно выполнить команду STARTTLS.

Прочитайте весь ответ SMTP, прежде чем решать, какую настройку изменить.

 535 authentication failed (Ошибка аутентификации)

Сервер получил попытку аутентификации, но отклонил ее.

Требуется проверить имя пользователя, пароль, политику аутентификации или статус почтового ящика.

 No exception, but no email (Исключений нет, но письма не отправляются)

Проверьте активный почтовый драйвер (mailer).

Шаблоны современных приложений Laravel используют  log  в качестве запасного почтового драйвера в  config/mail.php . Если переменная  MAIL_MAILER  отсутствует и никакая другая конфигурация не переопределяет это значение по умолчанию, сообщения могут записываться в настроенный канал логирования приложения вместо отправки.

Также проверьте, не было ли письмо поставлено в очередь вместо немедленной отправки.

2. Найдите имя хоста SMTP и настройте .env в Laravel

Не угадывайте почтовый сервер исходящей почты.

Распространенная ошибка — полагать, что  mail.example.com  обязательно должен быть правильным, поскольку домен приложения —  example.com .

Веб-сайт, DNS и почтовый ящик могут размещаться на разных серверах.

Шаг 1. Получите актуальные настройки SMTP из cPanel

  1. Войдите в cPanel.
  2. Откройте  Электронная почта → Учетные записи электронной почты (Email → Email Accounts).
  3. Найдите почтовый ящик, который будет использовать Laravel, например  noreply@example.com .
  4. Нажмите  Подключение устройств (Connect Devices).
  5. Найдите раздел  Ручные настройки почтового клиента (Mail Client Manual Settings).
  6. Посмотрите  Безопасные настройки SSL/TLS (рекомендуется) / Secure SSL/TLS Settings (Recommended).
  7. Скопируйте SMTP-сервер исходящей почты, порт и имя пользователя.

Для стандартного почтового ящика под управлением cPanel задокументированный безопасный SMTP-порт —  465 .

cPanel также указывает порт  587  в настройках для клиентов без поддержки SSL. На серверах, поддерживающих STARTTLS, порт 587 все еще может устанавливать зашифрованное соединение после первоначального приветствия SMTP. Вы должны убедиться, что ваш сервер рекламирует STARTTLS и поддерживает требуемый метод аутентификации.

Правильным именем хоста может быть ваш почтовый поддомен или собственное имя хоста хостинг-сервера.

Если ваша почта размещается на стороне (например, в Google Workspace, Microsoft 365 или Zoho), используйте настройки SMTP этого провайдера, а не предполагайте, что ваш почтовый ящик обслуживает сервер cPanel.

Шаг 2. Настройте порт 465 с использованием неявного TLS (implicit TLS)

Откройте файл  .env  вашего приложения.

Для инсталляций Laravel, у которых конфигурация SMTP читает  MAIL_SCHEME , используйте:

 MAIL_MAILER=smtp
MAIL_SCHEME=smtps
MAIL_HOST=mail.example.com
MAIL_PORT=465
MAIL_USERNAME=noreply@example.com
MAIL_PASSWORD="your-mailbox-password"
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"
 

Замените пример имени хоста, адреса и пароля данными вашего реального почтового ящика.

 Как это работает:  smtps  устанавливает TLS-зашифрованное соединение немедленно, до обмена обычными командами SMTP.

Это соответствует стандартному поведению порта  465 .

Избегайте добавления  ssl://  в параметр  MAIL_HOST . Укажите в этой настройке простое имя хоста, а шифрование оставьте на усмотрение почтового транспорта.

Шаг 3. Настройте порт 587 с использованием STARTTLS

Если ваш провайдер специально поддерживает отправку SMTP (SMTP submission) на порту  587 , используйте:

 MAIL_MAILER=smtp
MAIL_SCHEME=smtp
MAIL_HOST=mail.example.com
MAIL_PORT=587
MAIL_USERNAME=noreply@example.com
MAIL_PASSWORD="your-mailbox-password"
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"
 

При схеме  smtp  Symfony Mailer обычно повышает уровень соединения с помощью STARTTLS, когда сервер заявляет о такой возможности и доступна необходимая поддержка PHP OpenSSL.

Существует одна важная деталями безопасности, которую часто упускают из виду.

 Автоматический STARTTLS — это не то же самое, что требование обязательного использования TLS.

Если сервер не сообщает о поддержке STARTTLS, обычный SMTP-транспорт может продолжить работу без шифрования, если не настроено требование обязательного TLS.

Не передавайте учетные данные производственного почтового ящика по незашифрованному интернет-соединению. Если STARTTLS отсутствует или не работает, исследуйте конфигурацию сервера, а не отключайте шифрование.

Для большинства стандартных настроек cPanel порт  465  с действительным сертификатом является простым и надежным выбором.

Шаг 4. Поймите разницу между MAIL_SCHEME и MAIL_ENCRYPTION

В старых проектах Laravel обычно содержится:

 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
 

В шаблонах современных приложений Laravel вместо этого используется:

 'scheme' => env('MAIL_SCHEME'),
 

Шаблоны приложений Laravel 12 и 13 используют  MAIL_SCHEME , и текущие шаблоны Laravel 11 также включают его.

Код современного фреймворка Laravel использует явную схему, если она предоставлена. В противном случае он обычно выбирает  smtps  для порта  465  и  smtp  для остальных портов.

Symfony Mailer не интерпретирует старое значение конфигурации  encryption  как эффективную схему SMTP-транспорта.

Поэтому изменение:

 MAIL_ENCRYPTION=ssl
 

на:

 MAIL_ENCRYPTION=tls
 

не является надежным решением для современных приложений Laravel.

 Важно: Обновление фреймворка Laravel не обязательно заменяет файл  config/mail.php  в существующем приложении.

Проверьте актуальный файл конфигурации, прежде чем предполагать, что  MAIL_SCHEME  поддерживается.

Для старых проектов следуйте требованиям установленного фреймворка, а не копируйте настройки из нового скелета приложения без проверки совместимости.

Связанная проблема совместимости с Laravel 11 возникала, когда Symfony Mailer 7.2 отклонял пустую схему SMTP. Если вы столкнулись с ошибкой  The "" scheme is not supported , проверьте версии установленных зависимостей и примените совместимое обновление фреймворка.

Не принуждайте к изменению зависимостей Composer прямо на продакшене без предварительного тестирования.

Шаг 5. Проверьте пароли и MAIL_URL

Пароли почтовых ящиков иногда содержат символы, которые требуют аккуратного обращения в файлах окружения.

Для паролей, содержащих пробелы или такие символы, как  # , заключение значения в двойные кавычки помогает предотвратить некорректный разбор:

 MAIL_PASSWORD="Example#Password 2026"
 

Если ваш реальный пароль содержит символы, требующие специальной обработки парсером dotenv, соблюдайте правила экранирования этого парсера.

Не помещайте реальные пароли на скриншоты, в тикеты поддержки или в публичные логи ошибок.

Также проверьте наличие:

 MAIL_URL=
 

Стандартная конфигурация SMTP в Laravel поддерживает URL почтового транспорта, который может переопределять отдельные детали подключения.

Если вы настраиваете почтовый драйвер с помощью отдельных полей хоста, порта и учетных данных, удалите устаревшее значение  MAIL_URL , а не оставляйте конфликтующую строку подключения.

При использовании конфигурации в стиле URL зарезервированные символы в именах пользователей и паролях должны быть закодированы в формате процентного кодирования (percent-encoded).

Например,  @  превращается в  %40 .

Шаг 6. Очистите кэш конфигурации Laravel

После редактирования файла  .env  выполните следующие команды из корневого каталога проекта Laravel:

 php artisan config:clear
 

Это удалит кэш конфигурации Laravel, чтобы приложение могло прочитать обновленные настройки.

Если ваш стандартный процесс деплоя использует кэширование конфигурации, пересоберите его:

 php artisan config:cache
 

Не запускайте команду  config:cache , пока не убедитесь, что значения окружения верны.

Для постоянно работающих воркеров очереди выполните:

 php artisan queue:restart
 

Это попросит существующие воркеры корректно завершить работу после текущей задачи. Менеджер процессов должен перезапустить их, иначе задачи отправки писем перестанут обрабатываться.

Сигнал перезапуска очереди Laravel также зависит от конфигурации кэша приложения.

Дополнительные проверки при деплое см. в чек-листе Deploy Laravel on cPanel: Step-by-Step Checklist.

3. Исправление ошибок MAIL_HOST и SSL-сертификата

Правильный пароль от почтового ящика не может решить проблему несовпадения имени хоста в сертификате.

Когда Symfony Mailer устанавливает защищенное SMTP-соединение, PHP обычно проверяет сертификат сервера.

Это включает в себя проверку того, соответствует ли имя хоста идентификатору, указанному в сертификате.

Рассмотрите эти распространенные варианты выбора MAIL_HOST:

Значение MAIL_HOST Когда это может сработать Потенциальная проблема
 localhost  Локальная почтовая служба, настроенная на той же машине Идентификатор сертификата может не совпасть
 127.0.0.1  Локальный сервер со специально настроенным транспортом Несоответствие IP-сертификата или отсутствие SMTP-службы
 mail.example.com  DNS указывает на правильный сервер, и сертификат покрывает это имя Отсутствующий, просроченный или неверный сертификат
 server123.host.com  Хостинг-сервер предоставляет доверенный сертификат, покрывающий это имя Сервер все еще может предоставлять другой сертификат
IP-адрес сервера Специальные конфигурации с поддержкой действительного IP-сертификата Большинство обычных сертификатов виртуального хостинга (shared-hosting) не покрывают IP

Собственное имя хоста хостинг-сервера часто является самым простым решением, если его рекомендует cPanel.

Тем не менее, имя хоста все равно должно правильно разрешаться и соответствовать действительному сертификату, предоставляемому SMTP-службой.

Нельзя с уверенностью полагать, что любое имя хоста сервера всегда проходит проверку сертификата.

Проверка SMTP-сертификата с помощью OpenSSL

Если на вашем компьютере или хостинг-сервере установлен OpenSSL, протестируйте порт  465  с помощью команды:

 openssl s_client -connect mail.example.com:465 -servername mail.example.com -verify_hostname mail.example.com -verify_return_error -brief
 

Замените  mail.example.com  на исходящий сервер, который вы собираетесь использовать.

Команда пытается установить TLS-соединение и проверяет сертификат на соответствие этому имени хоста.

Успешный тест должен сообщить об успешной проверке сертификата.

Если срок действия сертификата истек, цепочке нельзя доверять или имя хоста указано неверно, вывод должен помочь выявить проблему.

Для порта  587  протестируйте STARTTLS следующим образом:

 openssl s_client -starttls smtp -connect mail.example.com:587 -servername mail.example.com -verify_hostname mail.example.com -verify_return_error -brief
 

Это указывает OpenSSL выполнить согласование SMTP STARTTLS перед проверкой сертификата.

 Запускайте эти тесты для того же имени хоста SMTP, которое использует ваше приложение Laravel.

Успешный тест сертификата с вашего ноутбука не доказывает, что исходящий SMTP доступен с хостинг-сервера. Сетевые ограничения могут отличаться.

Кроме того, проверки только общего имени сертификата (Common Name) недостаточно, так как действительные идентификаторы сертификатов могут быть перечислены в расширении альтернативного имени субъекта (Subject Alternative Name).

Исправьте сертификат, а не отключайте проверку

Если сертификат не соответствует  mail.example.com , проверьте исходящий сервер, отображаемый в интерфейсе Connect Devices в cPanel.

Если он рекомендует имя хоста сервера и у этого имени хоста есть действующий сертификат, используйте его.

Если вы управляете почтовой службой, восстановите или обновите сертификат и убедитесь, что SMTP-сервер предоставляет правильный.

Если им управляет ваш хостинг-провайдер, попросите службу поддержки проверить SMTP TLS-сертификат и имя хоста.

Некоторые решения из интернета предлагают следующее:

 'verify_peer' => false,
 

Избегайте этого в качестве обходного пути на продакшене.

Отключение проверки узла (peer verification) ослабляет защиту, которая подтверждает, что вы обмениваетесь данными с предполагаемым почтовым сервером.

Документация Symfony рассматривает отключенную проверку узлов как исключительную опцию для разработки или тестирования, а не как рекомендуемую конфигурацию для продакшена.

4. Устранение ошибок аутентификации SMTP 530 и 535

Как только сеть и TLS-соединение заработают, следующим возможным сбоем станет аутентификация SMTP.

Исправление ошибки 530: требуется аутентификация

При получении ответа  530  начните с чтения полного сообщения сервера.

Если он явно требует аутентификации, убедитесь, что учетные данные вашего почтового ящика заполнены.

Откройте Laravel Tinker:

 php artisan tinker
 

Затем проверьте конфигурацию почты, не выводя пароль на экран:

 config('mail.default');
config('mail.mailers.smtp.host');
config('mail.mailers.smtp.port');
config('mail.mailers.smtp.scheme');
config('mail.mailers.smtp.username');
 

Эти команды показывают значения, которые Laravel использует на самом деле.

Ожидаемые значения для примера с портом 465 включают:

 smtp
mail.example.com
465
smtps
noreply@example.com
 

Если активное имя пользователя равно  null , исследуйте ключ  .env , кэшированную конфигурацию и содержимое файла  config/mail.php .

Схема  null  может быть нормальной, когда фреймворк определяет схему на основе порта. Проверьте фактическое поведение фреймворка, прежде чем рассматривать это само по себе как ошибку.

Если полный ответ сервера 530 гласит, что требуется STARTTLS, сначала проверьте согласование TLS. Добавление имени пользователя не решит проблему отсутствующего рукопожатия STARTTLS.

Исправление ошибки 535: неверные данные аутентификации

Ответ  535  означает, что почтовый сервер отклонил аутентификацию.

Проверьте следующее:

 1. Используйте полный адрес почтового ящика

Для типичного почтового ящика cPanel:

 MAIL_USERNAME=noreply@example.com
 

Не используйте логин учетной записи cPanel или только ту часть, которая находится до символа  @ .

 2. Используйте пароль почтового ящика

Пароль для входа в cPanel и пароль отдельного почтового ящика не обязательно совпадают.

Откройте раздел  Учетные записи электронной почты → Управление (Email Accounts → Manage) и при необходимости сбросьте пароль почтового ящика.

После этого обновите  .env  и очистите кэш конфигурации.

 3. Проверьте ограничения учетной записи

Хостинг-провайдеры могут временно блокировать попытки аутентификации после повторяющихся неудачных попыток.

Некоторые внешние почтовые провайдеры также требуют пароли приложений (app passwords), аутентификацию на основе OAuth или другую специфичную для провайдера авторизацию.

Сам по себе действительный пароль может быть недостаточным, если обычная аутентификация SMTP отключена.

 4. Проверьте адрес отправителя

Для самого простого теста используйте в качестве отправителя аутентифицированный почтовый ящик:

 MAIL_FROM_ADDRESS="noreply@example.com"
 

Некоторые SMTP-серверы принудительно проверяют права отправителя или отклоняют сообщения с неподтвержденных адресов.

Другие серверы разрешают псевдонимы (алиасы) или отправителей, привязанных к конкретному домену.

Если ваш провайдер поддерживает алиасы, отправителю не обязательно быть отдельным почтовым ящиком, но он должен соответствовать правилам провайдера.

 5. Проверьте, где размещается почтовый сервис

Домен может использовать cPanel для сайта, в то время как почту обрабатывает другой провайдер.

Проверьте провайдера почтового ящика и соответствующие DNS-записи.

Если ящик принадлежит Microsoft 365, Google Workspace или другой внешней платформе, следуйте требованиям этого провайдера к аутентификации и SMTP.

В статье о сравнении cPanel Email, Google Workspace и Zoho Mail объясняются различия между популярными вариантами хостинга.

5. Когда SMTP заблокирован: ограничения и sendmail

Идеально настроенный почтовый модуль Laravel все равно может давать сбой, если хостинг-окружение препятствует нужному сетевому подключению.

Это особенно актуально при попытке связаться с внешним SMTP-сервисом с виртуального хостинга (shared hosting).

Проверьте ограничения на исходящий SMTP

Панель cPanel & WHM включает в себя функцию SMTP Restrictions (ограничения SMTP).

Когда она включена, сервер может ограничивать пользователей или процессы, подключающиеся напрямую к удаленным SMTP-серверам.

Это помогает предотвратить рассылку спама взломанными аккаунтами хостинга через неавторизованные почтовые сервисы.

Например, приложение, пытающееся подключиться к внешнему SMTP-провайдеру, может выдать тайм-аут (превышение времени ожидания), даже если его учетные данные и имя хоста указаны верно.

Другие правила фаервола могут вызывать схожие симптомы.

Задайте своему хостинг-провайдеру вопросы:

  • Разрешает ли мой хостинг-аккаунт исходящие соединения с нужным SMTP-хостом и портом?
  • Включена ли функция SMTP Restrictions?
  • Может ли мое приложение использовать локальную почтовую службу?
  • Доступен ли SMTP-хост с самого сервера хостинга?

Не стоит полагаться на то, что тайм-аут обязательно доказывает недоступность удаленного почтового провайдера.

Используйте локальный транспорт sendmail, когда это уместно

Laravel также поддерживает передачу исходящих сообщений локальной почтовой программе хостинг-сервера.

Пример для инсталляции Laravel, использующей стандартную конфигурацию транспорта sendmail:

 MAIL_MAILER=sendmail
MAIL_SENDMAIL_PATH="/usr/sbin/sendmail -bs -i"
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"
 

Указанный здесь путь к исполняемому файлу sendmail используется по умолчанию в стандартных конфигурационных файлах Laravel 12 и 13.

На других платформах или хостингах он может отличаться.

Этот транспорт не требует пароля от почтового ящика, поскольку взаимодействует с локальной почтовой программой, а не проходит аутентификацию на внешнем SMTP-сервере отправки.

Однако это не гарантирует успешную доставку.

Возможные проблемы:

  • Аккаунт хостинга не может запустить исполняемый файл sendmail.
  • Локальная почтовая служба недоступна или настроена неправильно.
  • Сервер применяет ограничения для отправителей или лимиты на сообщения.
  • На доставку влияют SPF, DKIM, DMARC или репутация сервера.

Используйте sendmail только в том случае, если ваш провайдер поддерживает его, а вашему приложению разрешено отправлять почту через локальный почтовый сервер.

Это не универсальное решение для любой проблемы с SMTP.

Когда почтовый API — лучший выбор

Для приложений, отправляющих важные транзакционные уведомления в больших объемах, почтовый API на базе HTTPS может подойти лучше, чем SMTP.

Laravel поддерживает несколько транспортов на основе API.

Эти сервисы могут требовать отдельные учетные данные, пакеты провайдера, а также платные тарифы или подписки с лимитами.

Перед переключением сравните требования сервиса к аутентификации, стоимость, лимиты и совместимость с хостингом.

Для небольших приложений Laravel, уже использующих правильно настроенный почтовый ящик cPanel, SMTP может быть вполне достаточно.

Для рассылок или отправки больших объемов проверяйте правила провайдеров, а не полагайтесь на ящик общего хостинга.

6. Тестирование доставки SMTP, очередей Laravel и лимитов на почту

Изменение  .env  — это еще не окончательная проверка.

Вам нужно убедиться, что Laravel может создать сообщение, передать его настроенному транспорту и получить успешный ответ.

Шаг 1: Отправка письма с помощью Laravel Tinker

В корне вашего проекта Laravel выполните:

 php artisan tinker
 

Затем выполните:

 \Illuminate\Support\Facades\Mail::raw(
    'SMTP test from Laravel on cPanel',
    function ($message) {
        $message
            ->to('your-address@gmail.com')
            ->subject('Laravel SMTP Test');
    }
);
 

Замените  your-address@gmail.com  на контролируемый вами почтовый ящик.

Этот тест отправляет базовое сообщение напрямую через настроенный в Laravel почтовый клиент, без задействования контроллера сброса пароля, шаблона Blade или почтового сообщения в очереди.

Если команда завершается без исключений, настроенный транспорт принял операцию отправки.

Для SMTP успешное принятие не гарантирует, что сообщение попалó в входящие к получателю.

Проверьте входящие сообщения и папку «Спам» получателя.

При необходимости просмотрите логи доставки исходящей почты вашего хостинг-провайдера.

Шаг 2: Отдельное тестирование почтового лог-драйвера

Если вы хотите выяснить, может ли ваше приложение Laravel генерировать сообщения без обращения к SMTP, временно используйте:

 MAIL_MAILER=log
 

Очистите кэш конфигурации и отправьте тестовое письмо снова.

Сообщение должно появиться в настроенном канале логирования приложения, зачастую здесь:

 storage/logs/laravel.log
 

Фактическое место сохранения логов может отличаться в зависимости от настроек логирования Laravel.

Этот тест полезен для локализации проблем генерации писем на уровне приложения.

Однако он не может проверить SMTP-учетные данные, сетевой доступ, согласование TLS или удаленную доставку.

Восстановите:

 MAIL_MAILER=smtp
 

и очистите либо пересоберите кэш конфигурации перед повторным тестированием реального SMTP.

Шаг 3: Проверка писем в очереди

Если ваше приложение отправляет почту через задания в очереди (queued jobs), одной лишь рабочей конфигурации SMTP недостаточно.

Например, класс почтового сообщения, реализующий  ShouldQueue , или вызов с использованием  ->queue()  обычно требуют работающего бэкенда очередей и воркера (работника).

Конфигурация очереди в стандартном Laravel 12 по умолчанию использует подключение к базе данных, если оно не было изменено.

Проверьте активное подключение к очереди:

 php artisan tinker
 

Затем:

 config('queue.default');
 

Если результат —  database , убедитесь, что необходимые таблицы в базе данных существуют и что к ним были применены соответствующие миграции.

Для ручной обработки заданий из очереди запустите:

 php artisan queue:work --stop-when-empty --tries=3
 

Это запустит воркер, обработает доступные задачи и завершит работу, как только очередь опустеет.

Это полезно для тестирования или для недолговечных окружений выполнения.

Для непрерывной продакшн-обработки Laravel обычно ожидает воркер, управляемый процесс-супервайзером.

На общем хостинге cPanel некоторые сайты вместо этого используют cron-задачу для периодического запуска кратковременного воркера.

При использовании cPanel Cron Jobs настройте актуальные абсолютные пути к исполняемому файлу PHP и файлу Laravel  artisan . Используйте подходящий механизм блокировки (блокировку файлов) или аналогичную защиту от параллельного запуска воркеров.

Планировщик Laravel может координировать задачи, но простое создание cron-записи для  schedule:run  не запускает воркер очереди автоматически, если не была определена соответствующая запланированная команда воркера.

Инструкции по устранению неполадок с cron можно найти в статье Laravel schedule:run Not Working on cPanel? Fix It.

Шаг 4: Проверка неудачных заданий

Запустите:

 php artisan queue:failed
 

Это выведет список записанных упавших задач, если настроено хранилище для таких задач.

Подробное исключение может быть доступно в записях хранилища  failed_jobs  и сопутствующих логах приложения.

Не публикуйте логи, содержащие учетные данные или персональные данные.

После устранения первопричины проблемы с SMTP повторите конкретную неудачную задачу, используя ее реальный ID:

 php artisan queue:retry YOUR_FAILED_JOB_ID
 

Замените  YOUR_FAILED_JOB_ID  на идентификатор, показанный Laravel.

Laravel также поддерживает:

 php artisan queue:retry all
 

Но не запускайте эту команду бездумно на продакшн-системе.

Просматривайте неудачные задачи перед их повторным запуском, особенно если они содержат уведомления для клиентов, счета, сообщения для сброса пароля или другой чувствительный ко времени контент.

Сообщение могло быть принято SMTP-сервером до того, как приложение зафиксировало последующий сбой.

Повторный запуск такой задачи потенциально может отправить дубликат сообщения.

Для важных рабочих процессов используйте подходящие средства обеспечения идемпотентности или защиты от дублирования.

Шаг 5: Проверка лимитов cPanel на количество писем в час

Даже после успешной SMTP-аутентификации доставка может задерживаться или ограничиваться лимитами хостинга.

WHM позволяет администраторам хостинга устанавливать лимиты на максимальное количество исходящих писем для доменов.

Ли пороговое значение и поведение после его достижения зависят от конфигурации хостинг-провайдера.

В документации cPanel поясняется, что сообщения, превышающие настроенный лимит, могут приниматься изначально, а затем обрабатываться в соответствии с настройками сервера для очереди и повторных попыток.

Было бы ошибкой полагать, что каждое лишнее сообщение обязательно будет доставлено позже.

Некоторые могут быть отложены или обработаны иначе в зависимости от политики сервера.

Если почта приходит с запозданием, уточните у своего провайдера информацию об ограничении для домена в час и о почтовой очереди.

Шаг 6: Проверка SPF, DKIM и DMARC

Если ваше тестовое письмо доходит до Gmail или Outlook, но попадает в спам, вы столкнулись с другим уровнем проблемы.

Успешная передача сообщения сервером SMTP на почтовый сервер не гарантирует его попадание во «Входящие».

Проверьте:

  •  SPF: Разрешает ли DNS отправку почты для вашего домена с данного сервиса?
  •  DKIM: Подписано ли исходящее письмо действующей подписью?
  •  DMARC: Согласованы ли ваша политика и аутентификация сообщения с видимым доменом отправителя?

Также проверьте репутацию IP-адреса отправляющего сервера и соответствие настроенного домена From тому сервису, которому разрешена отправка.

В статье cPanel Emails Going to Spam: SPF, DKIM & DMARC Fix эти проверки описаны подробно.

Итоговый контрольный список для проверки

Прежде чем считать проблему с SMTP решенной, убедитесь в следующем:

Проверка Ожидаемый результат
SMTP-хост Соответствует реальным настройкам провайдера
Порт и схема 465/smtps или поддерживаемый 587/smtp с STARTTLS
Проверка сертификата Действующий доверенный сертификат, соответствующий имени хоста
SMTP-учетные данные Аутентификация проходит успешно
Конфигурация Laravel Обновленные значения загружены
Прямая отправка через Tinker Исключения транспорта отсутствуют
Обработка очередей Ожидающие почтовые задания обрабатываются
Доставка получателю Тестовое сообщение приходит
SPF/DKIM/DMARC Записи аутентификации настроены корректно

Если прямая отправка через Tinker работает, а сброс пароля — нет, исследуйте рабочий процесс сброса пароля, настройку уведомлений и очереди, а не меняйте настройки SMTP снова.

Если в Tinker происходит сбой с исключением транспорта, сфокусируйтесь на этом исключении перед отладкой интерфейса приложения.

7. Часто задаваемые вопросы

Какой порт использовать для SMTP Laravel в cPanel — 465 или 587?

Для стандартной почты под управлением cPanel порт  465  с  MAIL_SCHEME=smtps  — хорошая отправная точка, так как cPanel приводит его в рекомендованных безопасных настройках.

Порт  587  с  MAIL_SCHEME=smtp  также может работать, когда почтовый сервер поддерживает STARTTLS.

Используйте значения, предоставленные вашим реальным почтовым провайдером, и убедитесь, что шифрование функционирует.

Не совмещайте неявный (implicit) TLS с портом, ожидающим стандартное приветствие SMTP.

Почему MAIL_HOST=localhost вызывает ошибки сертификата?

Почтовый сервер обычно предоставляет сертификат для домена или имени хоста сервера, а не для  localhost .

Когда Symfony Mailer проверяет соединение, несоответствие имени хоста может привести к сбою согласования TLS.

Используйте задокументированное имя хоста аутентифицированного SMTP-сервиса, защищенное действительным сертификатом.

Конфигурации локального SMTP-транспорта являются исключением и должны обрабатываться в соответствии с настройками локального почтового сервера.

Как исправить ошибку 535 Incorrect authentication data в Laravel?

Сначала проверьте полный адрес почтового ящика и его пароль.

Для управляемого через cPanel ящика используйте полный адрес электронной почты, а не имя пользователя аккаунта cPanel.

При необходимости сбросьте пароль от почтового ящика, обновите  .env , очистите кэш конфигурации и протестируйте снова.

Если ошибка сохраняется, проверьте ограничения аккаунта, заблокированные попытки аутентификации и специфичные требования провайдера.

Использует ли Laravel 12 по-прежнему MAIL_ENCRYPTION?

Стандартная конфигурация почты в Laravel 12 считывает параметр  MAIL_SCHEME , а не  MAIL_ENCRYPTION  для SMTP-почтальона.

При отсутствии явной схемы фреймворк обычно выбирает  smtps  для порта  465  и  smtp  для других портов.

Symfony Mailer обрабатывает шифрование в соответствии с конфигурацией транспорта.

В старых приложениях могут оставаться пользовательские или устаревшие конфигурационные файлы, поэтому проверьте  config/mail.php , прежде чем предполагать, что изменение конкретной переменной окружения возымеет эффект.

 Ссылки

Приведенные выше технические детали были сверены со следующей первичной документацией и источниками реализации:


Оригинал опубликован на сайте headsntail.com. Бесплатные инструменты для работы с PHP, Laravel и cPanel: headsntail.com/tools.