ThinkPHP¶
Инструкция для приложений на ThinkPHP 8 (8.x). Mailexam® подключается как SMTP-сервер через пакет yzh52521/think-mail (Symfony Mailer).
Что понадобится¶
- Аккаунт Mailexam® и проект с SMTP-учётными данными.
- ThinkPHP 8 и Composer.
Скопируйте из приветственного письма (или кабинета) для вашего проекта:
ВАШ_ЛОГИН— SMTP-логин (например,xxxxx);ВАШ_ПАРОЛЬ— SMTP-пароль (уникальная пара к логину);- хост —
ВАШ_ЛОГИН.mailexam.ru(совпадает с логином).
1. Зависимости¶
composer require yzh52521/think-mail
composer require vlucas/phpdotenv # для .env в локальной разработке
После установки в проекте появится config/mailer.php. Настройте его под Mailexam® (см. ниже).
2. Переменные окружения¶
Файл .env в корне проекта (добавьте в .gitignore):
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
Подключите .env при старте (например, в public/index.php перед созданием приложения):
Хост в конфигурации: ВАШ_ЛОГИН.mailexam.ru.
Адрес отправителя
MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam®, а не реальному получателю.
Альтернативные порты¶
3. Конфигурация SMTP¶
config/mailer.php:
<?php
$login = getenv('MAILEXAM_LOGIN') ?: '';
$port = (int) (getenv('MAILEXAM_PORT') ?: 587);
$from = getenv('MAIL_FROM') ?: 'noreply@example.test';
return [
'scheme' => 'smtp',
'host' => $login . '.mailexam.ru',
'username' => $login,
'password' => getenv('MAILEXAM_PASSWORD') ?: '',
'port' => $port,
'options' => [],
'embed' => 'cid:',
'from' => [
'address' => $from,
'name' => 'Mailexam Test',
],
];
Для сложных сценариев используйте шаблоны и вложения из think-mail — SMTP-параметры остаются теми же.
4. Отправка тестового письма¶
Через HTTP (контроллер)¶
// app/controller/Mail.php
namespace app\controller;
use app\BaseController;
use mailer\facade\Mailer;
class Mail extends BaseController
{
public function test()
{
$payload = $this->request->post();
if ($payload === []) {
$payload = json_decode($this->request->getContent(), true) ?? [];
}
$to = $payload['to'] ?? 'user@example.test';
$subject = $payload['subject'] ?? 'ThinkPHP + Mailexam';
$body = $payload['body'] ?? $payload['text'] ?? 'Тест Mailexam из ThinkPHP';
Mailer::to($to)->subject($subject)->text($body)->send();
return json(['status' => 'ok']);
}
}
Маршрут в route/app.php:
Запуск и проверка:
curl -X POST http://127.0.0.1:8080/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Test","body":"Hello"}'
Письмо появится в кабинете Mailexam® → ваш проект → входящие.
5. Локальная разработка и CI¶
| Среда | Рекомендация |
|---|---|
local |
.env с учётными данными Mailexam® |
| CI | Переменные MAILEXAM_LOGIN, MAILEXAM_PASSWORD в секретах pipeline |
Пример для GitLab CI:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
После отправки письма в pipeline проверьте доставку через API Mailexam®.
6. Типичные проблемы¶
Ошибка TLS или аутентификации
hostдолжен быть{логин}.mailexam.ru,username— тот же логин из письма.- Логин и пароль — пара из письма одного проекта.
Переменные окружения пустые
- Вызовите
Dotenv::createImmutable(...)->safeLoad()до(new App())->http. - В production задайте переменные в окружении PHP-FPM / контейнера.
Письмо не в кабинете
- Смотрите входящие того же проекта Mailexam®.
- Проверьте
runtime/log/на ошибки SMTP.
См. также¶
- Каталог примеров
- Пример реализации (ThinkPHP)
- Laravel, Yii, Symfony — другие PHP-фреймворки
- Документация REST API Mailexam®
- Документация ThinkPHP
- yzh52521/think-mail