Перейти к содержанию

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 перед созданием приложения):

Dotenv\Dotenv::createImmutable(dirname(__DIR__))->safeLoad();

Хост в конфигурации: ВАШ_ЛОГИН.mailexam.ru.

Адрес отправителя

MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam®, а не реальному получателю.

Альтернативные порты

MAILEXAM_PORT=587
MAILEXAM_PORT=2525
MAILEXAM_PORT=465
MAILEXAM_PORT=25

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:

use think\facade\Route;

Route::post('mail/test', 'mail/test');

Запуск и проверка:

php -S 127.0.0.1:8080 -t public public/router.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.

См. также