글
1. 메일 확인
2. 메일 조회
3. 메일 지우기
4. 메일 보내기
mail_detail.php
<? // 필요한 서브 함수입니다.. 아래 메인의 소스를 보시고 이 함수 내용은 마지막에 보세요. // 메일의 구조를 분석하는 함수 function checkstruct($mailstream, $MSG_NO) { // 메일 구조 분석 $struct = imap_fetchstructure($mailstream, $MSG_NO); // 메일의 구조를 객체로 리턴해 줍니다. 인자는 메일스트림과 해당 메일번호입니다. $type = $struct->subtype; /* 메일의 타입을 얻습니다. 크게 PLAIN, MIXED, ALTERNATIVE, RELATED 이렇게 있읍 니다.. ( 더 있는지도 모르죠... ^ ^) PLAIN : 그냥 텍스트 메일이죠.. 이건 그냥 출력만 해주면 됩니다.. MIXED : 첨부파일이 있는 메일이란 건데... 이게 가장 복잡하죠.. 아래 switch문에 switch 문에서 설명하죠. ALTERNATIVE : HTML 형식으로 메일을 보내면 이게 됩니다. RELATED : HTML 형식으로 보낼때 보면 메일안에 이미지를 삽입해서 보낼 수 있습니다. 그 경우에 해당됩니다. 아래에서 자세히 보죠.. */ switch($type) { case "PLAIN": // 일반텍스트 메일 echo str_replace("\n", "<br>", imap_fetchbody($mailstream, $MSG_NO, "1")); // 그냥 본문을 얻어서 출력해 주면 됩니다. // 본문을 얻는 방법은 위처럼 imap_fetchbody 함수를 사용하는데.. 여기서 세번째 // 인자가 "1" 이렇게 되어 있죠. 이것은 몌일의 body가 boundary라는 것으로 구분 // 되어 여러개가 올 수 있는데 그 중 첫번째 것이란 겁니다.. 당연 텍스트 메일은 // body가 하나밖에 없기에 그냥 무조건 위처럼 하면 됩니다. break; case "MIXED": // 첨부파일 있는 메일 /* 이게 좀 복잡하죠. 먼저 위에서 말했듯 첨부파일이 있는 것은 body가 여러개입니다. 즉 첨부파일이 두개인 text 메일일 경우 body는 세개로 나뉘죠.. 이 세개의 body를 각각 표현하는 것이 되겠습니다. */ for($i=0;$i<count($struct->parts);$i++) { // parts라는 속성에는 boundary로 구분된 body의 개체들이 들어 가게 됩니다. // 이것의 갯수를 알아서 루프를 돌리는 거죠. $part = $struct->parts[$i]; $param = $part->parameters[0]; $file_name = Decode($param->value); // 첨부파일일 경우 파일명 Decode 함수는 어제 말한 제가 만든 거죠... $mime = $part->subtype; // MIME 타입 혹은 메일의 종류가 리턴됩니다. $encode = $part->encoding; // encoding /* 아래 부분을 보면 $mime 이란 변수에 ALTERNATIVE 라는 것이 올수 있게 되어 있습니다.. 즉 OUTLOOK에서 HTML 형식으로 첨부파일을 보내면 대략 -메세지 -첨부파일1 -첨부파일2 -첨부파일3 이렇게 나뉘고 다시 메세지는 ---PLAN ---HTML 이렇게 나뉘게 됩니다.. 이경우 메세지에 해당하는 부분이 ALTERNATIVE인 거죠.. */ if($mime == "ALTERNATIVE") { $val = imap_fetchbody($mailstream, $MSG_NO, (string)($numpart+1)); // 해당 part의 번호로 body에서 그 부분만 빼옵니다. 그리곤 이것을 // 화면에 출력하죠.. 아래 함수로.. 이것은 제가 만든 건데.. 나중에 설명하죠. printOutLook($val); } else { printbody($mailstream, $MSG_NO, $i, $encode, $mime, $file_name); // 첨부파일일 경우 printbody함수를 호출합니다.. 이건 바로 밑에 있는 함수인 // 데 거기서 설명하죠.. } } break; case "ALTERNATIVE": // outlook html for($i=0;$i<count($struct->parts);$i++) { $part = $struct->parts[$i]; $param = $part->parameters[0]; $file_name = Decode($param->value); // 첨부파일일 경우 파일명 $mime = $part->subtype; $encode = $part->encoding; if($mime == "HTML") { printbody($mailstream, $MSG_NO, $i, $encode, $mime, $file_name); } } break; case "RELATED": // outlook 본문에 이미지 삽입 for($i=0;$i<count($struct->parts);$i++) { $part = $struct->parts[$i]; $param = $part->parameters[0]; $file_name = Decode($param->value); // 첨부파일일 경우 파일명 $mime = $part->subtype; // MIME 타입 $encode = $part->encoding; // encoding if($mime == "ALTERNATIVE") { $val = imap_fetchbody($mailstream, $MSG_NO, (string)($numpart+1)); printOutLook($val); } else { printbody($mailstream, $MSG_NO, $i, $encode, $mime, $file_name); } } break; } } // 메일 내용을 출력하는 함수 function printbody($mailstream, $MSG_NO, $numpart, $encode, $mime, $file_name) { $val = imap_fetchbody($mailstream, $MSG_NO, (string)($numpart+1)); // 먼저 해당 part의 본문을 받아 옵니다. // 그리고 인자값으로 넘어온 $encode 에 의해 먼저 본문을 decoding 해줍니다. switch($encode) { case 0: // 7bit case 1: // 8bit $val = imap_base64(imap_binary(imap_qprint(imap_8bit($val)))); break; case 2: // binary $val = imap_base64(imap_binary($val)); break; case 3: // base64 $val = imap_base64($val); break; case 4: // quoted-print $val = imap_base64(imap_binary(imap_qprint($val))); break; case 5: // other echo "알수없는 Encoding 방식."; exit; } // mime type 에 따라 출력합니다. switch($mime) { case "PLAIN": echo str_replace("\n", "<br>", $val); break; case "HTML": echo $val; break; default: // 첨부파일인 경우이므로 다운로드 할 수 있게 링크를 걸어 줍니다. echo "<br>첨부: <a href="mail_down.php? MSG_NO=" . $MSG_NO . "&PART_NO= " . $numpart . "" >" . $file_name . "</a>"; } } // ---------------------- // 메인 시작 // include 선언 // ---------------------- include ("mail_lib.php"); // 라이브러리 파일엔 지난번 강좌에 있던 Decode라는 함수가 있죠. ?> <html> <body> <? $box = $BOX; // 메일 박스명 if($box == "") $box = "INBOX"; switch($box) { case "INBOX": $box_name="받은 편지함"; break; case "sent": $box_name="보낸 편지함"; break; } ?> <body bgcolor="#FFFFFF" leftmargin=5 topmargin=20 marginwidth=5 marginheight=20> <table width="610" border=0 bgcolor=#527900 cellpadding=4 cellspacing=0> <tr> <td align=center width="25" bgcolor="#334600"> <font face="Wingdings" size="4" color="#FFCC33">.</font></td> <td width=95%> <font size="3" color="#FFFFFF"><b>편지읽기</b></font> </td> </tr> </table> <table width=610 border=0 cellpadding=4 cellspacing=0 bgcolor=#D8D8D8> <tr> <td class="tk1" width=40%></td> <td align="right" class="tk1" width=60%> <a href="mail_cmd.php?CMD=del&NO[]=<?echo $MSG_NO;?>">삭제</a> [<a href="mail_list.php?BOX=<?echo $box;?>">목록</a>] </td> </tr> </table> <? $login = "userid"; $pass = "pwd"; $C_DOMAIN = "hagopa.co.kr"; $mailstream = imap_open("{" . $C_DOMAIN . ":143}" . $box, $login, $pass); if ($mailstream == 0) { echo "Error! "; exit; } // 메일 헤더 분석 $head = imap_header($mailstream,$MSG_NO); $head->Unseen = "U"; $date = date("Y년 m월 d일 H시 i분", $head->udate); $subject = $head->Subject; $subject = Decode($subject); $from_obj = $head->from[0]; $from_name = $from_obj->personal; $from_addr = substr($from_obj->mailbox . "@" . strtolower($from_obj->host), 0, 30); if($from_name == "") $from_name = $from_addr; $from_name = Decode($from_name); // 여기까지는 지난번 강좌에서 한 것과 동일하죠.. 설명 안하겠습니다. ?> <table width=610 border=0 cellpadding=2 cellspacing=0 bordercolor=#E8E8E8> <tr> <td class="tk1" align="center" bgcolor="#EEEEEE" width="100">보낸날짜</td> <td class="tk1" bgcolor="#F7F7F7"><?echo $date;?></td> </tr> <tr> <td class="tk1" align="center" bgcolor="#EEEEEE">보낸이</td> <td class="tk1" bgcolor="#F7F7F7"><?echo "<a href=mailto:$from_addr>$from_name</a> ";?></td> </tr> <tr> <td class="tk1" align="center" bgcolor="#EEEEEE">제 목</td> <td class="tk1" bgcolor="#F7F7F7"><?echo $subject;?></td> </tr> </table> <table width="610" border="0" cellpadding="4"> <tr> <td class="tk1"> <? checkstruct($mailstream, $MSG_NO); imap_close($mailstream); /* 위의 두개의 함수가 이번 강좌의 하이라이트죠... 하나 하나 설명합니다. 설명은 위에 해당 함수 선언된 곳을 보세요. */ ?> </td> </tr> </table> <table width=610 border=0 cellpadding=4 cellspacing=0 bgcolor=#D8D8D8> <tr> <td class="tk1" width=40%></td> <td align="right" class="tk1" width=60%> <a href="mail_cmd.php?BOX=<?echo $box;?>&CMD=del&NO[]=<?echo $MSG_NO;?>">삭제</a> [<a href="mail_list.php?BOX=<?echo $box;?>">목록</a>] </td> </tr> </table> <br> </body> </html> |
'Programming' 카테고리의 다른 글
웹메일을 구현하자! - 메일 삭제 (0) | 2006.05.24 |
---|---|
웹메일을 구현하자! - 메일 조회 #2 (0) | 2006.05.24 |
웹메일을 구현하자! - 메일확인 (0) | 2006.05.24 |
웹메일을 구현하자! (0) | 2006.05.24 |
PHP를 이용한 다중 연결 소켓 통신 (3) (0) | 2006.05.24 |
RECENT COMMENT