MIME_message = array(); $this->content_map = array(); unset($this->main_header); $this->decode_article($message); } function get_content_map() { return $this->content_map; } function get_main_header() { return $this->main_header; } function get_total_part() { return sizeof($this->MIME_message); } function get_all_parts() { return $this->MIME_message; } function get_part($i) { return $this->MIME_message[$i]; } function get_part_header($i) { return $this->MIME_message[$i]["header"]; } function get_part_body($i) { return $this->MIME_message[$i]["body"]; } function decode_header($headers) { $header_want = "/^(From|Subject|Date|Newsgroups|References|Message-ID|Content-Type|Content-Transfer-Encoding|Content-Disposition|Content-ID): (.*$)/i"; $headers = explode("\r\n", $headers); // Parse the header for ($line_count = 0; $line_count < sizeof($headers);$line_count++) { $line = $headers[$line_count]; if (preg_match($header_want, $line, $header)) { while (preg_match("/.+;\s*$/", $header[2])) { /*if (strpos($headers[$line_count + 1], ":") === FALSE) { $header[2] .= str_replace("\r\n", "", $headers[++$line_count]); } else { break; }*/ //end of old statements if (isset($headers[$line_count + 1]) && strpos((string)$headers[$line_count + 1], ":") === false) { $line = isset($headers[++$line_count]) ? $headers[$line_count] : ''; $header[2] .= str_replace("\r\n", "", (string)$line); } else { break; } } $result[strtolower($header[1])] = decode_MIME_header($header[2]); } } return $result; } // An article is a raw MIME message function decode_article($article) { list($header, $body) = explode("\r\n\r\n", $article, 2); $header = $this->decode_header($header); if ($body !== null) { $body = preg_replace("/^\.\.(.*)/m", ".$1", $body); //Replace the line starts with .. to . } if (isset($header["from"])) { $header["from"] = decode_sender($header["from"]); } if (!isset($header["content-type"])) { $header["content-type"] = "text/plain"; // If no content type, default set it to plain text } if (!isset($this->main_header)) { $this->main_header = $header; } if (stristr($header["content-type"], "multipart")) { // Extract boundary from the header preg_match("/boundary=\"(.*?)\"/i", $header["content-type"], $boundary); $boundary = "--".str_replace("\"", "", $boundary[1]); $this->decode_multipart_message($body, $boundary); } else { // Check for any UUEncoded attachment if (preg_match("/^begin\s+[0-9][0-9][0-9]\s+(.+?)\s*\r?\n/m", $body)) { // $parts = preg_split("/^begin\s+[0-9][0-9][0-9]\s+(.+?)\s*\r?\n/m", $body, -1, PREG_SPLIT_DELIM_CAPTURE); $parts = preg_split("/^begin\s+[0-9][0-9][0-9]\s+(.+?)\s*\r?\n(.*?)end/ms", $body, -1, PREG_SPLIT_DELIM_CAPTURE); // Create the message structure same as Multipart message $this->MIME_message[] = array( "header"=>array("content-type"=>$header["content-type"], "content-transfer-encoding"=>$header["content-transfer-encoding"]), "body"=>$parts[0] ); $text_index = sizeof($this->MIME_message) - 1; for ($i = 1;$i < sizeof($parts);$i += 3) { $this->MIME_message[] = array( "header"=>array("content-type"=>get_content_type($parts[$i]), "content-transfer-encoding"=>"uuencode"), "body"=>$parts[$i + 1], "filename"=>$parts[$i] ); if (strlen(trim($parts[$i + 2])) > 0) { $this->MIME_message[$text_index]["body"] .= $parts[$i + 2]; } } } else { unset($filename); $content_disposition = isset($header["content-disposition"]) ? $header["content-disposition"] : ""; if (preg_match("/name=(['|\"])?(.*?)(?(1)['|\"])\s*/i", $header["content-type"], $matches)) { $filename = str_replace("\"", "", $matches[2]); //} elseif (preg_match("/filename=(['|\"])?(.*?)(?(1)['|\"])\s*/i", $header["content-disposition"], $matches)) { } elseif (preg_match("/filename=(['|\"])?(.*?)(?(1)['|\"])\s*/i", $content_disposition, $matches)) { $filename = str_replace("\"", "", $matches[2]); } if (isset($filename)) { $this->MIME_message[] = array("header"=>$header, "body"=>$body, "filename"=>$filename); } else { $this->MIME_message[] = array("header"=>$header, "body"=>$body); } if (isset($header["content-id"])) { $this->content_map[$header["content-id"]] = sizeof($this->MIME_message) - 1; } } } } function decode_multipart_message($message, $boundary) { $parts = preg_split("/$boundary-?-?\s*/m", $message); array_shift($parts); // Drop the "This is a multi-part message in MIME format." message array_pop($parts); // Drop the last part after the boundary end foreach ($parts as $part) { $this->decode_article($part); } } } ?>