⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class_mime_decode.php

📁 webmail系统 php + mysql
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?

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;
		$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=%UM_FOLDER%&ix=%UM_IX%&bound=".base64_encode($thisattach["boundary"])."&part=".$thisattach["part"]."&filename=".urlencode($thisattach["name"]);
					$msgbody = str_replace($cid,$thisfile,eregi_replace("<base","<x-base",$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);
	}

	function build_text_body($body) {
		return "\n<pre>".$this->make_link_clickable($this->linesize(htmlspecialchars($body),85))."</pre>\n";
	}

	function decode_qp($text) {
		$text = quoted_printable_decode($text);
		/*
		$text = str_replace("\r","",$text);
		$text = ereg_replace("=\n", "", $text);
		$text = str_replace("\n","\r\n",$text);
		*/
		$text = ereg_replace("=\r", "\r", $text);
		return $text;
	}

	function make_link_clickable($text){
		$text = eregi_replace("([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])",
			"<a class=\"autolink\" href=\"\\1://\\2\\3\" target=\"_new\">\\1://\\2\\3</a>", $text);
		$text = eregi_replace("([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3})","<a class=\"autolink\"  href=\"newmsg.php?mailto=\\1&nameto=\\1\">\\1</a>", $text);
		return $text;
	}

	function process_message($header,$body) {
		global $mime_show_html;
		$mail_info = $this->get_mail_info($header);

		$ctype = $mail_info["content-type"];
		$ctenc = $mail_info["content-transfer-encoding"];

		if($ctype == "") $ctype = "text/plain";

		$type = $ctype;

		$ctype = split(";",$ctype);
		$types = split("/",$ctype[0]);

		$maintype = strtolower($types[0]);
		$subtype = strtolower($types[1]);

		switch($maintype) {
		case "text":
			$body = $this->compile_body($body,$ctenc);
			switch($subtype) {
			case "html":
				if(!$mime_show_html)
					$body = $this->build_text_body(strip_tags($body));
				$msgbody = $body;
				break;
			default:
				$msgbody = $this->build_text_body($body);
				break;
			}
			break;
		case "multipart":
			switch($subtype) {
			case "mixed":
				$boundary = $this->get_boundary($type);
				$part = $this->split_parts($boundary,$body);

				for($i=0;$i<count($part);$i++) {
					$thispart = trim($part[$i]);

					if($thispart != "") {
						$email = $this->fetch_structure($thispart);
	
						$header = $email["header"];
						$body = $email["body"];
						$headers = $this->decode_header($header);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -