SMTP 인증과 Google 계정 보안 문제도 해결 후 이메일 발송이 정상적으로 처리되는 것을 확인했다.
그런데.. 메일을 확인했더니 또 한번 오류에 부딪히고 말았다.
제목은 잘 전달되었는데, 메일의 내용 중 한글 부분만 제대로 인식을 못하는 문제였다.
<body>
<div style="margin:100px;" class="mail-container">
<h1 class="mail-title">아이디 찾기 결과</h1>
<p class="mail-content">
{{userName}} 님의 SFDB 아이디는 '{{userId}}' 입니다.
</p>
</div>
</body>
메일 내용을 전달하는 html 파일의 일부인데 딱 한글 부분만 인식을 못하고 있었다.
처음에는 인코딩 문제이겠거니 싶어 <head> 태그에 'UTF-8'을 작성해보기도 하고, 스프링부트 설정도 다시 확인해봤지만
어떻게 해도 인코딩이 되지 않아 문제가 반복되었다. 라이브러리 문제인가 싶어 freemarker를 thymeleaf로 수정해보았는데도 오류는 여전했다. 차근차근 되짚어보던 중 메일의 제목은 정상적으로 나오는데, 왜 내용만 인식을 못 하나 생각하다가
문제를 찾아낼 수 있었다.
원인
문제의 원인은 이메일 라이브러리의 Content-Type 헤더에 있었다.
원래 아이디 찾기 메일 발송 메소드는 아래와 같았는데
//코드 일부
String mailSubject = "[SFDB] 회원님의 아이디 찾기 결과입니다.";
Context context = new Context();
context.setVariable("userName", userName);
context.setVariable("userId", userId);
String htmlContent = templateEngine.process("findId", context);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setTo(userEmail);
helper.setSubject(mailSubject);
helper.setText(htmlContent, true);
System.out.println(htmlContent);
javaMailSender.send(mimeMessage);
메일의 Content-Type 헤더에 대한 설정은 주로 이메일 라이브러리의 기본 설정이나 JavaMailSender의 설정으로 제어할 수 있다.
Spring Boot의 JavaMailSender를 사용하고 있다면, 해당 라이브러리가 제공하는 설정을 이용하여 이 문제를 해결할 수 있는데
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
위 코드에서 메일의 Content-Type 헤더와 관련된 설정은 MimeMessageHelper 객체의 setText 메서드를 사용할 때 두 번째 인자로 true를 전달하는 경우에 적용된다. 여기서 true는 HTML 형식의 메일 내용을 나타내며, 해당 내용의 Content-Type 헤더에 올바른 값을 명시해주어야 한다.
해결
아래와 같이 MimeMessageHelper를 생성할 때 Content-Type을 명시적으로 설정해준다.
//코드 일부
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
MimeMessageHelper 메소드의 인자로 'UTF-8'을 명시적으로 설정한 후, 이메일 발송을 테스트 하였더니
코드 수정 후에는 위처럼 메일의 내용이 한글까지 모두 잘 인식되어 원하는대로 기능을 구현할 수 있었다! 👍
아무래도 이메일과 관련된 어플리케이션 설정과 라이브러리들을 처음 사용하다보니 처음 보는 오류들도 많이 마주했고
해결하기까지 꽤나 많은 시간이 소요되었다. 익숙치 않은 만큼 서툴어서 생긴 일이지만 적지 않게 스트레스도 받고 참 힘들었다. 그래도 오류를 해결하며 이메일과 관련된 기능을 처음부터 끝까지 내 손으로 만들었다는게 뿌듯하기도 했다...
댓글