S

Spring Boot

Темы: springboot Java smtp
+ ещё 3
Пример отправки писем через SMTP Mailexam на Spring Boot (Java, модуль spring-boot-starter-mail).

Spring Boot + Mailexam

Минимальный пример Spring Boot, который отправляет тестовое письмо через SMTP Mailexam с помощью spring-boot-starter-mail и JavaMailSender.

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

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

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • JDK 17+.

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

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

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

  1. Экспортируйте переменные окружения (или скопируйте из .env.example):
cp .env.example .env
# отредактируйте .env, затем:
set -a && source .env && set +a
  1. Запустите приложение:
./gradlew bootRun

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

  1. Отправьте тестовое письмо:
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 Адрес отправителя
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/
│   ├── MailexamSpringApplication.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"

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

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

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

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

Переменные не подставляются

  • Экспортируйте MAILEXAM_LOGIN и MAILEXAM_PASSWORD перед ./gradlew bootRun или задайте их в конфигурации запуска IDE.

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

  • Откройте входящие того же проекта Mailexam.
  • Включите логирование: logging.level.org.springframework.mail=DEBUG.

См. также

Лицензия

Apache 2.0