'DATE', 1=> 'DATE', 2=> 'FROM', 3=> 'FROM', 4=> 'SUBJECT', 5=> 'SUBJECT'); if ($internal_date_sort == true) { $sort_on[0] = 'ARRIVAL'; $sort_on[1] = 'ARRIVAL'; } if ($sent_folder == $mailbox) { $sort_on[2] = 'TO'; $sort_on[3] = 'TO'; } if (!empty($sort_on[$sort])) { $sort_query = "$sid SORT ($sort_on[$sort]) ".strtoupper($default_charset)." ALL\r\n"; fputs($imap_stream, $sort_query); $sort_test = sqimap_read_data($imap_stream, $sid, true ,$response, $message); } if (isset($sort_test[0])) { if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) { $server_sort_array = preg_split("/ /", trim($regs[1])); } } if ($sort == 0 || $sort == 2 || $sort == 4) { $server_sort_array = array_reverse($server_sort_array); } if (!preg_match("/OK/", $response)) { $server_sort_array = 'no'; } sqsession_register($server_sort_array, 'server_sort_array'); return $server_sort_array; } function sqimap_get_php_sort_order ($imap_stream, $mbxresponse) { global $uid_support; if (sqsession_is_registered('php_sort_array')) { sqsession_unregister('php_sort_array'); } $sid = sqimap_session_id($uid_support); $php_sort_array = array(); if ($uid_support) { if (isset($mbxresponse['UIDNEXT']) && $mbxresponse['UIDNEXT']) { $uidnext = $mbxresponse['UIDNEXT']-1; } else { $uidnext = '*'; } $uid_query = "$sid SEARCH UID 1:$uidnext\r\n"; fputs($imap_stream, $uid_query); $uids = sqimap_read_data($imap_stream, $sid, true ,$response, $message); if (isset($uids[0])) { if (preg_match("/^\* SEARCH (.+)$/", $uids[0], $regs)) { $php_sort_array = preg_split("/ /", trim($regs[1])); } } if (!preg_match("/OK/", $response)) { $php_sort_array = 'no'; } } else { $qty = $mbxresponse['EXISTS']; $php_sort_array = range(1, $qty); } sqsession_register($php_sort_array, 'php_sort_array'); return $php_sort_array; } /* returns an indent array for printMessageinfo() this represents the amount of indent needed (value) for this message number (key) */ function get_parent_level ($imap_stream) { global $sort_by_ref, $default_charset, $thread_new; $parent = ""; $child = ""; $cutoff = 0; /* loop through the threads and take unwanted characters out of the thread string then chop it up */ for ($i=0;$iparseThread($thread_list); print_r($t); echo $thread_list; $char_count = count($thread_temp); $counter = 0; $thread_new = array(); $k = 0; $thread_new[0] = ""; for ($i=0;$i<$char_count;$i++) { if ($thread_temp[$i] != ')' && $thread_temp[$i] != '(') { $thread_new[$k] = $thread_new[$k] . $thread_temp[$i]; } elseif ($thread_temp[$i] == '(') { $thread_new[$k] .= $thread_temp[$i]; $counter++; } elseif ($thread_temp[$i] == ')') { if ($counter > 1) { $thread_new[$k] .= $thread_temp[$i]; $counter = $counter - 1; } else { $thread_new[$k] .= $thread_temp[$i]; $k++; $thread_new[$k] = ""; $counter = $counter - 1; } } } sqsession_register($thread_new, 'thread_new'); $thread_new = array_reverse($thread_new); $thread_list = implode(" ", $thread_new); $thread_list = str_replace("(", " ", $thread_list); $thread_list = str_replace(")", " ", $thread_list); $thread_list = preg_split("/\s/", $thread_list, -1, PREG_SPLIT_NO_EMPTY); $server_sort_array = $thread_list; sqsession_register($server_sort_array, 'server_sort_array'); return $thread_list; } class thread { var $thread_cnt=0, $id='', $childs = array(); function addChild($id) { $this->childs[] = new thread(); } function parseThread($thread_list, $i=0, $thread_cnt=0) { $par = false; $thread_id = ''; for ($cnt = strlen($thread_list);$i<$cnt;++$i) { $char = $thread_list{$i}; switch ($char) { case '(': $par = new thread(); ++$thread_cnt; $thread_id = ''; break; case ' ': $par->id = $thread_id; ++$thread_cnt; $res_a = $this->parseThread($thread,$i, $thread_cnt); $par->childs[] = $res_a[0]; $i = $res_a[1]; $thread_id = ''; break; case ')': if ($thread_id) { $par->id = $thread_id; $thread_id=''; } $par->thread_cnt=$thread_cnt; if (count($this->childs)) { return array($par, $i); } else { $this->childs[] = $par; } default: $thread_id .= $char; break; } } print_r($this); } } function elapsedTime($start) { $stop = gettimeofday(); $timepassed = 1000000 * ($stop['sec'] - $start['sec']) + $stop['usec'] - $start['usec']; return $timepassed; } function sqimap_get_small_header_list ($imap_stream, $msg_list) { global $squirrelmail_language, $color, $data_dir, $username, $imap_server_type; global $uid_support; /* Get the small headers for each message in $msg_list */ $sid = sqimap_session_id($uid_support); $maxmsg = sizeof($msg_list); $msgs_str = sqimap_message_list_squisher($msg_list); $results = array(); $read_list = array(); /* * We need to return the data in the same order as the caller supplied * in $msg_list, but IMAP servers are free to return responses in * whatever order they wish... So we need to re-sort manually */ for ($i = 0; $i < sizeof($msg_list); $i++) { $id2index[$msg_list[$i]] = $i; } $internaldate = getPref($data_dir, $username, 'internal_date_sort'); if ($internaldate) { $query = "$sid FETCH $msgs_str (FLAGS UID RFC822.SIZE INTERNALDATE BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject X-Priority Content-Type)])\r\n"; } else { $query = "$sid FETCH $msgs_str (FLAGS UID RFC822.SIZE BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject X-Priority Content-Type)])\r\n"; } fputs ($imap_stream, $query); $readin_list = sqimap_read_data_list($imap_stream, $sid, false, $response, $message); $i = 0; foreach ($readin_list as $r) { if (!$uid_support) { if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH/iAU",$r[0], $regs)) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . '
' . _("Unknown response from IMAP server: ") . ' 1.' . $r[0] . "

\n"; } else if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . '
' . _("Unknown message number in reply from server: ") . $regs[1] . "

\n"; } else { $read_list[$id2index[$regs[1]]] = $r; } } else { if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH.*UID\s+([0-9]+)\s+/iAU",$r[0], $regs)) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . '
' . _("Unknown response from IMAP server: ") . ' 1.' . $r[0] . "

\n"; } else if (! isset($id2index[$regs[2]]) || !count($id2index[$regs[2]])) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . '
' . _("Unknown message number in reply from server: ") . $regs[2] . "

\n"; } else { $read_list[$id2index[$regs[2]]] = $r; $unique_id = $regs[2]; } } } arsort($read_list); $patterns = array ( "/^To:(.*)\$/AUi", "/^From:(.*)\$/AUi", "/^X-Priority:(.*)\$/AUi", "/^Cc:(.*)\$/AUi", "/^Date:(.*)\$/AUi", "/^Subject:(.*)\$/AUi", "/^Content-Type:(.*)\$/AUi" ); $regpattern = ''; for ($msgi = 0; $msgi < $maxmsg; $msgi++) { $subject = _("(no subject)"); $from = _("Unknown Sender"); $priority = 0; $messageid = "<>"; $cc = ""; $to = ""; $date = ""; $type[0] = ""; $type[1] = ""; $inrepto = ""; $flag_seen = false; $flag_answered = false; $flag_deleted = false; $flag_flagged = false; $read = $read_list[$msgi]; $prevline = false; foreach ($read as $read_part) { //unfold multi-line headers if ($prevline && strpos($read_part, "\t ") === true) { $read_part = substr($prevline, 0, -2) . preg_replace('/(\t\s+)/',' ',$read_part); } $prevline = $read_part; if ($read_part{0} == '*') { if ($internaldate) { if (preg_match ("/^.+INTERNALDATE\s+\"(.+)\".+/iUA",$read_part, $reg)) { $tmpdate = trim($reg[1]); $tmpdate = str_replace(' ',' ',$tmpdate); $tmpdate = explode(' ',$tmpdate); $date = str_replace('-',' ',$tmpdate[0]) . " " . $tmpdate[1] . " " . $tmpdate[2]; } } if (preg_match ("/^.+RFC822.SIZE\s+(\d+).+/iA",$read_part, $reg)) { $size = $reg[1]; } if (preg_match("/^.+FLAGS\s+\((.*)\).+/iUA", $read_part, $regs)) { $flags = explode(' ',trim($regs[1])); foreach ($flags as $flag) { $flag = strtolower($flag); if ($flag == '\\seen') { $flag_seen = true; } else if ($flag == '\\answered') { $flag_answered = true; } else if ($flag == '\\deleted') { $flag_deleted = true; } else if ($flag == '\\flagged') { $flag_flagged = true; } } } if (preg_match ("/^.+UID\s+(\d+).+/iA",$read_part, $reg)) { $unique_id = $reg[1]; } } else { $firstchar = $read_part{0}; if ($firstchar == 'T') { $regpattern = $patterns[0]; $id = 1; } else if ($firstchar == 'F') { $regpattern = $patterns[1]; $id = 2; } else if ($firstchar == 'X') { $regpattern = $patterns[2]; $id = 3; } else if ($firstchar == 'C') { if (strtolower($read_part{1}) == 'c') { $regpattern = $patterns[3]; $id = 4; } else if (strtolower($read_part{1}) == 'o') { $regpattern = $patterns[6]; $id = 7; } } else if ($firstchar == 'D' && !$internaldate ) { $regpattern = $patterns[4]; $id = 5; } else if ($firstchar == 'S') { $regpattern = $patterns[5]; $id = 6; } else $regpattern = ''; if ($regpattern) { if (preg_match ($regpattern, $read_part, $regs)) { switch ($id) { case 1: $to = $regs[1]; break; case 2: $from = $regs[1]; break; case 3: $priority = $regs[1]; break; case 4: $cc = $regs[1]; break; case 5: $date = $regs[1]; break; case 6: $subject = htmlspecialchars(trim($regs[1])); if ($subject == "") { $subject = _("(no subject)"); } break; case 7: $type = strtolower(trim($regs[1])); if ($pos = strpos($type, ";")) { $type = substr($type, 0, $pos); } $type = explode("/", $type); if (!isset($type[1])) { $type[1] = ''; } break; default: break; } } } } } $header = new small_header; if ($uid_support) { $header->uid = $unique_id; } else { $header->uid = $msg_list[$msgi]; } $header->date = $date; $header->subject = $subject; $header->to = $to; $header->from = $from; $header->priority = $priority; $header->message_id = $messageid; $header->cc = $cc; $header->size = $size; $header->type0 = $type[0]; $header->type1 = $type[1]; $header->flag_seen = $flag_seen; $header->flag_answered = $flag_answered; $header->flag_deleted = $flag_deleted; $header->flag_flagged = $flag_flagged; $header->inrepto = $inrepto; $result[] = $header; } return $result; } function sqimap_get_headerfield($imap_stream, $field) { $sid = sqimap_session_id(false); $results = array(); $read_list = array(); $query = "$sid FETCH 1:* (UID BODY.PEEK[HEADER.FIELDS ($field)])\r\n"; fputs ($imap_stream, $query); $readin_list = sqimap_read_data_list($imap_stream, $sid, false, $response, $message); $i = 0; foreach ($readin_list as $r) { $r = implode('',$r); /* first we unfold the header */ $r = str_replace(array("\r\n\t","\r\n\s"),array('',''),$r); /* * now we can make a new header array with each element representing * a headerline */ $r = explode("\r\n" , $r); if (!$uid_support) { if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH/iAU",$r[0], $regs)) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . '
' . _("Unknown response from IMAP server: ") . ' 1.' . $r[0] . "

\n"; } else { $id = $regs[1]; } } else { if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH.*UID\s+([0-9]+)\s+/iAU",$r[0], $regs)) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . '
' . _("Unknown response from IMAP server: ") . ' 1.' . $r[0] . "

\n"; } else { $id = $regs[2]; } } $field = $r[1]; $field = substr($field,strlen($field)+2); $result[] = array($id,$field); } return $result; } /* * Returns a message array with all the information about a message. * See the documentation folder for more information about this array. */ function sqimap_get_message ($imap_stream, $id, $mailbox) { global $uid_support; $flags = array(); $read = sqimap_run_command ($imap_stream, "FETCH $id (FLAGS BODYSTRUCTURE)", true, $response, $message, $uid_support); if ($read) { if (preg_match('/.+FLAGS\s\((.*)\)\s/AUi',$read[0],$regs)) { if (trim($regs[1])) { $flags = preg_split('/ /', $regs[1],-1,'PREG_SPLIT_NI_EMPTY'); } } } else { echo "ERROR Yeah I know, not a very usefull errormessage (id = $id, mailbox = $mailbox sqimap_get_message)"; exit; } $bodystructure = implode('',$read); $msg = mime_structure($bodystructure,$flags); $read = sqimap_run_command ($imap_stream, "FETCH $id BODY[HEADER]", true, $response, $message, $uid_support); $rfc822_header = new Rfc822Header(); $rfc822_header->parseHeader($read); $msg->rfc822_header = $rfc822_header; return $msg; } /* Wrapper function that reformats the header information. */ function sqimap_get_message_header ($imap_stream, $id, $mailbox) { global $uid_support; $read = sqimap_run_command ($imap_stream, "FETCH $id BODY[HEADER]", true, $response, $message, $uid_support); $header = sqimap_get_header($imap_stream, $read); $header->id = $id; $header->mailbox = $mailbox; return $header; } /* Wrapper function that reformats the entity header information. */ function sqimap_get_ent_header ($imap_stream, $id, $mailbox, $ent) { global $uid_support; $read = sqimap_run_command ($imap_stream, "FETCH $id BODY[$ent.HEADER]", true, $response, $message, $uid_support); $header = sqimap_get_header($imap_stream, $read); $header->id = $id; $header->mailbox = $mailbox; return $header; } /* Wrapper function that returns entity headers for use by decodeMime */ /* function sqimap_get_entity_header ($imap_stream, &$read, &$type0, &$type1, &$bound, &$encoding, &$charset, &$filename) { $header = sqimap_get_header($imap_stream, $read); $type0 = $header["TYPE0"]; $type1 = $header["TYPE1"]; $bound = $header["BOUNDARY"]; $encoding = $header["ENCODING"]; $charset = $header["CHARSET"]; $filename = $header["FILENAME"]; } /* function to get the mime headers */ function sqimap_get_mime_ent_header ($imap_stream, $id, $mailbox, $ent) { global $uid_support; $read = sqimap_run_command ($imap_stream, "FETCH $id:$id BODY[$ent.MIME]", true, $response, $message, $uid_support); $header = sqimap_get_header($imap_stream, $read); $header->id = $id; $header->mailbox = $mailbox; return $header; } /* Returns the body of a message. */ function sqimap_get_message_body ($imap_stream, &$header) { // return decodeMime($imap_stream, $header->id); } ?>