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

Phalcon

Инструкция для приложений на Phalcon 5.x (PHP). Mailexam подключается как SMTP через пакет phalcon/incubator-mailer (обёртка над PHPMailer).

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

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • PHP 8.1+ и установленное расширение Phalcon.
  • Проект Phalcon (MVC) и Composer.

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

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

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

composer require phalcon/incubator-mailer
composer require vlucas/phpdotenv

Проверьте, что расширение загружено:

php -m | grep phalcon

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

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

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

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

Dotenv\Dotenv::createImmutable(BASE_PATH)->safeLoad();

Хост SMTP: ВАШ_ЛОГИН.mailexam.ru.

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

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

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

MAILEXAM_PORT=587

В конфиге mailer: 'encryption' => 'tls'.

MAILEXAM_PORT=2525

'encryption' => 'tls'.

MAILEXAM_PORT=465

'encryption' => 'ssl'.

MAILEXAM_PORT=25

Уберите ключ encryption или задайте пустую строку.

3. Конфигурация SMTP

app/Services/MailConfig.php:

<?php

declare(strict_types=1);

namespace App\Services;

final class MailConfig
{
    public static function smtp(): array
    {
        $login = getenv('MAILEXAM_LOGIN') ?: '';
        $port = (int) (getenv('MAILEXAM_PORT') ?: 587);
        $from = getenv('MAIL_FROM') ?: 'noreply@example.test';

        $config = [
            'driver'     => 'smtp',
            'host'       => $login . '.mailexam.ru',
            'port'       => $port,
            'username'   => $login,
            'password'   => getenv('MAILEXAM_PASSWORD') ?: '',
            'from'       => [
                'email' => $from,
                'name'  => 'Mailexam Test',
            ],
        ];

        if ($port === 465) {
            $config['encryption'] = 'ssl';
        } elseif (in_array($port, [587, 2525], true)) {
            $config['encryption'] = 'tls';
        }

        return $config;
    }
}

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

app/Controllers/MailController.php:

<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Services\MailConfig;
use Phalcon\Incubator\Mailer\Manager as MailerManager;
use Phalcon\Mvc\Controller;

class MailController extends Controller
{
    public function testAction()
    {
        $this->view->disable();
        $this->response->setContentType('application/json', 'UTF-8');

        $payload = $this->request->getJsonRawBody(true) ?? [];

        $to = $payload['to'] ?? 'user@example.test';
        $subject = $payload['subject'] ?? 'Phalcon + Mailexam';
        $body = $payload['body'] ?? 'Тест Mailexam из Phalcon';

        $mailer = new MailerManager(MailConfig::smtp());

        $mailer->createMessage()
            ->to($to)
            ->subject($subject)
            ->content($body)
            ->send();

        return $this->response->setJsonContent(['status' => 'ok']);
    }
}

Маршрут в config/routes.php:

<?php

use Phalcon\Mvc\Router;

$router = new Router(false);
$router->setDefaults([
    'namespace'  => 'App\Controllers',
    'controller' => 'index',
    'action'     => 'index',
]);

$router->addPost('/mail/test', [
    'controller' => 'mail',
    'action'     => 'test',
]);

return $router;

Запуск и проверка (встроенный PHP-сервер или ваш vhost):

php -S 127.0.0.1:8080 -t public
curl -X POST http://127.0.0.1:8080/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Проверка","body":"Привет"}'

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

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

Среда Рекомендация
local .env + Dotenv::safeLoad()
CI секреты MAILEXAM_LOGIN, MAILEXAM_PASSWORD в GitLab CI/CD Variables; образ PHP с расширением phalcon

Пример для .gitlab-ci.yml:

variables:
  MAILEXAM_LOGIN: $MAILEXAM_LOGIN
  MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
  MAILEXAM_PORT: "587"
  MAIL_FROM: "noreply@example.test"

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

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

Class 'Phalcon...' not found

  • Установите и включите расширение Phalcon для той же версии PHP, что в CLI и FPM.

Ошибка TLS или authentication failed

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

Порт 587

  • Нужен 'encryption' => 'tls', не ssl.

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

  • Смотрите входящие того же проекта Mailexam.
  • Включите отладку PHPMailer в конфиге incubator-mailer при необходимости.

См. также