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. Зависимости¶
Проверьте, что расширение загружено:
2. Переменные окружения¶
Файл .env в корне проекта (добавьте в .gitignore):
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
Подключите .env при старте (например, в public/index.php до создания приложения):
Хост SMTP: ВАШ_ЛОГИН.mailexam.ru.
Адрес отправителя
MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam, а не реальному получателю.
Альтернативные порты¶
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):
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 при необходимости.