+function mime_structure ($bodystructure, $flags=array()) {
+
+ // isolate the body structure and remove beginning and end parenthesis
+ $read = trim(substr ($bodystructure, strpos(strtolower($bodystructure), 'bodystructure') + 13));
+ $msg = &new message();
+ $read = trim(substr ($read, 0, -1));
+ $res = $msg->parseStructure($read);
+ $msg = $res[0];
+ $msg->setEnt('0');
+ if (count($flags)) {
+ foreach ($flags as $flag) {
+ $char = strtoupper($flag{1});
+ switch ($char) {
+ case 'S':
+ if (strtolower($flag) == '\\seen') {
+ $msg->is_seen = true;
+ }
+ break;
+ case 'A':
+ if (strtolower($flag) == '\\answered') {
+ $msg->is_answered = true;
+ }
+ break;
+ case 'D':
+ if (strtolower($flag) == '\\deleted') {
+ $msg->is_deleted = true;
+ }
+ break;
+ case 'F':
+ if (strtolower($flag) == '\\flagged') {
+ $msg->is_flagged = true;
+ }
+ break;
+ case 'M':
+ if (strtolower($flag) == '$mdnsent') {
+ $msg->is_mdnsent = true;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ // listEntities($msg);
+ return( $msg );
+}
+
+/* this starts the parsing of a particular structure. It is called recursively,
+ * so it can be passed different structures. It returns an object of type
+ * $message.
+ * First, it checks to see if it is a multipart message. If it is, then it
+ * handles that as it sees is necessary. If it is just a regular entity,
+ * then it parses it and adds the necessary header information (by calling out
+ * to mime_get_elements()
+ */
+
+function mime_fetch_body($imap_stream, $id, $ent_id) {
+ global $uid_support;
+ /*
+ * do a bit of error correction. If we couldn't find the entity id, just guess
+ * that it is the first one. That is usually the case anyway.
+ */
+ if (!$ent_id) {
+ $ent_id = 1;
+ }
+ $cmd = "FETCH $id BODY[$ent_id]";
+
+ $data = sqimap_run_command ($imap_stream, $cmd, true, $response, $message, $uid_support);
+ do {
+ $topline = trim(array_shift( $data ));
+ } while( $topline && $topline[0] == '*' && !preg_match( '/\* [0-9]+ FETCH.*/i', $topline )) ;
+
+ $wholemessage = implode('', $data);
+ if (ereg('\\{([^\\}]*)\\}', $topline, $regs)) {
+
+ $ret = substr( $wholemessage, 0, $regs[1] );
+ /*
+ There is some information in the content info header that could be important
+ in order to parse html messages. Let's get them here.
+ */
+ if ( $ret{0} == '<' ) {
+ $data = sqimap_run_command ($imap_stream, "FETCH $id BODY[$ent_id.MIME]", true, $response, $message, $uid_support);
+ }
+ } else if (ereg('"([^"]*)"', $topline, $regs)) {
+ $ret = $regs[1];
+ } else {
+ global $where, $what, $mailbox, $passed_id, $startMessage;
+ $par = 'mailbox=' . urlencode($mailbox) . "&passed_id=$passed_id";
+ if (isset($where) && isset($what)) {
+ $par .= '&where='. urlencode($where) . "&what=" . urlencode($what);
+ } else {
+ $par .= "&startMessage=$startMessage&show_more=0";
+ }
+ $par .= '&response=' . urlencode($response) .
+ '&message=' . urlencode($message).
+ '&topline=' . urlencode($topline);
+
+ echo '<tt><br>' .
+ '<table width="80%"><tr>' .
+ '<tr><td colspan=2>' .
+ _("Body retrieval error. The reason for this is most probably that the message is malformed. Please help us making future versions better by submitting this message to the developers knowledgebase!") .
+ " <A HREF=\"../src/retrievalerror.php?$par\"><br>" .
+ _("Submit message") . '</A><BR> ' .
+ '</td></tr>' .
+ '<td><b>' . _("Command:") . "</td><td>$cmd</td></tr>" .
+ '<td><b>' . _("Response:") . "</td><td>$response</td></tr>" .
+ '<td><b>' . _("Message:") . "</td><td>$message</td></tr>" .
+ '<td><b>' . _("FETCH line:") . "</td><td>$topline</td></tr>" .
+ "</table><BR></tt></font><hr>";
+
+ $data = sqimap_run_command ($imap_stream, "FETCH $passed_id BODY[]", true, $response, $message, $uid_support);
+ array_shift($data);
+ $wholemessage = implode('', $data);
+
+ $ret = $wholemessage;
+ }
+ return( $ret );
+}
+
+function mime_print_body_lines ($imap_stream, $id, $ent_id, $encoding) {
+ global $uid_support;
+ // do a bit of error correction. If we couldn't find the entity id, just guess
+ // that it is the first one. That is usually the case anyway.
+ if (!$ent_id) {
+ $ent_id = 1;
+ }
+ $sid = sqimap_session_id($uid_support);
+ // Don't kill the connection if the browser is over a dialup
+ // and it would take over 30 seconds to download it.
+
+ // donĀ“t call set_time_limit in safe mode.
+ if (!ini_get("safe_mode")) {
+ set_time_limit(0);
+ }
+ if ($uid_support) {
+ $sid_s = substr($sid,0,strpos($sid, ' '));
+ } else {
+ $sid_s = $sid;
+ }
+
+ $body = mime_fetch_body ($imap_stream, $id, $ent_id);
+ echo decodeBody($body, $encoding);
+ return;
+/*
+ fputs ($imap_stream, "$sid FETCH $id BODY[$ent_id]\r\n");
+ $cnt = 0;
+ $continue = true;
+ $read = fgets ($imap_stream,8192);
+
+
+ // This could be bad -- if the section has sqimap_session_id() . ' OK'
+ // or similar, it will kill the download.
+ while (!ereg("^".$sid_s." (OK|BAD|NO)(.*)$", $read, $regs)) {
+ if (trim($read) == ')==') {
+ $read1 = $read;
+ $read = fgets ($imap_stream,4096);
+ if (ereg("^".$sid." (OK|BAD|NO)(.*)$", $read, $regs)) {
+ return;
+ } else {
+ echo decodeBody($read1, $encoding) .
+ decodeBody($read, $encoding);
+ }
+ } else if ($cnt) {
+ echo decodeBody($read, $encoding);
+ }
+ $read = fgets ($imap_stream,4096);
+ $cnt++;
+// break;
+ }
+*/
+}
+
+/* -[ END MIME DECODING ]----------------------------------------------------------- */
+
+// This is here for debugging purposese. It will print out a list
+// of all the entity IDs that are in the $message object.
+
+function listEntities ($message) {
+ if ($message) {
+ echo "<tt>" . $message->entity_id . ' : ' . $message->type0 . '/' . $message->type1 . ' parent = '. $message->parent->entity_id. '<br>';
+ for ($i = 0;isset($message->entities[$i]); $i++) {
+ echo "$i : ";
+ $msg = listEntities($message->entities[$i]);
+
+ if ($msg) {
+ echo "return: ";
+ return $msg;
+ }
+ }
+ }
+}
+
+function getPriorityStr($priority) {
+ $priority_level = substr($priority,0,1);
+
+ switch($priority_level) {
+ /* check for a higher then normal priority. */
+ case '1':
+ case '2':
+ $priority_string = _("High");
+ break;
+
+ /* check for a lower then normal priority. */
+ case '4':
+ case '5':
+ $priority_string = _("Low");
+ break;
+
+ /* check for a normal priority. */
+ case '3':
+ default:
+ $priority_level = '3';
+ $priority_string = _("Normal");
+ break;