Next.js + Mailexam

Минимальный пример Next.js, который отправляет тестовое письмо через SMTP Mailexam с помощью Nodemailer и Route Handler в App Router.

Основан на руководстве Mailexam для Next.js.

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

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • Node.js 18+ и npm.

Из приветственного письма или личного кабинета Mailexam:

Переменная Описание
MAILEXAM_LOGIN SMTP-логин (например, xxxxx)
MAILEXAM_PASSWORD SMTP-пароль (пара к логину)
Хост {MAILEXAM_LOGIN}.mailexam.ru (собирается автоматически в коде)

Быстрый старт (на хосте)

  1. Установите зависимости:
npm install
  1. Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
  1. Отредактируйте .env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
  1. Запустите сервер разработки:
npm run dev

Сервер слушает http://127.0.0.1:3000 по умолчанию.

  1. Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:3000/api/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","text":"Привет"}'

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

Для production-запуска:

npm run build
npm start

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

Переменная Обязательна По умолчанию Описание
MAILEXAM_LOGIN да SMTP-логин; также используется для имени хоста
MAILEXAM_PASSWORD да SMTP-пароль
MAILEXAM_PORT нет 587 SMTP-порт (587, 2525 или 465)
MAIL_FROM нет noreply@example.test Адрес отправителя (любой тестовый адрес)
PORT нет 3000 Порт HTTP (npm start / Docker)
HOSTNAME нет 127.0.0.1 Адрес привязки HTTP (Docker: 0.0.0.0)

Для порта 587 transport использует STARTTLS (secure: false). Для порта 465 — SMTPS (secure: true).

Структура проекта

.
├── package.json
├── mail.js                          # Nodemailer transport и sendTest()
├── app/
│   ├── layout.js
│   ├── page.js
│   └── api/mail/test/route.js       # POST /api/mail/test
├── next.config.js
├── .env.example
├── Dockerfile                       # только для локальной отладки
└── docker-compose.yml

Docker (отладка)

Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте через npm run dev (см. выше).

cp .env.example .env
# отредактируйте .env с учётными данными Mailexam

docker compose up --build

Затем вызовите тот же endpoint на проброшенном порту:

curl -X POST http://127.0.0.1:3000/api/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","text":"Привет"}'

Внутри контейнера сервер слушает 0.0.0.0:3000.

CI

Задайте эти секреты в окружении CI:

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

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

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

Таймаут соединения / ошибка аутентификации

  • Хост должен быть {логин}.mailexam.ru, где {логин} совпадает с MAILEXAM_LOGIN.
  • Логин и пароль должны быть из одного проекта Mailexam.

Порт 587 и TLS

  • Для 587: secure: false (STARTTLS). Для 465: secure: true.

Маршрут возвращает 404

  • Используйте /api/mail/test, а не /mail/test.
  • После изменений кода перезапустите npm run dev или пересоберите для production.

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

  • Откройте входящие того же проекта Mailexam.
  • Проверьте JSON-тело ошибки от route handler и логи сервера.

Порт уже занят

  • Измените PORT в .env или остановите другой процесс на порту 3000.

См. также

Лицензия

Apache 2.0