当前位置:Linux教程 - Php - 最好的邮件编码解码类,再没有比这个好的了!贴不下了(1)

最好的邮件编码解码类,再没有比这个好的了!贴不下了(1)

<?
class mime_decode {

    var $content     = Array();
    function mime_encode_headers($string) {
        if($string == "") return;
        if(!eregi("^([[:print:]]*)$",$string))
            $string = "=?ISO-8859-1?Q?".str_replace("+","_",str_replace("%","=",urlencode($string)))."?=";
        return $string;
    }

    function decode_mime_string($string) {
        if(($pos = strpos($string,"=?")) === false) return $string;
        while(!($pos === false)) {
            $newresult .= substr($string,0,$pos);
            $string = substr($string,$pos+2,strlen($string));
            $intpos = strpos($string,"?");
            $charset = substr($string,0,$intpos);
            $enctype = strtolower(substr($string,$intpos+1,1));
            $string = substr($string,$intpos+3,strlen($string));
            $endpos = strpos($string,"?=");
            $mystring = substr($string,0,$endpos);
            $string = substr($string,$endpos+2,strlen($string));
            if($enctype == "q") {
                $mystring = str_replace("_"," ",$mystring);
                $mystring = $this->decode_qp($mystring);
            } else if ($enctype == "b")
                $mystring = base64_decode($mystring);
            $newresult .= $mystring;
            $pos = strpos($string,"=?");
        }
        return $newresult.$string;
    }

    function decode_header($header) {
        $headers = explode("\r\n",$header);
        $decodedheaders = Array();
        for($i=0;$i<count($headers);$i++) {
            $thisheader = $headers[$i];
            if(strpos($thisheader,": ") === false) {
                $decodedheaders[$lasthead] .= " $thisheader";
            } else {
                $dbpoint = strpos($thisheader,": ");
                $headname = strtolower(substr($thisheader,0,$dbpoint));
                $headvalue = trim(substr($thisheader,$dbpoint+1));
                if($decodedheaders[$headname] != "") $decodedheaders[$headname] .= "; $headvalue";
                else $decodedheaders[$headname] = $headvalue;
                $lasthead = $headname;
            }
        }
        return $decodedheaders;
    }


    function fetch_structure($email) {
        $ARemail = Array();
        $separador = "\r\n\r\n";
        $header = trim(substr($email,0,strpos($email,$separador)));
        $bodypos = strlen($header)+strlen($separador);
        $body = substr($email,$bodypos,strlen($email)-$bodypos);
        $ARemail["header"] = $header; $ARemail["body"] = $body;
        return $ARemail;
    }

    function get_names($strmail) {
        $ARfrom = Array();
        $strmail = stripslashes(ereg_replace("\t","",ereg_replace("\n","",ereg_replace("\r","",$strmail))));
        if(trim($strmail) == "") return $ARfrom;

        $armail = Array();
        $counter = 0;  $inthechar = 0;
        $chartosplit = ",;"; $protectchar = "\""; $temp = "";
        $lt = "<"; $gt = ">";
        $closed = 1;

        for($i=0;$i<strlen($strmail);$i++) {
            $thischar = $strmail[$i];
            if($thischar == $lt && $closed) $closed = 0;
            if($thischar == $gt && !$closed) $closed = 1;
            if($thischar == $protectchar) $inthechar = ($inthechar)?0:1;
            if(!(strpos($chartosplit,$thischar) === false) && !$inthechar && $closed) {
                $armail[] = $temp; $temp = "";
            } else
                $temp .= $thischar;
        }

        if(trim($temp) != "")
            $armail[] = trim($temp);

        for($i=0;$i<count($armail);$i++) {
            $thisPart = trim(eregi_replace("^\"(.*)\"$", "\\1", trim($armail[$i])));
            if($thisPart != "") {
                if (eregi("(.*)<(.*)>", $thisPart, $regs)) {
                    $email = trim($regs[2]);
                    $name = trim($regs[1]);
                } else {
                    if (eregi("([-a-z0-9_$+.]+@[-a-z0-9_.]+[-a-z0-9_]+)((.*))", $thisPart, $regs)) {
                        $email = $regs[1];
                        $name = $regs[2];
                    } else
                        $email = $thisPart;
                }
                $email = eregi_replace("^\<(.*)\>$", "\\1", $email);
                $name = eregi_replace("^\"(.*)\"$", "\\1", trim($name));
                $name = eregi_replace("^\((.*)\)$", "\\1", $name);
                if ($name == "") $name = $email;
                if ($email == "") $email = $name;
                $ARfrom[$i]["name"] = $this->decode_mime_string($name);
                $ARfrom[$i]["mail"] = $email;
                unset($name);unset($email);
            }
        }
        return $ARfrom;
    }

    function build_alternative_body($ctype,$body) {
        global $mime_show_html;
        $boundary = $this->get_boundary($ctype);
        $part = $this->split_parts($boundary,$body);
        $thispart = ($mime_show_html)?$part[1]:$part[0];
        $email = $this->fetch_structure($thispart);
        $header = $email["header"];
        $body = $email["body"];
        $headers = $this->decode_header($header);
        $body = $this->compile_body($body,$headers["content-transfer-encoding"]);
        return $body;
    }

    function build_related_body($ctype,$body) {
        global $mime_show_html,$sid,$lid,$ix,$folder;
        $Rtype = trim(substr($ctype,strpos($ctype,"type=")+5,strlen($ctype)));

        if(strpos($Rtype,";") != 0)
            $Rtype = substr($Rtype,0,strpos($Rtype,";"));
        if(substr($Rtype,0,1) == "\"" && substr($Rtype,-1) == "\"")
            $Rtype = substr($Rtype,1,strlen($Rtype)-2);

        $boundary = $this->get_boundary($ctype);
        $part = $this->split_parts($boundary,$body);

        for($i=0;$i<count($part);$i++) {
            $email = $this->fetch_structure($part[$i]);
            $header = $email["header"];
            $body = $email["body"];
            $headers = $this->decode_header($header);
            $ctype = $headers["content-type"];
            $cid = $headers["content-id"];
            $Actype = split(";",$headers["content-type"]);
            $types = split("/",$Actype[0]); $rctype = strtolower($Actype[0]);
            if($rctype == "multipart/alternative")
                $msgbody = $this->build_alternative_body($ctype,$body);
            elseif($rctype == "text/plain" && strpos($headers["content-disposition"],"name") === false) {
                $body = $this->compile_body($body,$headers["content-transfer-encoding"]);
                $msgbody = $this->build_text_body($body);
            } elseif($rctype == "text/html" && strpos($headers["content-disposition"],"name") === false) {
                $body = $this->compile_body($body,$headers["content-transfer-encoding"]);
                if(!$mime_show_html) $body = $this->build_text_body(strip_tags($body));
                $msgbody = $body;
            } else {
                $thisattach = $this->build_attach($header,$body,$boundary,$i);
                if($cid != "") {
                    if(substr($cid,0,1) == "<" && substr($cid,-1) == ">")
                        $cid = substr($cid,1,strlen($cid)-2);
                    $cid = "cid:$cid";
                    $thisfile = "download.php?sid=$sid&lid=$lid&folder=".urlencode($folder)."&ix=".$ix."&bound=".base64_encode($thisattach["boundary"])."&part=".$thisattach["part"]."&filename=".urlencode($thisattach["name"]);
                    $msgbody = str_replace($cid,$thisfile,$msgbody);
                }
            }
        }
        return $msgbody;
    }

    function linesize($message="", $length=70) {
        $line = explode("\r\n",$message);
        unset($message);
        for ($i=0 ;$i < count($line); $i++) {
            $line_part = explode(" ",trim($line[$i]));
            unset($buf);
            for ($e = 0; $e<count($line_part); $e++) {
                $buf_o = $buf;
                if ($e == 0) $buf .= $line_part[$e];
                else $buf .= " ".$line_part[$e];
                if (strlen($buf) > $length and $buf_o != "") {
                    $message .= "$buf_o\r\n";
                    $buf = $line_part[$e];
                }
            }
            $message .= "$buf\r\n";
        }
        return($message);
&nbs