Spring Cloud Alibaba + Mailexam
Минимальный микросервис Spring Cloud Alibaba, который отправляет тестовое письмо через SMTP Mailexam с помощью spring-boot-starter-mail и JavaMailSender.
Основан на руководстве Mailexam для Spring Cloud Alibaba.
Что понадобится
- Аккаунт Mailexam и проект с SMTP-учётными данными.
- JDK 17+.
Из приветственного письма или личного кабинета Mailexam:
| Переменная | Описание |
|---|---|
MAILEXAM_LOGIN |
SMTP-логин (например, xxxxx) |
MAILEXAM_PASSWORD |
SMTP-пароль (пара к логину) |
| Host |
{MAILEXAM_LOGIN}.mailexam.ru (задаётся в application.yml) |
Service discovery через Nacos включён, но по умолчанию отключён (NACOS_DISCOVERY_ENABLED=false), чтобы можно было запустить пример без сервера Nacos.
Быстрый старт (на хосте)
- Экспортируйте переменные окружения (или скопируйте из
.env.example):
cp .env.example .env
# отредактируйте .env, затем:
set -a && source .env && set +a
- Запустите приложение:
./gradlew bootRun
По умолчанию сервер слушает http://127.0.0.1:8080.
- Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:8080/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'
Письмо появится в личном кабинете Mailexam → ваш проект → входящие.
Переменные окружения
| Переменная | Обязательна | По умолчанию | Описание |
|---|---|---|---|
MAILEXAM_LOGIN |
да | — | SMTP-логин; хост — {логин}.mailexam.ru
|
MAILEXAM_PASSWORD |
да | — | SMTP-пароль |
MAILEXAM_PORT |
нет | 587 |
SMTP-порт (587, 2525 или 25) |
MAIL_FROM |
нет | noreply@example.test |
Адрес отправителя |
NACOS_DISCOVERY_ENABLED |
нет | false |
Регистрация сервиса в Nacos при true
|
NACOS_SERVER_ADDR |
нет | 127.0.0.1:8848 |
Адрес сервера Nacos |
HTTP_HOST |
нет | 127.0.0.1 |
Адрес привязки HTTP |
HTTP_PORT |
нет | 8080 |
Порт HTTP |
Для порта 587 STARTTLS включается через mail.smtp.starttls.enable=true. Для порта 25 задайте spring.mail.properties.mail.smtp.starttls.enable=false.
Структура проекта
.
├── build.gradle
├── src/main/java/com/example/demo/
│ ├── MailexamSpringCloudAlibabaApplication.java
│ ├── mail/MailService.java
│ └── web/MailController.java
├── src/main/resources/application.yml
├── .env.example
├── Dockerfile # только для локальной отладки
└── docker-compose.yml
Docker (отладка)
Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте через ./gradlew bootRun (см. выше).
cp .env.example .env
# отредактируйте .env с учётными данными Mailexam
docker compose up --build
Затем вызовите тот же endpoint на проброшенном порту:
curl -X POST http://127.0.0.1:8080/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'
Внутри контейнера сервер слушает 0.0.0.0:8080.
CI
Задайте эти секреты в окружении CI:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
NACOS_DISCOVERY_ENABLED: "false"
После отправки письма в тесте проверьте доставку через API Mailexam.
Типичные проблемы
Ошибка TLS или подключения
-
spring.mail.hostдолжен быть{логин}.mailexam.ru, где{логин}совпадает сMAILEXAM_LOGIN. - Логин и пароль должны быть из одного проекта Mailexam.
Ошибки подключения к Nacos при старте
- Оставьте
NACOS_DISCOVERY_ENABLED=falseдля локального SMTP-тестирования без Nacos. - При включении discovery убедитесь, что Nacos доступен по адресу
NACOS_SERVER_ADDR.
Переменные не подставляются
- Экспортируйте
MAILEXAM_LOGINиMAILEXAM_PASSWORDперед./gradlew bootRunили задайте их в конфигурации запуска IDE.
Письмо не в кабинете
- Откройте входящие того же проекта Mailexam.
- Включите логирование:
logging.level.org.springframework.mail=DEBUG.
См. также
- Руководство Mailexam для Spring Cloud Alibaba (wiki)
- Пример на Spring Boot — та же SMTP-настройка без Spring Cloud
-
Пример на Quarkus — cloud-native JVM-фреймворк с
quarkus-mailer - Пример на Ktor — другой JVM-фреймворк с Jakarta Mail
- Документация Spring Cloud Alibaba
- Документация API Mailexam
Лицензия
Apache 2.0