diff --git a/sequence_member/src/main/java/sequence/sequence_member/member/controller/EmailAuthController.java b/sequence_member/src/main/java/sequence/sequence_member/member/controller/EmailAuthController.java index b3397696..a7f613f3 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/member/controller/EmailAuthController.java +++ b/sequence_member/src/main/java/sequence/sequence_member/member/controller/EmailAuthController.java @@ -4,7 +4,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import lombok.RequiredArgsConstructor; diff --git a/sequence_member/src/main/java/sequence/sequence_member/member/service/EmailAuthService.java b/sequence_member/src/main/java/sequence/sequence_member/member/service/EmailAuthService.java index f2c93df8..1222895d 100644 --- a/sequence_member/src/main/java/sequence/sequence_member/member/service/EmailAuthService.java +++ b/sequence_member/src/main/java/sequence/sequence_member/member/service/EmailAuthService.java @@ -3,27 +3,29 @@ import java.time.LocalDateTime; import java.util.UUID; +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 org.thymeleaf.context.Context; +import org.thymeleaf.spring6.SpringTemplateEngine; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; import sequence.sequence_member.member.entity.EmailAuthTokenEntity; import sequence.sequence_member.member.repository.EmailAuthTokenRepository; -import org.springframework.beans.factory.annotation.Value; - @RequiredArgsConstructor @Service public class EmailAuthService { private final JavaMailSender mailSender; + private final EmailAuthTokenRepository tokenRepo; + private final SpringTemplateEngine templateEngine; @Value("${NAVER_MAIL_USERNAME:dev_mj_@naver.com}") private String fromEmail; - private final EmailAuthTokenRepository tokenRepo; public void requestEmailVerification(String email) { tokenRepo.findAllByEmail(email).forEach(token -> { @@ -31,7 +33,7 @@ public void requestEmailVerification(String email) { tokenRepo.save(token); }); - String token = UUID.randomUUID().toString().substring(0, 6); + String token = UUID.randomUUID().toString().substring(0, 6).toUpperCase(); EmailAuthTokenEntity emailAuthToken = EmailAuthTokenEntity.builder() .email(email) @@ -41,11 +43,9 @@ public void requestEmailVerification(String email) { .build(); tokenRepo.save(emailAuthToken); - sendAuthEmail(email, token); } - // 인증 확인 public void verifyEmailToken(String email, String token) { EmailAuthTokenEntity authToken = tokenRepo.findByEmailAndToken(email, token) .orElseThrow(() -> new IllegalArgumentException("잘못된 인증 정보입니다.")); @@ -61,42 +61,33 @@ public void verifyEmailToken(String email, String token) { throw new IllegalStateException("시간 초과로 인하여 토큰이 만료되었습니다."); } - // 해당 이메일의 모든 토큰 만료 처리 tokenRepo.findAllByEmail(email).forEach(t -> { - t.setVerified(false); // 기존 것들 다 false로 초기화 + t.setVerified(false); tokenRepo.save(t); }); - // 현재 토큰만 인증 처리 authToken.setVerified(true); tokenRepo.save(authToken); } - - - // MimeMessage 방식으로 인증 메일 전송 private void sendAuthEmail(String email, String token) { try { MimeMessage message = mailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(message, true); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + Context context = new Context(); + context.setVariable("token", token); + + String htmlContent = templateEngine.process("emailAuth", context); helper.setFrom(fromEmail); helper.setTo(email); - helper.setSubject("[Sequence] 이메일 인증 코드"); + helper.setSubject("[Sequence] 이메일 인증 안내"); + helper.setText(htmlContent, true); - String content = "" - + "

이메일 인증 안내

" - + "

아래의 인증 코드를 입력해주세요.

" - + "

인증 코드: " + token + "

" - + ""; - - helper.setText(content, true); mailSender.send(message); - } catch (MessagingException e) { - throw new RuntimeException("이메일 전송 실패", e); + throw new RuntimeException("이메일 발송 중 오류가 발생했습니다.", e); } } - } - diff --git a/sequence_member/src/main/resources/templates/emailAuth.html b/sequence_member/src/main/resources/templates/emailAuth.html new file mode 100644 index 00000000..34032636 --- /dev/null +++ b/sequence_member/src/main/resources/templates/emailAuth.html @@ -0,0 +1,43 @@ + + + + + Sequence 이메일 인증 + + + + + + + +
+ + + + + + + + + + +
+

Sequence

+
+

이메일 인증 안내

+

회원가입을 완료하려면 아래 인증 코드를 입력해주세요.

+ + + + + +
+ A1B2C3 +
+

본인이 요청하지 않은 인증 메일이라면 이 메일을 무시하셔도 좋습니다.

+
+

© 2025 Sequence. All Rights Reserved.

+
+
+ +