Ваше 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
- Войдите в cPanel.
- Откройте Электронная почта → Учетные записи электронной почты (Email → Email Accounts).
- Найдите почтовый ящик, который будет использовать Laravel, например
noreply@example.com. - Нажмите Подключение устройств (Connect Devices).
- Найдите раздел Ручные настройки почтового клиента (Mail Client Manual Settings).
- Посмотрите Безопасные настройки SSL/TLS (рекомендуется) / Secure SSL/TLS Settings (Recommended).
- Скопируйте 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 , прежде чем предполагать, что изменение конкретной переменной окружения возымеет эффект.
Ссылки
Приведенные выше технические детали были сверены со следующей первичной документацией и источниками реализации:
- Документация Laravel 12 по почте
- Конфигурация Laravel 12
- Очереди в Laravel 12
- Конфигурация почты по умолчанию в Laravel 12
- Реализация MailManager в Laravel 12
- Проблема совместимости схем SMTP в Laravel
- Обсуждение изменения MAIL_ENCRYPTION в Laravel
- Документация Symfony Mailer
- Настройка почтового клиента в cPanel
- Ограничения SMTP в cPanel
- Лимиты на отправку почты в cPanel
- Опции SSL-контекста в PHP
Оригинал опубликован на сайте headsntail.com. Бесплатные инструменты для работы с PHP, Laravel и cPanel: headsntail.com/tools.
Комментарии (0)
Пока нет комментариев — будьте первым.