diff --git a/src/main/java/com/example/daemawiki/domain/mail/service/MailSend.java b/src/main/java/com/example/daemawiki/domain/mail/service/MailSend.java new file mode 100644 index 00000000..7e94f2fb --- /dev/null +++ b/src/main/java/com/example/daemawiki/domain/mail/service/MailSend.java @@ -0,0 +1,73 @@ +package com.example.daemawiki.domain.mail.service; + +import com.example.daemawiki.domain.mail.dto.AuthCodeRequest; +import com.example.daemawiki.domain.mail.model.AuthCode; +import com.example.daemawiki.domain.mail.repository.AuthCodeRepository; +import com.example.daemawiki.domain.mail.repository.AuthMailRepository; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeMessage; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +import java.util.Random; + +@Service +public class MailSend { + private final AuthCodeRepository codeRepository; + private final JavaMailSender mailSender; + + public MailSend(AuthCodeRepository authCodeRepository, JavaMailSender javaMailSender) { + this.codeRepository = authCodeRepository; + this.mailSender = javaMailSender; + } + + @Value("${admin.mail}") + private static String admin; + + private static final Random rand = new Random(); + + public Mono execute(AuthCodeRequest request) { + return sendMail(request.mail()) + .doOnNext(mailSender::send) + .then(); + } + + private Mono sendMail(String to) { + String authCode = getRandomCode(); + + return Mono.fromCallable(() -> { + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setTo(to); + helper.setSubject("DSM 메일 인증"); + + String mail = getMailTemplate(authCode); + + helper.setText(mail); + helper.setFrom(new InternetAddress(admin, "DSM-MAIL-AUTH")); + + return message; + }).flatMap(message -> codeRepository.save(AuthCode.builder() + .mail(to) + .code(authCode).build()) + .thenReturn(message)); + } + + private String getMailTemplate(String key) { + return "
" + + "

DSM 이메일 인증 코드 :

" + + "

" + key + "

" + + "

인증 코드는 3시간 동안 유효합니다.

" + + "
"; + } + + private String getRandomCode() { + int num = rand.nextInt(900000) + 100000; + return String.valueOf(num); + } + +}