Web Programming >> PHP Programming
|
[목차] |
제29장 IMAP을 이용한 웹메일 프로그래밍
2. 메일 리스트 출력하기
메일 박스 접근절차는 다음과 같다.
imap_open 함수의 사용자 아이디 입력 부분을 "아이디@도메인"과 같이 적어주어야한다.
가. IMAP 스트림 생성 파일명 : imap_open.html(IMAP) <? $stream = imap_open("{localhost:143}Inbox","jklee","xxxxx"); ?> 파일명 : imap_open.html(POP3) <? $stream = imap_open("{localhost/pop3:110}Inbox","jklee","xxxxx"); ?>
imap_open함수가 성공되었다면 $stream변수는 imap_close 함수로 스트림을 닫기 전에 모든 IMAP함수에서 사용된다. 로컬 호스트는 IMAP을 통해 인증을 받을 서버를 지정하며 다른 곳에 메일 박스가 존재할 경우는 해당 서버의 IP나 도메인을 적어준다. 또한 Inbox는 메일을 읽어들일 메일박스를 적어주면 기본 메일함 외에 생성된 메일 박스가 존재한다면 해당 이름을 적어준다. 143번은 IMAP이 사용하는 /etc/service에 정의된 공인된 포트 번호를 적어주어야 한다. POP3나 NNTP를 사용할 경우는 해당 포트 번호를 적어주어야 한다. jklee는 인증 받을 서버에 존재하는 아이디이며, xxxxx는 계정의 패스워드를 적어주면 된다.
나. 메일 박스 정보 읽어오기 파일명 : imap_open2.html <? $stream = imap_open("{localhost:143}Inbox","jklee","xxxxx"); $object = imap_mailboxmsginfo($stream);
echo ("메일 박스의 메일 갯수 : $object->Nmsgs <br>\n"); echo ("최근에 수신된 메일 갯수 : $object->Recent <br>\n"); echo ("읽지 않은 메일 갯수 : $object->Unread <br>\n"); echo ("메일박스의 사이즈 : $object->Size <br>\n");
imap_close($stream); ?> imap_mailboxmsginfo는 imap_open에서 지정한 메일 박스의 정보를 읽어 오브젝트 형태로 돌려주며 여러 오브젝트 중 위의 정보를 주로 사용한다. 위의 아이디로 메일을 보낸 후 imap_open2.html을 브라우저에서 확인하면 아래와 같은 화면이 보일 것이다.
최근에 수신된 메일 갯수 : 1 읽지 않은 메일 갯수 : 1 메일박스의 사이즈 : 1514
다. 메일 리스트 출력 메일박스에 접근하여 메일의 갯수를 파악했으므로 반복문을 사용하여 각 메일메시지의 정보를 읽어들여 메일리스트를 출력할 수 있다. 파일명 : imap_list.html <? $stream = imap_open("{localhost:143}Inbox","jklee","xxxxx"); $object = imap_mailboxmsginfo($stream);
for($msgno=$object->Nmsgs; $msgno > 0; $msgno--) { $h_info = imap_headerinfo($stream, $msgno);
echo("메일번호 : $msgno <br>\n"); echo("<ul>메일이 도착한 날짜정보 : $h_info->date <br>\n"); echo("메일의 제목 : $h_info->subject <br>\n"); echo("받는 사람 : $h_info->toaddress <br>\n"); echo("보낸 사람 : $h_info->fromaddress <br>\n"); echo("참조 : $h_info->ccaddress <br>\n"); echo("숨은참조 : $h_info->bccaddress <br>\n"); echo("최근 메일인지 안닌지를 판별 : $h_info->Recent <br>\n"); echo("읽은 메일인지 안닌지를 판별 : $h_info->Unseen <br>\n"); echo("답장한 메일인지 아닌지를 판별 : $h_info->Answered <br>\n"); echo("삭제표시된 메일인지 안닌지를 판별 : $h_info->Deleted <br></ul>\n"); } imap_close($stream); ?> 메일이 도착한 순서대로 1번부터 증가되는 번호를 가지므로 최근에 도착한 메일을 가장 상단에 표시하기 위해 $msgno를 감소시키며 반복문을 실행한다. imap_headerinfo는 IMAP스트림과 메일 메시지 번호를 인자로 메일의 정보를 읽어 오브젝트 형태로 돌려주며 위의 정보를 사용할 수 있다. 위와 같이 반복문안에 $h_info로 읽어들인 정보를 출력문을 사용하여 아래와 같은 메일리스트를 만들수 있다. 파일명 : imap_list2.html <html> <head> <title>웹메일</title> </head> <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"> <? $stream = imap_open("{localhost:143}Inbox","jklee","xxxxx"); $object_info = imap_mailboxmsginfo($stream); $mbox_record =$object_info->Nmsgs; ?> <FORM method=post> <TABLE cellSpacing=0 cellPadding=0 width="600" border=0> <TR> <TD width="600"> <TABLE cellSpacing="0" width="600" border="1" bordercolordark="white" bordercolorlight="black"> <TR height=23> <TD align=middle width=40><font size="2">선택</font></TD> <TD align=middle width=180><font size="2">보낸이 </font></TD> <TD align=middle><font size="2">제 목 </font></TD> <TD align=middle width=150><font size="2">날짜 </font></TD> <? for($msgno=$mbox_record; $msgno > 0; $msgno--) { $object = imap_header($stream, $msgno); ?> <TR> <TD align=middle><INPUT type=checkbox value=27 name=check[]></TD> <TD align=left>
<?echo $object->fromaddress;?></TD> <TD align=left> <?echo $object->subject;?></TD> <TD align=middle><?echo $object->date;?></TD> </TR> <? } ?>
</TABLE></TD></TR></TABLE></form> <p> </p> </body> <? imap_close($stream); ?> </html>
잘 만들어진 것 같지만 한글로 작성된 메일제목이 깨져서 출력된다. 이것은 아스키코드로 메일 제목이 만들어지지 않고 MiME메시지 헤더 확장을 통하여 메일 제목이 작성된 경우다.(아웃룩 등 대부분의 MTA가 MIME을 이용하여 발송하고 있다.) 이 경우 IMAP함수 중 imap_mime_header_decord함수를 이용하여 문제점을 해결할 수 있다.
파일명 : imap_list3.html <html> <head> <title>웹메일</title> </head> <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red"> <? $stream = imap_open("{localhost:143}Inbox","jklee","xxxxx"); $object_info = imap_mailboxmsginfo($stream); $mbox_record =$object_info->Nmsgs; ?> <FORM method=post> <TABLE cellSpacing=0 cellPadding=0 width="500" border=0> <TR> <TD width="500"> <TABLE cellSpacing="0" width="500" border="1" bordercolordark="white" bordercolorlight="black"> <TR height=23> <TD align=middle width=40><font size="2">선택</font></TD> <TD align=middle width=180><font size="2">보낸이 </font></TD> <TD align=middle><font size="2">제 목 </font></TD> <TD align=middle width=150><font size="2">날짜 </font></TD> <? for($msgno=$mbox_record; $msgno > 0; $msgno--) { $object = imap_header($stream, $msgno); ?> <TR> <TD align=middle><INPUT type=checkbox value=27 name=check[]></TD> <TD align=left> <?echo $object->fromaddress;?></TD> <TD align=left> <? $mbox_subject = imap_mime_header_decode($object->subject); echo $mbox_subject[0]->text; ?></TD> <TD align=middle><?echo $object->date;?></TD> </TR> <? } ?>
</TABLE></TD></TR></TABLE></form> <p> </p> </body> <? imap_close($stream); ?> </html>
라. IMAP 스트림 닫기
<? imap_close($stream); ?> imap_open함수에 의해 오픈된 스트림을 닫아준다. imap_open, imap_close를 제대로 적어주지 않는다면 어느 순간 오픈됐 있는 스트림이 초과돼, 접속에 무넺가 생길 수 있으니 반드시 짝을 맞추어 코딩할 수 있도록 한다. 이상과 같이 IMAP함수를 이용하여 메일 박스로부터 메일을 읽어들여 메일 리스트를 출력하는 방법을 알아보았다. 이외에도 메일박스간 메일의 복사나 이동, 제목이나 받은 날짜 순으로의 소팅, 메일 리스트 분할 출력 등 다양한 기능을 간단히 추가할 수 있다.
|
[목차] |