L

Laravel

Темы: laravel PHP smtp
+ ещё 2
Пример отправки писем через SMTP Mailexam на Laravel (PHP, встроенный Laravel Mail).

Laravel + Mailexam

Минимальный пример Laravel, который отправляет тестовое письмо через SMTP Mailexam с помощью Laravel Mail.

Основан на руководстве Mailexam для Laravel.

Что понадобится

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • PHP 8.3+ и Composer.

Из приветственного письма или личного кабинета Mailexam:

Переменная Описание
MAIL_USERNAME SMTP-логин (например, xxxxx)
MAIL_PASSWORD SMTP-пароль (пара к логину)
MAIL_HOST {логин}.mailexam.ru (должен совпадать с логином)

Быстрый старт (на хосте)

  1. Установите зависимости:
composer install
  1. Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
php artisan key:generate
  1. Отредактируйте .env — укажите SMTP Mailexam из приветственного письма:
MAIL_MAILER=smtp
MAIL_SCHEME=smtp
MAIL_HOST=ВАШ_ЛОГИН.mailexam.ru
MAIL_PORT=587
MAIL_USERNAME=ВАШ_ЛОГИН
MAIL_PASSWORD=ВАШ_ПАРОЛЬ
MAIL_FROM_ADDRESS=noreply@example.test
MAIL_FROM_NAME="${APP_NAME}"
  1. Сбросьте кеш конфигурации после изменений:
php artisan config:clear
  1. Запустите сервер:
php artisan serve

По умолчанию сервер слушает http://127.0.0.1:8000.

  1. Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:8000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Письмо появится в личном кабинете Mailexam → ваш проект → входящие.

Переменные окружения

Переменная Обязательна По умолчанию Описание
MAIL_MAILER да smtp Используйте smtp для Mailexam
MAIL_HOST да {логин}.mailexam.ru
MAIL_PORT нет 587 SMTP-порт (587, 2525 или 25)
MAIL_USERNAME да SMTP-логин
MAIL_PASSWORD да SMTP-пароль
MAIL_SCHEME нет smtp smtp для STARTTLS на 587; smtps для 465
MAIL_FROM_ADDRESS нет noreply@example.test Адрес отправителя
APP_KEY да Выполните php artisan key:generate
HTTP_HOST нет 127.0.0.1 Адрес привязки HTTP (Docker)
HTTP_PORT нет 8000 Порт HTTP (Docker)

Для порта 587 используйте MAIL_SCHEME=smtp (STARTTLS). Для порта 465MAIL_SCHEME=smtps. Для порта 25 задайте MAIL_SCHEME=null.

Структура проекта

.
├── app/Http/Controllers/MailController.php
├── routes/web.php
├── config/mail.php
├── .env.example
├── Dockerfile         # только для локальной отладки
└── docker-compose.yml

Docker (отладка)

Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте через php artisan serve (см. выше).

cp .env.example .env
php artisan key:generate
# отредактируйте .env с учётными данными Mailexam

docker compose up --build

Затем вызовите тот же endpoint на проброшенном порту:

curl -X POST http://127.0.0.1:8000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Внутри контейнера сервер слушает 0.0.0.0:8000, чтобы работало проброс портов.

CI

Задайте эти секреты в окружении CI:

variables:
  MAIL_MAILER: smtp
  MAIL_HOST: "${MAILEXAM_LOGIN}.mailexam.ru"
  MAIL_PORT: "587"
  MAIL_USERNAME: "${MAILEXAM_LOGIN}"
  MAIL_PASSWORD: "${MAILEXAM_PASSWORD}"
  MAIL_SCHEME: smtp
  MAIL_FROM_ADDRESS: "noreply@example.test"

После отправки письма в тесте проверьте доставку через API Mailexam.

Для unit-тестов без сети используйте MAIL_MAILER=array или log.

Типичные проблемы

Connection could not be established

  • MAIL_HOST должен быть {логин}.mailexam.ru — тот же логин, что в MAIL_USERNAME.
  • Логин и пароль должны быть из одного проекта Mailexam.
  • Выполните php artisan config:clear после изменения .env.

419 CSRF token mismatch

  • Маршрут /mail/test исключён из проверки CSRF для тестирования через curl.

Письмо не в кабинете

  • Откройте входящие того же проекта Mailexam.
  • Проверьте storage/logs/laravel.log на ошибки SMTP.

См. также

Лицензия

Apache 2.0