Задача: переписать 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_KEY
  • RESEND_FROM_EMAIL

Добавить:

  • SMTP_HOST: smtp.mail.selcloud.ru
  • SMTP_PORT: "1127"
  • SMTP_USERNAME: "8244"
  • SMTP_PASSWORD: sGrVuMKU6wJxPvzALj
  • MAIL_FROM: noreply@nirbi.ru