33import java .time .LocalDateTime ;
44import java .util .UUID ;
55
6+ import org .springframework .beans .factory .annotation .Value ;
67import org .springframework .mail .javamail .JavaMailSender ;
78import org .springframework .mail .javamail .MimeMessageHelper ;
89import org .springframework .stereotype .Service ;
10+ import org .thymeleaf .context .Context ;
11+ import org .thymeleaf .spring6 .SpringTemplateEngine ;
912
1013import jakarta .mail .MessagingException ;
1114import jakarta .mail .internet .MimeMessage ;
1215import lombok .RequiredArgsConstructor ;
1316import sequence .sequence_member .member .entity .EmailAuthTokenEntity ;
1417import sequence .sequence_member .member .repository .EmailAuthTokenRepository ;
15- import org .springframework .beans .factory .annotation .Value ;
16-
1718
1819@ RequiredArgsConstructor
1920@ Service
2021public class EmailAuthService {
2122
2223 private final JavaMailSender mailSender ;
24+ private final EmailAuthTokenRepository tokenRepo ;
25+ private final SpringTemplateEngine templateEngine ;
2326
2427 @ Value ("${NAVER_MAIL_USERNAME:dev_mj_@naver.com}" )
2528 private String fromEmail ;
26- private final EmailAuthTokenRepository tokenRepo ;
2729
2830 public void requestEmailVerification (String email ) {
2931 tokenRepo .findAllByEmail (email ).forEach (token -> {
3032 token .setExpired (true );
3133 tokenRepo .save (token );
3234 });
3335
34- String token = UUID .randomUUID ().toString ().substring (0 , 6 );
36+ String token = UUID .randomUUID ().toString ().substring (0 , 6 ). toUpperCase () ;
3537
3638 EmailAuthTokenEntity emailAuthToken = EmailAuthTokenEntity .builder ()
3739 .email (email )
@@ -41,11 +43,9 @@ public void requestEmailVerification(String email) {
4143 .build ();
4244
4345 tokenRepo .save (emailAuthToken );
44-
4546 sendAuthEmail (email , token );
4647 }
4748
48- // 인증 확인
4949 public void verifyEmailToken (String email , String token ) {
5050 EmailAuthTokenEntity authToken = tokenRepo .findByEmailAndToken (email , token )
5151 .orElseThrow (() -> new IllegalArgumentException ("잘못된 인증 정보입니다." ));
@@ -61,42 +61,33 @@ public void verifyEmailToken(String email, String token) {
6161 throw new IllegalStateException ("시간 초과로 인하여 토큰이 만료되었습니다." );
6262 }
6363
64- // 해당 이메일의 모든 토큰 만료 처리
6564 tokenRepo .findAllByEmail (email ).forEach (t -> {
66- t .setVerified (false ); // 기존 것들 다 false로 초기화
65+ t .setVerified (false );
6766 tokenRepo .save (t );
6867 });
6968
70- // 현재 토큰만 인증 처리
7169 authToken .setVerified (true );
7270 tokenRepo .save (authToken );
7371 }
7472
75-
76-
77- // MimeMessage 방식으로 인증 메일 전송
7873 private void sendAuthEmail (String email , String token ) {
7974 try {
8075 MimeMessage message = mailSender .createMimeMessage ();
81- MimeMessageHelper helper = new MimeMessageHelper (message , true );
76+ MimeMessageHelper helper = new MimeMessageHelper (message , true , "UTF-8" );
77+
78+ Context context = new Context ();
79+ context .setVariable ("token" , token );
80+
81+ String htmlContent = templateEngine .process ("emailAuth" , context );
8282
8383 helper .setFrom (fromEmail );
8484 helper .setTo (email );
85- helper .setSubject ("[Sequence] 이메일 인증 코드" );
85+ helper .setSubject ("[Sequence] 이메일 인증 안내" );
86+ helper .setText (htmlContent , true );
8687
87- String content = "<html><body>"
88- + "<h2>이메일 인증 안내</h2>"
89- + "<p>아래의 인증 코드를 입력해주세요.</p>"
90- + "<p><strong>인증 코드: " + token + "</strong></p>"
91- + "</body></html>" ;
92-
93- helper .setText (content , true );
9488 mailSender .send (message );
95-
9689 } catch (MessagingException e ) {
97- throw new RuntimeException ("이메일 전송 실패 " , e );
90+ throw new RuntimeException ("이메일 발송 중 오류가 발생했습니다. " , e );
9891 }
9992 }
100-
10193}
102-
0 commit comments