본문 바로가기
오류-해결

[Java] JavaMailSender 이메일 한글 인식 오류 원인 및 해결

by hunbal 2023. 8. 31.
SMALL

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'을 명시적으로 설정한 후, 이메일 발송을 테스트 하였더니

 

수정 후 발송된 이메일

 

코드 수정 후에는 위처럼 메일의 내용이 한글까지 모두 잘 인식되어 원하는대로 기능을 구현할 수 있었다! 👍

 

 

아무래도 이메일과 관련된 어플리케이션 설정과 라이브러리들을 처음 사용하다보니 처음 보는 오류들도 많이 마주했고

해결하기까지 꽤나 많은 시간이 소요되었다. 익숙치 않은 만큼 서툴어서 생긴 일이지만 적지 않게 스트레스도 받고 참 힘들었다. 그래도 오류를 해결하며 이메일과 관련된 기능을 처음부터 끝까지 내 손으로 만들었다는게 뿌듯하기도 했다...

 

 

댓글