웹메일서버를 만들고 있습니다. OS는 Debian Linux 기반에 Postfix, Dovecot, MySQL 등을 사용하고 있습니다. 웹은 PHP로 개발중입니다. MySQL 로 도메인과 계정 연동도 끝났고, 스팸 및 바이러스도 걸러집니다. 남은 부분은 PHP로 웹UI 를 개발하는 것입니다.

간단하게 메일 목록을 가져오는 부분을 구현하였고, 메시지를 보여주는 부분을 구현중입니다. 메일목록을 가져오기 위해서 imap_fetch_overview 함수를 사용하고 있는데, 당장은 목록을 보여주는데 문제는 없지만, 더 많은 정보를 보여주고자 할때, 정보 부족으로 보여줄수 없게 됩니다. 예를 들어서 보낸사람의 이메일 주소를 표시하고 싶어도 그렇게 할 수가 없습니다. 그래서, 더 많은 정보를 가져올 수 있는 함수를 찾아보니, imap_headerinfo 가 있더군요.

일단, 메시지 보여주는 부분을 구현하고, 목록 부분도 imap_headerinfo 를 이용해서 다시 구현하려고 합니다. 메시지를 보여주는 부분에서도 처리해야 할 일들이 많군요. 처음에 개발하려고 할때는 만만하게 봤었는데, 뒤져봐야할 문서들이 많습니다. ^^ 한큐에 설치할 수 있는 설치프로그램까지 만들었습니다. 어느정도 완성되려면 1,2달 정도 걸릴 듯 합니다.

PHP에서 imap_fetch_overview 함수를 통해서 헤더를 가져와서 제목과 보낸이를 출력해보면 =?EUC-KR?B?udrB2Lq5?= 와 비슷한 형태로 출력되버린다. 이것을 정상적으로 출력하려면 2번의 디코딩 과정이 필요하다. 화면은 UTF-8로 되어 있다고 가정하자.

우선 이 문나열을 분석해보자. ?를 기준으로 해서 단어를 나누어 보면,

=
EUC-KR
B
udrB2Lq5
=

로 나누어지는 것을 확인 할 수 있다.
여기에서 두번째 항목인 EUC-KR 은 캐릭터셋을 의미한다.
또한, 세번째 항목인 B 는 Base64 로 인코딩 되어 있음을 의미한다.
그리고, 네번째 항목인 udrB2Lq5 이 실제내용 이다.

즉, 이것을 화면에 표시하려면, 우선 Base64로 디코딩을 한 후에, UTF-8로 캐릭터셋을 변경하면 된다.
base64로 디코딩할 수 있는 함수는 imap_base64() 이며,
캐릭터셋을 변경할수 있는 함수는 mb_convert_encoding 과 iconv 가 있다.

최종적으로 간단하게 아래와 같은 코드로 정리할 수 있겠다.
mb_convert_encoding(imap_base64("udrB2Lq5"), "UTF-8", "EUC-KR");

관련글 : http://forums.mozilla.or.kr/viewtopic.php?f=3&t=1462

추가 :
PHP에는 아주 유용한 함수가 있군요. imap_mime_header_decode 라는 함수가 알아서 변경해줍니다.
이제, 삽질할 필요 없겠습니다. 그래도, 캐릭터셋은 여전히 변경해주셔야 합니다. ^^

+ Recent posts