플로우를 개발하면서 메일과 관련된 기능을 개발하던 중, 서버에서 메일을 발송하는데 발신자 이름이 한글로 안나오고 글자가 깨지는 현상을 발견했습니다.
메일과 관련된 공통 지식인 것 같아서 블로그에 올려봅니다.
증상은 위와 같이 발신자 이름이 한글로 깨지는 문제가 발생 했는데,
발신자 이름은 "협업툴 플로우" 라고 보냈습니다.
메일 서비스는 AWS SES를 사용하고 있었는데, 아무리 인코딩을 해서 보내도 계속 깨지는 문제가 있어서,
무엇이 문제인지 찾아보다 AWS에 문의를 넣은 적이 있습니다.
AWS 측 답변
You would need to use MIME encoded-word syntax to use non-ASCII characters in the Source text. There's some additional discussion in the SES API reference:
In all cases, the email address must be 7-bit ASCII. If the text must contain any other characters, then you must use MIME encoded-word syntax (RFC 2047) instead of a literal string. MIME encoded-word syntax uses the following form: =?charset?encoding?encoded-text?=. For more information, see RFC 2047.
Source 부분에 ASCII characters 외의 다른 문자를 사용하려면,
이메일에서 사용하는 Media-Type(MIME)라는 타입으로 변환해서 바꿔주어야 한다.
MIME Syntax
=?charset?encoding?encoded-text?=
- charset : UTF-8 같은 인코딩 방식
- encoding : B 타입과 Q 타입이 있음. B는 Base64인것 같고, Q는 quoted-printable 의 약자라고 함. RFC 1342 문서 참고
- encoded-text : 내용
⇒ 예시 : =?utf-8?B?협업툴 플로우?=
적용 코드
public static String getSesMailFrom(String senderAddress, String SenderName) {
String senderEncodeBase64 = Base64.getEncoder().encodeToString(SenderName.getBytes());
String senderMimeSyntax = "=?UTF-8?B?" + senderEncodeBase64 + "?=";
return senderMimeSyntax + " <" + senderAddress + ">";
}
코드를 해석하자면, 저는 "협업툴 플로우 <info@flow.team>" 이라는 형식으로 발신자를 보내고 싶었습니다.
저렇게 이메일을 보내면 발신자 이름엔 "협업툴 플로우" 라고 나오고 실제 발신자 주소는 " info@flow.team"로 나오게 되죠.
그래서 "협업툴 플로우"라는 String을 자바에서 Base64.getEncoder().encodeToString(SenderName.getBytes());
로 인코딩을 합니다.
그 후 Mime 문법으로 "=?UTF-8?B?" + 인코딩한 문자 + "?=" 로 감싸줍니다.
그러면 "=?UTF-8?B?협업툴 플로우?=" 가 되겠죠?
마지막으로 뒤에 이메일 주소를 붙이면 완성입니다.
"=?UTF-8?B?협업툴 플로우?= < info@flow.team>"
결과
'개발 아카이브 > AWS, Cloud, Server' 카테고리의 다른 글
AWS Lightsail - 라이트세일을 소개합니다. (0) | 2022.04.24 |
---|