Задача: переписать EmailService в erp-auth-service с Resend на SMTP
Контекст
Репозиторий: nearbyErp/erp-auth-service
Локально склонирован в: C:\Users\ivan.koshcheev.admin\Desktop\claude\erp\erp-auth-service\
Сейчас EmailService.java отправляет письма через HTTP API Resend (https://api.resend.com/emails).
Нужно переписать на Spring Mail + SMTP, используя Selectel SMTP relay.
Данные Selectel SMTP (прод):
- Host:
smtp.mail.selcloud.ru - Port:
1127(TLS/SSL) - Login:
8244 - Password:
sGrVuMKU6wJxPvzALj - From:
noreply@nirbi.ru
ВАЖНО: В репо ничего не пушить без явной команды от владельца проекта.
Только читать файлы, редактировать локально, делать git commit локально.
Что нужно изменить — 3 файла
1. pom.xml — добавить зависимость
Найти блок <dependencies> и добавить:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>2. src/main/resources/application.yml — заменить конфиг email
Удалить эти строки:
resend:
api-key: ${RESEND_API_KEY:}
from-email: ${RESEND_FROM_EMAIL:noreply@erp.local}Добавить в блок spring: (рядом с data.redis):
mail:
host: ${SMTP_HOST:localhost}
port: ${SMTP_PORT:1025}
username: ${SMTP_USERNAME:}
password: ${SMTP_PASSWORD:}
properties:
mail:
smtp:
auth: true
starttls:
enable: false
ssl:
enable: trueДобавить в блок app: (вместо resend:):
mail:
from: ${MAIL_FROM:noreply@erp.local}Итоговый app: блок должен выглядеть так:
app:
jwt:
secret: ${JWT_SECRET:dev-secret-key-minimum-256-bits-long-for-hs256}
access-ttl: ${JWT_ACCESS_TTL:900}
refresh-ttl: ${JWT_REFRESH_TTL:2592000}
service-token: ${SERVICE_TOKEN:dev-service-token}
user-service:
url: ${USER_SERVICE_URL:http://localhost:3002}
mail:
from: ${MAIL_FROM:noreply@erp.local}
frontend:
url: ${FRONTEND_URL:http://localhost:5173}3. src/main/java/com/erp/auth/service/EmailService.java — полностью заменить
Заменить весь файл на:
package com.erp.auth.service;
import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class EmailService {
private final JavaMailSender mailSender;
private final String fromEmail;
private final String frontendUrl;
public EmailService(JavaMailSender mailSender,
@Value("${app.mail.from}") String fromEmail,
@Value("${app.frontend.url}") String frontendUrl) {
this.mailSender = mailSender;
this.fromEmail = fromEmail;
this.frontendUrl = frontendUrl;
}
public void sendPasswordResetEmail(String email, String token) {
String resetLink = frontendUrl + "/reset-password?token=" + token;
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom(fromEmail);
helper.setTo(email);
helper.setSubject("Сброс пароля");
String html = "<p>Перейдите по ссылке для сброса пароля: " +
"<a href='" + resetLink + "'>Сбросить пароль</a></p>" +
"<p>Ссылка действительна 1 час.</p>";
helper.setText(html, true);
mailSender.send(message);
log.info("Password reset email sent to {}", email);
} catch (Exception e) {
log.error("Error sending password reset email to {}: {}", email, e.getMessage());
}
}
}4. .env.example — обновить переменные email
Удалить:
RESEND_API_KEY=
RESEND_FROM_EMAIL=noreply@erp.local
Добавить:
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_USERNAME=
SMTP_PASSWORD=
MAIL_FROM=noreply@erp.local
Проверка после изменений
Убедиться что проект собирается:
./mvnw clean package -DskipTestsПеременные для прод-окружения (k8s Secret)
После внесения изменений в k8s-секрете auth-service-secret нужно заменить:
Убрать:
RESEND_API_KEYRESEND_FROM_EMAIL
Добавить:
SMTP_HOST: smtp.mail.selcloud.ruSMTP_PORT: "1127"SMTP_USERNAME: "8244"SMTP_PASSWORD: sGrVuMKU6wJxPvzALjMAIL_FROM: noreply@nirbi.ru