{"id":5282,"date":"2023-06-14T11:40:33","date_gmt":"2023-06-14T03:40:33","guid":{"rendered":"https:\/\/blog.hoyo.idv.tw\/?p=5282"},"modified":"2023-06-14T11:40:33","modified_gmt":"2023-06-14T03:40:33","slug":"%e7%b6%b2%e9%a0%81%e9%a1%af%e7%a4%ba-var-spool-mail-mailbox-%e6%a0%bc%e5%bc%8f%e4%bf%a1%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/blog.hoyo.idv.tw\/?p=5282","title":{"rendered":"\u7db2\u9801\u986f\u793a \/var\/spool\/mail mailbox \u683c\u5f0f\u4fe1\u4ef6"},"content":{"rendered":"<h2>\u8d77\u56e0<\/h2>\n<ul>\n<li><a href=\"http:\/\/phorum.study-area.org\/index.php\/topic,72297.msg344990\/topicseen.html#msg344990\" target=\"_blank\" rel=\"noopener\">\u8acb\u554f\u6700\u7c21\u55ae\u7684webmail<\/a><\/li>\n<\/ul>\n<p>--<\/p>\n<h2>\u6280\u8853\u89e3\u6790<\/h2>\n<p>\u8acb\u53c3\u8003 <a href=\"https:\/\/blog.hoyo.idv.tw\/?p=4661\" target=\"_blank\" rel=\"noopener\">Postfix \u4f7f\u7528\u865b\u64ec\u4f7f\u7528\u8005 \u2013 4. \u4fe1\u4ef6\u89e3\u6790\uff0c\u8b93\u7db2\u9801\u770b\u5f97\u61c2<\/a><\/p>\n<p>--<\/p>\n<h2>PHP \u5be6\u4f5c<\/h2>\n<pre class=\"height-set:true lang:php decode:true\">&lt;?php\r\nini_set('display_errors',true);\r\nini_set('error_reporting',E_ALL &amp; ~E_NOTICE &amp; ~E_STRICT &amp; ~E_DEPRECATED);\r\n\r\nmb_internal_encoding('UTF-8');\r\n\r\nconst path = '\/var\/spool\/mail';\r\n\r\n$userArray = scandir(path);\r\n$users =array();\r\n\r\nforeach( $userArray as $k=&gt;$user ){\r\n    if ( $user !='.' &amp;&amp; $user !='..' ){\r\n        $users[] = $user;\r\n    }\r\n}\r\n\r\n\/\/ \u9078\u53d6\u4e86\u4f7f\u7528\u8005\u4fe1\u7bb1\r\nif ( $_GET['a'] =='user' ) {\r\n\r\n    $mail = array();\r\n    $m = '';\r\n\r\n    $f = path .'\/'. $_POST['user'];\r\n    $handle = @fopen($f, \"r\");\r\n    $mail = $body = array();\r\n    $i = -1;\r\n    if ($handle) {\r\n        $header = true;\r\n        while (($line = fgets($handle, 4096)) != false) {\r\n            if ( preg_match('\/^From \/', $line) ){\r\n                $header = true;\r\n                ++$i;\r\n                $mail[$i] .= $line;\r\n            }\r\n            else{\r\n                if ( $header == true ) {\r\n                    $mail[$i] .= $line;\r\n                }\r\n                else{\r\n                    $body[$i] .= $line;\r\n                }\r\n            }\r\n\r\n            if ( preg_match('\/^\\n$\/', $line) ) {\r\n                $header = false;\r\n            }\r\n        }\r\n        fclose($handle);\r\n    }\r\n    \r\n    \/\/ \u8b80\u53d6\u55ae\u4e00\u4fe1\u4ef6\r\n    $m = array();\r\n    foreach( $mail as $k=&gt;$v ){\r\n        \/\/ \u5c07\u4fe1\u4ef6\u5167\u5bb9\u4e1f\u9032 mailparse \u9032\u884c\u89e3\u6790\r\n        $mime = mailparse_msg_create();\r\n        mailparse_msg_parse($mime, $v);\r\n\r\n        \/\/ \u8b80\u53d6\u4fe1\u4ef6\u7d50\u69cb -&gt; header &amp; body\r\n        $structure = mailparse_msg_get_structure($mime);\r\n        $parts = array();\r\n        foreach($structure as $part_id) {\r\n            $part = mailparse_msg_get_part($mime, $part_id);\r\n            $parts[$part_id] = mailparse_msg_get_part_data($part);\r\n\r\n            \/\/ \u5c07\u4fe1\u4ef6\u7d50\u69cb\u5b58\u5165\u9663\u5217\r\n            $m[$k] = $parts[$part_id];\r\n        }\r\n        \/\/print_r($m);\r\n    }\r\n\r\n    $mail = array();\r\n    foreach( $m as $k=&gt;$v ){\r\n        $mail[$k]['subject'] = mb_decode_mimeheader($v['headers']['subject']);\r\n    }\r\n\r\n    if ( count($m) &gt;=1 ){\r\n        $Return = array( 'Result'=&gt;true, 'Data'=&gt;$mail );\r\n    }\r\n    else {\r\n        $Return = array( 'Result'=&gt;false );\r\n    }\r\n    echo json_encode($Return);\r\n    exit;\r\n}\r\n\r\n\/\/\r\nif ( $_GET['a'] =='mail' ) {\r\n    $mail = array();\r\n    $m = '';\r\n\r\n    $f = path .'\/'. $_POST['user'];\r\n    $handle = @fopen($f, \"r\");\r\n    $mail = $body = array();\r\n    $i = -1;\r\n    if ($handle) {\r\n        $header = true;\r\n        while (($line = fgets($handle, 4096)) != false) {\r\n            if ( preg_match('\/^From \/', $line) ){\r\n                $header = true;\r\n                ++$i;\r\n                $mail[$i] .= $line;\r\n            }\r\n            else{\r\n                if ( $header == true ) {\r\n                    $mail[$i] .= $line;\r\n                }\r\n                else{\r\n                    $body[$i] .= $line;\r\n                }\r\n            }\r\n\r\n            if ( preg_match('\/^\\n$\/', $line) ) {\r\n                $header = false;\r\n            }\r\n        }\r\n        fclose($handle);\r\n    }\r\n    \r\n    if ( count($m) &gt;=1 ){\r\n        $Return = array( 'Result'=&gt;true, 'Data'=&gt;$body[$_POST['mail']] );\r\n    }\r\n    else {\r\n        $Return = array( 'Result'=&gt;false );\r\n    }\r\n    echo json_encode($Return);\r\n    exit;\r\n}\r\n?&gt;\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n    &lt;meta charset=\"UTF-8\"&gt;\r\n    &lt;meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width\"\/&gt;\r\n    &lt;title&gt;&lt;\/title&gt;\r\n    &lt;style&gt;\r\n        *{\r\n            font-size: 16px;\r\n        }\r\n        pre{\r\n            background-color: #eee;\r\n            border: 1px solid #aaa;\r\n            border-radius: 8px;\r\n            padding: 16px;\r\n            margin: 16px;\r\n        }\r\n        .box{\r\n            margin: 16px;\r\n            padding: 16px;\r\n            border-radius: 8px;\r\n            border: 1px solid #ddd;\r\n        }\r\n    &lt;\/style&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;div class=\"box\"&gt;\r\n    &lt;label&gt;\u9078\u64c7\u4f7f\u7528\u8005\u5e33\u865f\uff1a\r\n        &lt;select name=\"user\" onchange=\"selectUser(this)\"&gt;\r\n            &lt;option value=\"\"&gt;- \u9078\u64c7\u4fe1\u7bb1 -&lt;\/option&gt;\r\n            &lt;?php foreach($users as $k=&gt;$v){ ?&gt;\r\n                &lt;option value=\"&lt;?php echo $v;?&gt;\"&gt;&lt;?php echo $v;?&gt;&lt;\/option&gt;\r\n            &lt;?php } ?&gt;\r\n        &lt;\/select&gt;\r\n    &lt;\/label&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;?php echo $_POST['user'];?&gt;\r\n\r\n&lt;div class=\"box\"&gt;\r\n    &lt;label&gt;\u9078\u53d6\u4fe1\u4ef6\uff1a\r\n        &lt;select name=\"mail\" onchange=\"readMail(this)\"&gt;&lt;\/select&gt;\r\n    &lt;\/label&gt;\r\n&lt;\/div&gt;\r\n\r\n&lt;div&gt;\u4fe1\u4ef6\u5167\u5bb9\uff1a&lt;\/div&gt;\r\n&lt;pre id=\"MailBody\"&gt;&lt;\/pre&gt;\r\n\r\n&lt;script src=\"\/\/code.jquery.com\/jquery-1.11.3.min.js\"&gt;&lt;\/script&gt;\r\n&lt;script&gt;\r\n    var user = '';\r\n\r\n    function selectUser(obj){\r\n        var $this = $(obj);\r\n        user = $this.val();\r\n\r\n        $.ajax({\r\n            url: '?a=user',\r\n            type: 'post',\r\n            data: {\r\n                user: $this.val()\r\n            },\r\n            dataType: 'json',\r\n            success: function(json){\r\n\r\n                var h = '&lt;option value=\"\"&gt;- \u9078\u64c7\u4fe1\u4ef6 -&lt;\/option&gt;';\r\n                if ( json['Result'] ==true ){\r\n                    $.each( json['Data'], function(k,v){\r\n                        h += '&lt;option value=\"'+ k +'\"&gt;'+ v['subject'] +'&lt;\/option&gt;';\r\n                    } );\r\n                }\r\n\r\n                $('[name=\"mail\"]').html(h);\r\n            }\r\n        });\r\n    }\r\n\r\n    function readMail(obj){\r\n        var $this = $(obj);\r\n\r\n        $.ajax({\r\n            url: '?a=mail',\r\n            type: 'post',\r\n            data: {\r\n                user: user,\r\n                mail: $('[name=\"mail\"]').val()\r\n            },\r\n            dataType: 'json',\r\n            success: function(json){\r\n\r\n                var h = '';\r\n                if ( json['Result'] ==true ){\r\n                    h += json['Data'];\r\n                }\r\n\r\n                $('#MailBody').html(h);\r\n            }\r\n        });\r\n    }\r\n&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>--<\/p>\n<h2>\u904b\u4f5c\u5be6\u4f8b<\/h2>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-5288\" src=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2018\/11\/Image-085.png\" alt=\"\" width=\"703\" height=\"479\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2018\/11\/Image-085.png 703w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2018\/11\/Image-085-300x204.png 300w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2018\/11\/Image-085-440x300.png 440w\" sizes=\"(max-width: 703px) 100vw, 703px\" \/><\/p>\n<p>--<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p class=\"pvc_stats all \" data-element-id=\"5282\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> &nbsp;762&nbsp;total views, &nbsp;1&nbsp;views today<\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u8d77\u56e0 \u8acb\u554f\u6700\u7c21\u55ae\u7684webmai...<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p class=\"pvc_stats all \" data-element-id=\"5282\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> &nbsp;762&nbsp;total views, &nbsp;1&nbsp;views today<\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[31],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/5282"}],"collection":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5282"}],"version-history":[{"count":5,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/5282\/revisions"}],"predecessor-version":[{"id":12339,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/5282\/revisions\/12339"}],"wp:attachment":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}