PHP 解析Maildir 邮件格式(eml文件)

1.解析邮件头

# $mailfile为邮件文件路径
function parsemail($mailfile){
    echo $mailfile."<br>";
    if(file_exists($mailfile)){
        $fp = fopen($mailfile, "r");
        if (!$fp){
            die("open mailfile failed!");
        }else{       
            while(($line = chop(fgets($fp,1024))) && $line !== ""){            
                echo htmlspecialchars($line)."<br>";
         }       
        }   
        fclose($fp);
    }else{
        echo "file not exists";
    }
}

2.根据文件名和ino号查找邮件文件

# $mid为ino
function getmailfile($mid,$mailpath){
    $newpath = $mailpath."/new/";
    $curpath = $mailpath."/cur/";

    $newhandle = opendir($newpath);
    while(($file = readdir($newhandle)) !== false ){
        if ($file != "." && $file != ".." && stat($newpath.$file)['ino'] == $mid){
            $mailfile = $newpath.$file;

        }
    }
    closedir($newhandle);

    $curhandle = opendir($curpath);
    while(($file = readdir($curhandle)) !== false ){
        if ($file != "." && $file != ".." && stat($curpath.$file)['ino'] == $mid){
            $mailfile = $curpath.$file;
        }
    }
    closedir($curhandle);

    return $mailfile;

}

3.用parsemail函数

function parsemail($mailfile){
    $mime = mailparse_msg_parse_file($mailfile);
    $struct = mailparse_msg_get_structure($mime);
    foreach ($struct as $x => $y) {
        $section = mailparse_msg_get_part($mime, $y);
        $info = mailparse_msg_get_part_data($section);

        if ($info["content-disposition"] == 'attachment'){
            # 附件名编码过的要解码
            $filename = Decode_mime($info["content-name"]);
            ob_start();
            mailparse_msg_extract_part_file($section, $mailfile);
            $content = ob_get_contents();
            ob_end_clean();
            # 把附件写到临时目录
            $fh = fopen("/home/temp/".$filename,"w+");
            fwrite($fh, $content);
            fclose($fh);
        }

    }
    
}

function Decode_mime($Str){
    if( substr_count($Str,'=?')==0 ) return $Str;
    list($Token,$Charset,$Encoding,$Str,$End) = preg_split('/\?/',$Str,5);
    $End = preg_replace("/^\=/","",$End);
    $Token = preg_replace("/\=/","",$Token);
    $Encoding = strtolower($Encoding);
    switch($Encoding){
        case 'b':
            $Text = trim(base64_decode($Str));
            break;
        case 'q':
            $Text = trim(quoted_printable_decode($Str));
    }
    if( substr_count($End,'=?')!=0 ) $End = Decode_mime($End);
    return iconv($Charset,"utf-8//IGNORE",$Token.$Text.$End);
}

转载于:https://my.oschina.net/hxily/blog/813811

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值