2008-09-30

IMAP 에서 메일목록 가져오기

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

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

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

2008-09-22

받은 메일에서 보낸이,제목에 대한 디코딩

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

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

  1. =
  2. EUC-KR
  3. B
  4. udrB2Lq5
  5. =

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

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

최종적으로 간단하게 아래와 같은 코드로 정리할 수 있겠다.
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 라는 함수가 알아서 변경해주는군요.
이제, 삽질할 필요 없겠습니다. 그래도, 캐릭터셋은 여전히 변경해주셔야 합니다. ^^

2008-09-04

window.open() 에서 두번째 인자...

며칠동안 여러 자바스크립트 라이브러리를 이용해서 다이얼로그 박스를 만들어서 처리하려고 하였으나, 만족으러운 결과를 얻지 못해서, 결국, 새로운 윈도우를 띄우기로 결정했다.

브라우저에서 새로운 창을 띄우려면 window.open(URL, Name, Options) 함수를 이용해야 하는데, 여기에서 두번째 인자인 Name 을 쓸 때 주의할 것이 있다. 주의해야 할 점은 Name 을 쓸 때 절대로 공백문자를 넣어서는 안된다는 것이다. 파이어폭스, 크롬 등에서는 문제가 없으나 IE에서는 Name 에 공백문자가 들어가면 윈도우가 나타나지 않기 때문이다. 이것은 IE의 버그는 아니고, 표준을 잘 지키는 것뿐이다.

http://developer.mozilla.org/index.php?title=En/DOM/Window.open&highlight=window.open 에 가서 확인해보면 알 수 있다.


위에서 보이듯이 This string parameter should not contain any blank space. 라는 구문이 보이는데, 해석을 해보면 "이 문자열 파라미터는 절대로 공백을 포함해서는 안된다." 라고 명시되어 있다.

그러므로, 앞으로는 반드시 window.open() 함수의 두번째 인자에 공백이 들어가지 않도록 주의해서 사용해야 한다. 이것이 오늘의 핵심 내용이다. 아마도 많은 사람들이 알고 있을거라 생각하지만, 혹시라도 모르는 사람이 나처럼 헛고생하지 않기를 바랄뿐이다.