Apache James 와 한글
Apache James 에서 한글이 포함된 이메일을 정상적으로 수신하기 위해서는 시스템 환경변수 중 file.encoding 을 "iso-8859-1" 로 설정해야 한다.
1. 가장 확실한 방법
1.1. 설정방법
conf/wrapper.conf 파일을 열어 "wrapper.java.additional" 을 찾아, 가장 마지막 부분에 다음과 같은 내용을 추가한다.
wrapper.java.additional.15=-Dfile.encoding=ISO-8859-1
15는 일련번호이므로, 이미 붙여진 번호의 마지막에서 1을 더하여 붙인다.
1.2. 확인방법
Apache James 를 기동하고, 다음의 명령어로 프로세스를 검사했을 때, Apache James 프로세스가 보여야 한다.
ps -ef | grep james | grep ISO-8859-1
1.3. locale을 변경하는 방법을 사용하지 않는 이유
- 설정이 적용되었는지 확인하기 힘들다(WAS 와 달리 손쉽게 이런 설정을 확인할 수 있는 방법이 없다).
- Apache James 에서 제공하는 기동스크립트만으로 해결된다.
1.4. us-ascii 가 아닌 이유
us-ascii 은 7bit 인코딩이어서 euc-kr 이나 utf-8 과 같은 인코딩과 호환되지 않는다.
1.5. Apache James 3 에서 삽질의 기록
Apache James 2 에서는 이메일 서버를 기동시키기 전에 다음과 같은 환경변수를 설정하는 방법으로 해결할 수 있었다.
export PHOENIX_JVM_OPTS="-Dfile.encoding=ISO-8859-1"
Apache James 3 에서는 위와 같은 방법을 찾을 수가 없었지만, 앞에서 소개한 더 우아한 방법을 찾을 수 있었다.
2. 원인
Apache James 에서 이메일을 수신하는 프로그램 코드에서 charset 을 지정하지 않고, 시스템 기본값(file.encoding)을 사용하기 때문이다.
한글이 무조건 깨지는 것은 아니고, 시스템 기본값(file.encoding)이 utf-8 인데 이메일에 euc-kr 로 인코딩된 문자열이 포함되어 있거나 반대의 경우이다.
Mime 표준은 이메일 헤더에서는 us-ascii 를 넘는 범위의 문자열이 포함된 경우, 약속된 방식으로 이를 us-ascii 범위내의 문자로 변경하고, 그 방법을 포함하도록 하고 있다.
이메일 본문의 경우 Content-Transfer-Encoding 헤더를 사용하여 인코딩정보와 함께 us-ascii 범위 외의 문자를 포함시킬 수 있다.
Apache James 를 euc-kr 혹은 utf-8 따위로 실행한 경우에 발생하는 한글 문제는 대부분 이메일을 발송하는 쪽에서 표준을 준수하지 않았을 가능성이 높기는 하다.
spam 일 가능성이 높지만, 그렇지 않은 경우도 많다.