+ /** Setting up the object that has the structure for the message **/
+
+ class msg_header {
+ /** msg_header contains generic variables for values that **/
+ /** could be in a header. **/
+
+ var $type0, $type1, $boundary, $charset, $encoding;
+ var $to, $from, $date, $cc, $bcc, $reply_to, $subject;
+ var $id, $mailbox;
+ var $entity_id;
+ }
+
+ class message {
+ /** message is the object that contains messages. It is a recursive
+ object in that through the $entities variable, it can contain
+ more objects of type message. See documentation in mime.txt for
+ a better description of how this works.
+ **/
+ var $header;
+ var $entities;
+
+ function addEntity ($msg) {
+ $this->entities[count($this->entities)] = $msg;
+ }
+ }
+
+
+
+ /* --------------------------------------------------------------------------------- */
+ /* MIME DECODING */
+ /* --------------------------------------------------------------------------------- */
+
+ /** This function gets the structure of a message and stores it in the "message" class.
+ It will return this object for use with all relevant header information and
+ fully parsed into the standard "message" object format.
+ **/
+ function mime_structure ($imap_stream, $header) {
+ sqimap_messages_flag ($imap_stream, $header->id, $header->id, "Seen");
+
+ $id = $header->id;
+ fputs ($imap_stream, "a001 FETCH $id BODYSTRUCTURE\r\n");
+ $read = sqimap_read_data ($imap_stream, "a001", true, $a, $b);
+ $read = strtolower($read[0]);
+
+ //echo $read."<br><br>";
+ // isolate the body structure and remove beginning and end parenthesis
+ $read = trim(substr ($read, strpos($read, "bodystructure") + 13));
+ $read = trim(substr ($read, 0, -2));
+ $read = trim(substr ($read, 1));
+
+ $msg = mime_parse_structure ($read);
+ $msg->header = $header;
+ return $msg;
+ }
+
+ function mime_parse_structure ($structure, $ent_id) {
+ //echo "<font color=008800><tt>START: mime_parse_structure()</tt></font><br>";
+ $msg = new message();
+ if (substr($structure, 0, 1) == "(") {
+ $ent_id = mime_new_element_level($ent_id);
+ $start = $end = -1;
+ do {
+ //echo "<font color=008800><tt>Found entity...</tt></font><br>";
+ $start = $end+1;
+ $end = mime_match_parenthesis ($start, $structure);
+
+ $element = substr($structure, $start+1, ($end - $start)-1);
+ $ent_id = mime_increment_id($ent_id);
+ $newmsg = mime_parse_structure ($element, $ent_id);
+ $msg->addEntity ($newmsg);
+ } while (substr($structure, $end+1, 1) == "(");
+ } else {
+ // parse the elements
+ //echo "<br><font color=0000aa><tt>$structure</tt></font><br>";
+ $msg->header = new msg_header();
+ $msg->header = mime_get_element (&$structure, $header);
+ $msg->header->entity_id = $ent_id;
+ //echo "<br>";
+ }
+ return $msg;
+ //echo "<font color=008800><tt> END: mime_parse_structure()</tt></font><br>";
+ }
+
+ // Increments the element ID. An element id can look like any of
+ // the following: 1, 1.2, 4.3.2.4.1, etc. This function increments
+ // the last number of the element id, changing 1.2 to 1.3.
+ function mime_increment_id ($id) {
+ if (strpos($id, ".")) {
+ $first = substr($id, 0, strrpos($id, "."));
+ $last = substr($id, strlen($id) - strlen($first));
+ $last++;
+ $new = $first . $last;
+ } else {
+ $new = $id + 1;
+ }
+ return $new;
+ }
+
+ // See comment for mime_increment_id().
+ // This adds another level on to the entity_id changing 1.3 to 1.3.0
+ // NOTE: 1.3.0 is not a valid element ID. It MUST be incremented
+ // before it can be used. I left it this way so as not to have
+ // to make a special case if it is the first entity_id. It
+ // always increments it, and that works fine.
+ function mime_new_element_level ($id) {
+ if (!$id)
+ $id = 0;
+ else
+ $id . ".0";
+ return $id;
+ }
+
+ function mime_get_element (&$structure, $header) {
+ $elem_num = 1;
+
+ while (strlen($structure) > 0) {
+ $structure = trim($structure);
+ $char = substr($structure, 0, 1);
+
+ if (substr($structure, 0, 3) == "nil") {
+ $text = "";
+ $structure = substr($structure, 3);
+ } else if ($char == "\"") {
+ // loop through until we find the matching quote, and return that as a string
+ $pos = 1;
+ $char = substr($structure, $pos, 1);
+ while ($char != "\"" && $pos < strlen($structure)) {
+ $text .= $char;
+ $pos++;
+ $char = substr($structure, $pos, 1);
+ }
+ $structure = substr($structure, strlen($text) + 2);
+ } else if ($char == "(") {
+ // comment me
+ $end = mime_match_parenthesis (0, $structure);
+ $sub = substr($structure, 1, $end-1);
+ $properties = mime_get_props($properties, $sub);
+ $structure = substr($structure, strlen($sub) + 2);
+ } else {
+ // loop through until we find a space or an end parenthesis
+ $pos = 0;
+ $char = substr($structure, $pos, 1);
+ while ($char != " " && $char != ")" && $pos < strlen($structure)) {
+ $text .= $char;
+ $pos++;
+ $char = substr($structure, $pos, 1);