{"id":28,"date":"2014-03-22T17:11:35","date_gmt":"2014-03-22T09:11:35","guid":{"rendered":"http:\/\/blog.qiaogen.com\/?p=28"},"modified":"2014-03-22T17:11:35","modified_gmt":"2014-03-22T09:11:35","slug":"php%e8%ae%bf%e9%97%aegmail-imap%e9%82%ae%e7%ae%b1-%e5%ae%8c%e7%be%8e%e6%98%be%e7%a4%ba%e4%b8%ad%e6%96%87%e7%9b%ae%e5%bd%95%e5%90%8d%e4%b8%8e%e9%82%ae%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/www.sangqiao.com\/blog\/archives\/28","title":{"rendered":"php\u8bbf\u95eegmail imap\u90ae\u7bb1 (\u5b8c\u7f8e\u663e\u793a\u4e2d\u6587\u76ee\u5f55\u540d\u4e0e\u90ae\u4ef6)"},"content":{"rendered":"<p>\u6839\u636e\u5b98\u65b9\u6587\u6863\u4ee5\u53ca\u4e00\u4e9b\u7f51\u53cb\u7684\u5206\u4eab\uff0c\u6574\u7406\u7f16\u5199\u4e86IMAP\u65b9\u5f0f\u8bbf\u95eeGmail\u90ae\u7bb1\u7684\u4ee3\u7801\u3002\u4ee5\u4fbf\u4e8e\u5c06\u6765\u4f1a\u5728\u9879\u76ee\u4e2d\u4f7f\u7528\u3002<br \/>\n<code><br \/>\n<?php\n\/*\n * PHP\u8bbf\u95eegmail IMAP\u90ae\u7bb1\u7684\u5b8c\u6210\u4ee3\u7801\u3002\n* \u793a\u4f8b1\uff1a\u5217\u51fa\u90ae\u7bb1\u7684\u5b50\u76ee\u5f55\u540d\u79f0\n* \u793a\u4f8b2\uff1a\u53d6\u51fa\u6536\u4ef6\u7bb1\uff08INBOX\uff09\u4e0b\u6240\u6709\u90ae\u4ef6\u3002\u53ef\u4ee5\u6b63\u786e\u663e\u793a\u4e2d\u6587\u5b57\u7b26\u3002\n*\n* \u6574\u7406\/\u7f16\u5199\uff1awww.tudaxia.com, 2014\u5e741\u6708\n* \u611f\u8c22\u4e92\u8054\u7f51\u5206\u4eab\u7ed9\u6211\u4eec\u7684\u4e00\u5207\u77e5\u8bc6\uff01\n*\/\n \n\/\/ gmail\u90ae\u7bb1\u5730\u5740\n\/\/\uff08\u6ce8\uff1a\u4e5f\u53ef\u4ee5\u662f\u6258\u7ba1\u5728Google APP\u4e0a\u7684\u8d26\u53f7\uff0c\u5b9e\u9645\u4e5f\u662fgmail\u670d\u52a1\u5668\u8d1f\u8d23\u63d0\u4f9b\u90ae\u4ef6\u529f\u80fd\uff09\n$gmail_account = 'your_name@gmail.com';\n\/\/ gmail\u90ae\u7bb1\u5bc6\u7801\n$gmail_password = 'your_gmail_password';\n \n\/\/ gmail imap\u90ae\u4ef6\u670d\u52a1\u5668\u5730\u5740\n$gmail_imap_host = 'imap.googlemail.com';\n\/\/ imap\u670d\u52a1\u5668\u7aef\u53e3\n$gmail_imap_post = 993;\n\/\/ \u6839\u636e\u4ee5\u4e0a\u53c2\u6570\uff0c\u62fc\u51d1\u51faimap\u670d\u52a1\u5668\u7684\u5b8c\u6574\u5730\u5740\n$gmail_imap_server = '{'.$gmail_imap_host.':'.$gmail_imap_post.'\/novalidate-cert\/imap\/ssl}';\n \n\/*\n===========================\n\u793a\u4f8b1\uff1agmail\u7684\u4e2d\u6587\u76ee\u5f55\u7f16\u7801\u4e0e\u89e3\u7801\n===========================\n(Gmail\u5185\u90e8\u4f7f\u7528UTF7-IMAP\u7f16\u7801\uff0c\u6240\u4ee5\u5982\u679c\u76f4\u63a5\u663e\u793a\u4f1a\u4e71\u7801\uff0c\u9700\u8981\u8fdb\u884c\u8f6c\u7801\u624d\u80fd\u6b63\u786e\u663e\u793a)\n *\n *\/\n$imap_code = \"&#038;V4NXPpCuTvY-\";\necho \"imap_code: $imap_code\\n\";\n$hanzi = mb_convert_encoding($imap_code, \"UTF-8\", \"UTF7-IMAP\");\necho \"\u4e2d\u6587\u540d\u79f0 : $hanzi\\n\";\n \n$encode=  mb_convert_encoding($hanzi, \"UTF7-IMAP\",\"UTF-8\");\necho \"encode : $encode\\n\";\n \n\/*\n===========================\n\/\/ \u793a\u4f8b2\uff1a \u5217\u51fa\u6240\u6709\u7684\u90ae\u4ef6Label\uff08\u76f8\u5f53\u4e8e\u90ae\u7bb1\u7684\u5b50\u76ee\u5f55\uff09\n===========================\n*\n*\/\nif (($mbox = @imap_open($gmail_imap_server, $gmail_account, $gmail_password)) == true) {\n    $folders = imap_list($mbox, $gmail_imap_server, \"*\");\n    foreach ($folders as $folder) {\n        \/\/ Gmail\u90ae\u7bb1\u76ee\u5f55\u91c7\u7528\u7684\u7f16\u7801\u4e3a\"UTF7-IMAP\"\uff0c\u56e0\u6b64\u5982\u679c\u8981\u6b63\u786e\u663e\u793a\u4e2d\u6587\u76ee\u5f55\u540d\u79f0\uff0c\u9700\u8981\u9488\u5bf9\u4e2d\u6587\u76ee\u5f55\u540d\u79f0\u8fdb\u884cUTF-8\u8f6c\u7801\n        \/\/ \uff08\u53cd\u4e4b\uff0c\u5982\u679c\u7ed9\u51fa\u4e2d\u6587\u540d\u5b57\uff0c\u9700\u8981\u8bbf\u95eegmail\u7684\u76ee\u5f55\uff0c\u9700\u8981\u5148\u6267\u884cUTF-8\u5230UTF7-IMAP\u7684\u9006\u5411\u8f6c\u7801\uff09\n        $folder = mb_convert_encoding($folder, \"UTF-8\", \"UTF7-IMAP\");\n        echo $folder . \"\\n\";\n    }\n    \/\/ \u5173\u95edimap\u8fde\u63a5\n    imap_close($mbox);\n}\n \n\/*\n ===========================\n\/\/ \u793a\u4f8b3\uff1a\u67e5\u770b\u6536\u4ef6\u5939\uff08INBOX\uff09\u7684\u6240\u6709\u90ae\u4ef6\n *\n *\/\nif (($mailbox_inbox = @imap_open($gmail_imap_server.\"INBOX\", $gmail_account, $gmail_password)) == true) {\n    echo \"\u5904\u7406INBOX \\n\";\n    scan_mailbox($mailbox_inbox);\n    imap_close($mailbox_inbox);\n}\n \nfunction scan_mailbox($mbox) {\n    \/\/ \u83b7\u53d6\u90ae\u7bb1\u4fe1\u606f\n    $mboxes=imap_mailboxmsginfo($mbox);\n \n    \/\/ \u67e5\u770b\u662f\u5426\u6709\u65b0\u90ae\u4ef6\n    if( $mboxes->Nmsgs != 0 ) {<br \/>\n        for( $mailno=1; $mailno<=$mboxes->Nmsgs; $mailno++ ) {<\/p>\n<p>            \/\/ \u83b7\u53d6\u90ae\u4ef6\u5185\u5bb9<br \/>\n            $email = fetchEmail($mbox, $mailno);<br \/>\n            var_dump($email);<\/p>\n<p>            \/\/ \u5220\u9664\u90ae\u4ef6\uff08\u6253\u4e0a\u5220\u9664\u6807\u8bb0\uff09<br \/>\n            \/\/imap_delete($mbox, $mailno);<br \/>\n        }<br \/>\n        \/\/ \u5220\u9664\u6240\u6709\u6253\u4e0a\u5220\u9664\u6807\u8bb0\u7684\u90ae\u4ef6<br \/>\n        \/\/imap_expunge($mbox);<br \/>\n    }<br \/>\n}<\/p>\n<p>\/**<br \/>\n * \u83b7\u53d6\u4e00\u5c01\u90ae\u4ef6\u7684\u4fe1\u606f<br \/>\n * @param resource $imap_stream<br \/>\n * @param int $msg_number<br \/>\n *\/<br \/>\nfunction fetchEmail($mbox , $mailno) {<br \/>\n    \/\/ \u83b7\u53d6\u90ae\u4ef6\u5185\u5bb9<br \/>\n    $email = array();<br \/>\n    \/\/ \u83b7\u53d6Header\u4fe1\u606f<br \/>\n    $head=imap_header($mbox, $mailno);<\/p>\n<p>    \/\/ \u83b7\u53d6\u90ae\u4ef6\u7684\u53d1\u4ef6\u4eba\u5730\u5740<br \/>\n    $email['from_address']=$head->from[0]->mailbox.'@'.$head->from[0]->host;<\/p>\n<p>    \/\/ \u521d\u59cb\u5316\u90ae\u4ef6\u4e3b\u9898\u53d8\u91cf<br \/>\n    $subject = null;<br \/>\n    if( !empty($head->subject) ) {<br \/>\n        \/\/ \u7f16\u7801\u8f6c\u6362<br \/>\n        $mhead=imap_mime_header_decode($head->subject);<br \/>\n        foreach( $mhead as $key=>$value) {<br \/>\n            if( $value->charset != 'default' ) {<br \/>\n                $subject.=mb_convert_encoding($value->text,'UTF-8',$value->charset);<br \/>\n            }else{<br \/>\n                $subject.=$value->text;<br \/>\n            }<br \/>\n        }<br \/>\n    }<\/p>\n<p>    $email['subject'] = $subject;<\/p>\n<p>    global $charset,$htmlmsg,$plainmsg,$attachments;<br \/>\n    $htmlmsg = $plainmsg = $charset = '';<br \/>\n    $attachments = array();<\/p>\n<p>    \/\/ BODY<br \/>\n    $s = imap_fetchstructure($mbox,$mailno);<br \/>\n    if (!$s->parts)  \/\/ simple<br \/>\n        getpart($mbox,$mailno,$s,0);  \/\/ pass 0 as part-number<\/p>\n<p>    else {  \/\/ multipart: cycle through each part<br \/>\n        foreach ($s->parts as $partno0=>$p)<br \/>\n            getpart($mbox,$mailno,$p,$partno0+1);<br \/>\n    }<\/p>\n<p>    $email['plainmsg'] = $plainmsg;<br \/>\n    $email['htmlmsg'] = $htmlmsg;<br \/>\n    $email['attachments'] = $attachments;<br \/>\n    return $email;<br \/>\n}<\/p>\n<p>function getpart($mbox,$mid,$p,$partno) {<br \/>\n    \/\/ $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple<br \/>\n    global $htmlmsg,$plainmsg,$charset,$attachments;<\/p>\n<p>    \/\/ DECODE DATA<br \/>\n    $data = ($partno)? imap_fetchbody($mbox,$mid,$partno): imap_body($mbox,$mid);  \/\/ simple<\/p>\n<p>    \/\/ PARAMETERS<br \/>\n    \/\/ get all parameters, like charset, filenames of attachments, etc.<br \/>\n    $params = array();<br \/>\n    if ($p->parameters)<br \/>\n        foreach ($p->parameters as $x)<br \/>\n        $params[strtolower($x->attribute)] = $x->value;<br \/>\n    if (isset($p->dparameters))<br \/>\n        foreach ($p->dparameters as $x)<br \/>\n        $params[strtolower($x->attribute)] = $x->value;<\/p>\n<p>    \/\/ ATTACHMENT<br \/>\n    \/\/ Any part with a filename is an attachment,<br \/>\n    \/\/ so an attached text file (type 0) is not mistaken as the message.<br \/>\n    if (isset($params['filename']) || isset($params['name'])) {<br \/>\n        \/\/ filename may be given as 'Filename' or 'Name' or both<br \/>\n        $filename = ($params['filename'])? $params['filename'] : $params['name'];<br \/>\n        \/\/ filename may be encoded, so see imap_mime_header_decode()<br \/>\n        $attachments[$filename] = $data;  \/\/ this is a problem if two files have same name<br \/>\n    }<\/p>\n<p>    \/\/ TEXT<br \/>\n    if( $p->type==0 && !empty($data) ) {<br \/>\n        $charset = $params['charset'];<br \/>\n        $encoding=$p->encoding;<\/p>\n<p>        \/\/ \u6839\u636eencoding\u53c2\u6570\uff0c\u8fdb\u884c\u8f6c\u7801<br \/>\n        switch( $encoding ) {<br \/>\n            case 0 :<br \/>\n                $data=mb_convert_encoding($data, \"UTF-8\", $charset);<br \/>\n                break;<br \/>\n            case 1 :<br \/>\n                $encode_data=imap_8bit($data);<br \/>\n                $encode_data=imap_qprint($encode_data);<br \/>\n                $data=mb_convert_encoding($encode_data, \"UTF-8\", $charset);<br \/>\n                break;<br \/>\n            case 3 :<br \/>\n                $encode_data=imap_base64($data);<br \/>\n                $data=mb_convert_encoding($encode_data, \"UTF-8\", $charset);<br \/>\n                break;<br \/>\n            case 4 :<br \/>\n                $encode_data=imap_qprint($data);<br \/>\n                $data=mb_convert_encoding($encode_data, 'UTF-8', $charset);<br \/>\n                break;<br \/>\n            case 2 :<br \/>\n            case 5 :<br \/>\n            default:<br \/>\n                \/\/ \u8f6c\u7801\u5931\u8d25<br \/>\n                break;<br \/>\n        }<\/p>\n<p>        if (strtolower($p->subtype)=='plain') {<br \/>\n            $plainmsg .= trim($data);<\/p>\n<p>        } else {<br \/>\n            $htmlmsg .= $data;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/\/ EMBEDDED MESSAGE<br \/>\n    \/\/ Many bounce notifications embed the original message as type 2,<br \/>\n    \/\/ but AOL uses type 1 (multipart), which is not handled here.<br \/>\n    \/\/ There are no PHP functions to parse embedded messages,<br \/>\n    \/\/ so this just appends the raw source to the main message.<br \/>\n    if ($p->type==2 && $data) {<br \/>\n        $plainmsg .= $data;<br \/>\n    }<\/p>\n<p>    \/\/ SUBPART RECURSION<br \/>\n    if (isset($p->parts)) {<br \/>\n        foreach ($p->parts as $partno0=>$p2)<br \/>\n            getpart($mbox,$mid,$p2,$partno.'.'.($partno0+1));  \/\/ 1.2, 1.2.1, etc.<br \/>\n    }<br \/>\n}<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6839\u636e\u5b98\u65b9\u6587\u6863\u4ee5\u53ca\u4e00\u4e9b\u7f51\u53cb\u7684\u5206\u4eab\uff0c\u6574\u7406\u7f16\u5199\u4e86IMAP\u65b9\u5f0f\u8bbf\u95eeGmail\u90ae\u7bb1\u7684\u4ee3\u7801\u3002\u4ee5\u4fbf\u4e8e\u5c06\u6765\u4f1a\u5728\u9879\u76ee\u4e2d\u4f7f\u7528\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/posts\/28"}],"collection":[{"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/comments?post=28"}],"version-history":[{"count":1,"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/posts\/28\/revisions"}],"predecessor-version":[{"id":29,"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/posts\/28\/revisions\/29"}],"wp:attachment":[{"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/media?parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/categories?post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sangqiao.com\/blog\/wp-json\/wp\/v2\/tags?post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}