1
這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。
https://github.com/php-mime-mail-parser/php-mime-mail-parser 也許可用
<?php
ini_set('display_errors',true);
ini_set('error_reporting',E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
mb_internal_encoding('UTF-8');
const path = '/var/spool/mail';
$userArray = scandir(path);
$users =array();
foreach( $userArray as $k=>$user ){
if ( $user !='.' && $user !='..' ){
$users[] = $user;
}
}
// 選取了使用者信箱
if ( $_GET['a'] =='user' ) {
$mail = array();
$m = '';
$f = path .'/'. $_POST['user'];
$handle = @fopen($f, "r");
$mail = $body = array();
$i = -1;
if ($handle) {
$header = true;
while (($line = fgets($handle, 4096)) != false) {
if ( preg_match('/^From /', $line) ){
$header = true;
++$i;
$mail[$i] .= $line;
}
else{
if ( $header == true ) {
$mail[$i] .= $line;
}
else{
$body[$i] .= $line;
}
}
if ( preg_match('/^\n$/', $line) ) {
$header = false;
}
}
fclose($handle);
}
// 讀取單一信件
$m = array();
foreach( $mail as $k=>$v ){
// 將信件內容丟進 mailparse 進行解析
$mime = mailparse_msg_create();
mailparse_msg_parse($mime, $v);
// 讀取信件結構 -> header & body
$structure = mailparse_msg_get_structure($mime);
$parts = array();
foreach($structure as $part_id) {
$part = mailparse_msg_get_part($mime, $part_id);
$parts[$part_id] = mailparse_msg_get_part_data($part);
// 將信件結構存入陣列
$m[$k] = $parts[$part_id];
}
//print_r($m);
}
$mail = array();
foreach( $m as $k=>$v ){
$mail[$k]['subject'] = mb_decode_mimeheader($v['headers']['subject']);
}
if ( count($m) >=1 ){
$Return = array( 'Result'=>true, 'Data'=>$mail );
}
else {
$Return = array( 'Result'=>false );
}
echo json_encode($Return);
exit;
}
//
if ( $_GET['a'] =='mail' ) {
$mail = array();
$m = '';
$f = path .'/'. $_POST['user'];
$handle = @fopen($f, "r");
$mail = $body = array();
$i = -1;
if ($handle) {
$header = true;
while (($line = fgets($handle, 4096)) != false) {
if ( preg_match('/^From /', $line) ){
$header = true;
++$i;
$mail[$i] .= $line;
}
else{
if ( $header == true ) {
$mail[$i] .= $line;
}
else{
$body[$i] .= $line;
}
}
if ( preg_match('/^\n$/', $line) ) {
$header = false;
}
}
fclose($handle);
}
if ( count($m) >=1 ){
$Return = array( 'Result'=>true, 'Data'=>$body[$_POST['mail']] );
}
else {
$Return = array( 'Result'=>false );
}
echo json_encode($Return);
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"/>
<title></title>
<style>
*{
font-size: 16px;
}
pre{
background-color: #eee;
border: 1px solid #aaa;
border-radius: 8px;
padding: 16px;
margin: 16px;
}
.box{
margin: 16px;
padding: 16px;
border-radius: 8px;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<div class="box">
<label>選擇使用者帳號:
<select name="user" onchange="selectUser(this)">
<option value="">- 選擇信箱 -</option>
<?php foreach($users as $k=>$v){ ?>
<option value="<?php echo $v;?>"><?php echo $v;?></option>
<?php } ?>
</select>
</label>
</div>
<?php echo $_POST['user'];?>
<div class="box">
<label>選取信件:
<select name="mail" onchange="readMail(this)"></select>
</label>
</div>
<div>信件內容:</div>
<pre id="MailBody"></pre>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
var user = '';
function selectUser(obj){
var $this = $(obj);
user = $this.val();
$.ajax({
url: '?a=user',
type: 'post',
data: {
user: $this.val()
},
dataType: 'json',
success: function(json){
var h = '<option value="">- 選擇信件 -</option>';
if ( json['Result'] ==true ){
$.each( json['Data'], function(k,v){
h += '<option value="'+ k +'">'+ v['subject'] +'</option>';
} );
}
$('[name="mail"]').html(h);
}
});
}
function readMail(obj){
var $this = $(obj);
$.ajax({
url: '?a=mail',
type: 'post',
data: {
user: user,
mail: $('[name="mail"]').val()
},
dataType: 'json',
success: function(json){
var h = '';
if ( json['Result'] ==true ){
h += json['Data'];
}
$('#MailBody').html(h);
}
});
}
</script>
</body>
</html>
如果要直接解讀 /var/spool/mail 內檔案可能會有點困難
因為那是一個單大容量文字檔,信件都放在一起,讀入檔案再進行切割解讀信件應該是一件很耗硬體資源的事情
我無聊的時候寫個 php 測試看看
換成 maildir 會不會好些?
才發現 win7 後不支援 outlook 之類的讀郵件程式 ...
<?php
ini_set('display_errors',true);
ini_set('error_reporting',E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
const path = '/var/spool/mail';
$users = scandir(path);
foreach( $users as $k=>$user ){
if ( $user !='.' && $user !='..' ){
echo $user;
$mime = mailparse_msg_parse_file(path .'/'. $user);
$structure = mailparse_msg_get_structure($mime);
$parts = array();
foreach($structure as $part_id) {
$part = mailparse_msg_get_part($mime, $part_id);
$parts[$part_id] = mailparse_msg_get_part_data($part);
print_r($parts[$part_id]);
}
}
}