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

Yii

Инструкция для приложений на Yii 2 (2.0.43+). Mailexam подключается как SMTP-сервер через компонент mailer и расширение yii2-symfonymailer.

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

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • Yii 2 (Basic или Advanced шаблон).

Скопируйте из приветственного письма (или кабинета) для вашего проекта:

  • ВАШ_ЛОГИН — SMTP-логин (например, xxxxx);
  • ВАШ_ПАРОЛЬ — SMTP-пароль (уникальная пара к логину);
  • хост — ВАШ_ЛОГИН.mailexam.ru (совпадает с логином).

1. Зависимости

composer require yiisoft/yii2-symfonymailer
composer require vlucas/phpdotenv  # для .env в локальной разработке

В composer.json должны появиться пакеты yiisoft/yii2-symfonymailer и при необходимости vlucas/phpdotenv.

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

Файл .env в корне проекта (добавьте в .gitignore):

MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test

Подключите .env при старте (например, в web/index.php и yii перед созданием приложения):

Dotenv\Dotenv::createImmutable(__DIR__ . '/..')->safeLoad();

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

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

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

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

MAILEXAM_PORT=587
MAILEXAM_PORT=2525
MAILEXAM_PORT=25

3. Компонент mailer

Фрагмент config/web.php (или общий config/main.php):

<?php

$login = getenv('MAILEXAM_LOGIN') ?: '';
$port = (int) (getenv('MAILEXAM_PORT') ?: 587);

return [
    // ...
    'components' => [
        'mailer' => [
            'class' => \yii\symfonymailer\Mailer::class,
            'useFileTransport' => false,
            'transport' => [
                'scheme' => 'smtp',
                'host' => $login . '.mailexam.ru',
                'username' => $login,
                'password' => getenv('MAILEXAM_PASSWORD') ?: '',
                'port' => $port,
            ],
        ],
    ],
];

Для Advanced Template те же настройки добавьте в common/config/main-local.php.

Убедитесь, что useFileTransport установлен в false, иначе письма сохраняются в файлы вместо отправки на SMTP.

4. Отправка тестового письма

Через консоль

// commands/MailController.php
namespace app\commands;

use Yii;
use yii\console\Controller;

class MailController extends Controller
{
    public function actionTest(): int
    {
        $from = getenv('MAIL_FROM') ?: 'noreply@example.test';

        $sent = Yii::$app->mailer->compose()
            ->setFrom([$from => 'Mailexam Test'])
            ->setTo('user@example.test')
            ->setSubject('Yii + Mailexam')
            ->setTextBody('Тест Mailexam из Yii')
            ->send();

        $this->stdout($sent ? "ok\n" : "error\n");
        return $sent ? self::EXIT_CODE_NORMAL : self::EXIT_CODE_ERROR;
    }
}
php yii mail/test

Через HTTP (контроллер)

// controllers/MailController.php
namespace app\controllers;

use Yii;
use yii\web\Controller;
use yii\web\Response;

class MailController extends Controller
{
    public function actionTest(): array
    {
        Yii::$app->response->format = Response::FORMAT_JSON;

        $from = getenv('MAIL_FROM') ?: 'noreply@example.test';

        Yii::$app->mailer->compose()
            ->setFrom([$from => 'Mailexam Test'])
            ->setTo('user@example.test')
            ->setSubject('Yii + Mailexam')
            ->setTextBody('Тест Mailexam из Yii')
            ->send();

        return ['status' => 'ok'];
    }
}

Добавьте правило в urlManager и откройте маршрут в браузере или вызовите через curl.

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

5. Локальная разработка и CI

Среда Рекомендация
local .env или *-local.php с учётными данными 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. Типичные проблемы

Письмо не отправляется, файлы в runtime/mail

  • Проверьте useFileTransport => false в конфигурации mailer.

Ошибка TLS или подключения

  • host должен быть {логин}.mailexam.ru, username — тот же логин из письма.
  • Логин и пароль — пара из письма одного проекта.

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

  • Вызовите Dotenv::createImmutable(...)->safeLoad() до new yii\web\Application($config).
  • В production задайте переменные в окружении PHP-FPM / контейнера.

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

  • Смотрите входящие того же проекта Mailexam.
  • Включите debug: Yii::debug(Yii::$app->mailer->transport) при необходимости.

См. также