X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fimap_messages.php;h=c2fc852e0263ad254c60a35c1fbd33882b2461df;hp=1835bdb35cf4bfa68028adea84f16a5e1f7e1162;hb=7b07404cee57add9400e4ac4e2b247b33db2b0de;hpb=60a3e687435735d075246ceaac87963df079a0af diff --git a/functions/imap_messages.php b/functions/imap_messages.php index 1835bdb3..c2fc852e 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -81,7 +81,7 @@ function get_reference_header ($imap_stream, $message) { $sid = sqimap_session_id(); $results = array(); $references = ""; - $query = "$sid FETCH $message BODY.PEEK[HEADER.FIELDS (References)]\r\n"; + $query = "$sid FETCH $message BODY[HEADER.FIELDS (References)]\r\n"; fputs ($imap_stream, $query); $responses = sqimap_read_data_list($imap_stream, $sid, true, $responses, $message); if (!eregi("^\\* ([0-9]+) FETCH", $responses[0][0], $regs)) { @@ -97,10 +97,19 @@ function get_reference_header ($imap_stream, $message) { */ function sqimap_get_sort_order ($imap_stream, $sort) { - global $default_charset, $thread_sort_messages, $internal_date_sort, $server_sort_array; + global $default_charset, $thread_sort_messages, + $internal_date_sort, $server_sort_array, + $sent_folder, $mailbox; + if (session_is_registered('server_sort_array')) { session_unregister('server_sort_array'); } + if ($sort == 6) { + $qty = sqimap_get_num_messages ($imap_stream, $mailbox); + $server_sort_array = range(1, $qty); + session_register('server_sort_array'); + return $server_sort_array; + } $sid = sqimap_session_id(); $sort_on = array(); $reverse = 0; @@ -112,36 +121,49 @@ function sqimap_get_sort_order ($imap_stream, $sort) { 2=> 'FROM', 3=> 'FROM', 4=> 'SUBJECT', - 5=> 'SUBJECT', - 6=> 'DATE'); + 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); + $sort_test = sqimap_read_data($imap_stream, $sid, false, $response, $message); } - if (preg_match("/^\* SORT (.+)$/", $sort_test[0], $regs)) { - $server_sort_array = preg_split("/ /", trim($regs[1])); + 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'; + } session_register('server_sort_array'); return $server_sort_array; } /* returns an indent array for printMessageinfo() - this represents the amount of indent needed - for this message number + 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;$i' . _("ERROR : Could not complete request.") . '
' . _("Unknown response from IMAP server: ") . ' 1.' . $r[0] . "

\n"; - } else if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) { + + } else if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) { set_up_language($squirrelmail_language); echo '
' . _("ERROR : Could not complete request.") . @@ -315,37 +376,21 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { _("Unknown message number in reply from server: ") . $regs[1] . "
\n"; } else { - $read_list[$id2index[$regs[1]]] = $r; + $read_list[$id2index[$regs[1]]] = $r; } } arsort($read_list); - $query = "$sid FETCH $msgs_str RFC822.SIZE\r\n"; - fputs ($imap_stream, $query); - $sizesin_list = sqimap_read_data_list($imap_stream, $sid, true, $response, $message); - - foreach ($sizesin_list as $r) { - if (!eregi("^\\* ([0-9]+) FETCH", $r[0], $regs)) { - set_up_language($squirrelmail_language); - echo "
\n"; - echo _("ERROR : Could not complete request."); - echo "
\n"; - echo _("Unknown response from IMAP server: ") . ' 2.'; - echo $r[0] . "

\n"; - exit; - } - if (!count($id2index[$regs[1]])) { - set_up_language($squirrelmail_language); - echo "
\n"; - echo _("ERROR : Could not complete request."); - echo "
\n"; - echo _("Unknown messagenumber in reply from server: "); - echo $regs[1] . "

\n"; - exit; - } - $sizes_list[$id2index[$regs[1]]] = $r; - } - arsort($sizes_list); + $patterns = array ( + "/^To:(.*)/iA", + "/^From:(.*)/iA", + "/^X-Priority:(.*)/iA", + "/^Cc:(.*)/iA", + "/^Date:(.*)/iA", + "/^Subject:(.*)/iA", + "/^Content-Type:(.*)/iA" + ); + $regpattern = ''; for ($msgi = 0; $msgi < $maxmsg; $msgi++) { $subject = _("(no subject)"); @@ -358,58 +403,116 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { $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 while ($prevline && strspn($read_part, "\t ") > 0) { $read_part = substr($prevline, 0, -2) . ' ' . ltrim($read_part); } - $prevline = $read_part; - if (eregi ("^to:(.*)$", $read_part, $regs)) { - $to = $regs[1]; - } else if (eregi ("^from:(.*)$", $read_part, $regs)) { - $from = $regs[1]; - } else if (eregi ("^x-priority:(.*)$", $read_part, $regs)) { - $priority = trim($regs[1]); - } else if (eregi ("^message-id:(.*)$", $read_part, $regs)) { - $messageid = trim($regs[1]); - } else if (eregi ("^cc:(.*)$", $read_part, $regs)) { - $cc = $regs[1]; - } else if (eregi ("^date:(.*)$", $read_part, $regs)) { - $date = $regs[1]; - } else if (eregi ("^subject:(.*)$", $read_part, $regs)) { - $subject = htmlspecialchars(trim($regs[1])); - if ($subject == "") { - $subject = _("(no subject)"); - } - } else if (eregi ("^content-type:(.*)$", $read_part, $regs)) { - $type = strtolower(trim($regs[1])); - if ($pos = strpos($type, ";")) { - $type = substr($type, 0, $pos); - } - $type = explode("/", $type); - if (!isset($type[1])) { - $type[1] = ''; - } - } else if (eregi ("^in-reply-to:(.*)$", $read_part, $regs)) { - $inrepto = trim($regs[1]); - } - } - $internaldate = getPref($data_dir, $username, 'internal_date_sort'); - if (trim($date) == "" || $internaldate) { - fputs($imap_stream, "$sid FETCH $msg_list[$msgi] INTERNALDATE\r\n"); - $readdate = sqimap_read_data($imap_stream, $sid, true, $response, $message); - if (eregi(".*INTERNALDATE \"(.*)\".*", $readdate[0], $regs)) { - $date_list = explode(' ', trim($regs[1])); - $date_list[0] = str_replace("-", ' ', $date_list[0]); - $date = implode(' ', $date_list); - } - } - eregi("([0-9]+)[^0-9]*$", $sizes_list[$msgi][0], $regs); - $size = $regs[1]; + $prev_line = $read_part; + + if ($read_part{0} == '*') { + if ($internaldate) { + if (preg_match ("/^.+INTERNALDATE\s\"(.+)\"\s.+/iUA",$read_part, $reg)) { + $date = $reg[1]; + } + } + 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; + } + } + } + } 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') { + $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: + if (!$internaldate) { + $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 ($issent) { $header->from = (trim($to) != '' ? $to : '(' ._("No To Address") . ')'); @@ -426,12 +529,20 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { $header->size = $size; $header->type0 = $type[0]; $header->type1 = $type[1]; - $header->inrepto = $inrepto; + $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; } + echo 'processtime (us): ' . elapsedtime($start) .'
'; return $result; } + + + /* Returns the flags for the specified messages */ function sqimap_get_flags ($imap_stream, $i) { $read = sqimap_run_command ($imap_stream, "FETCH $i:$i FLAGS", true, $response, $message); @@ -577,6 +688,17 @@ function sqimap_get_header ($imap_stream, $read) { } else { $hdr->charset = "us-ascii"; } + /* Detect type in case of multipart/related */ + if (strpos(strtolower(trim($line)), "type=")) { + $pos = strpos($line, "type=") + 6; + $type = trim($line); + if (strpos($line, ";", $pos) > 0) { + $type = substr($type, $pos, strpos($line, ";", $pos)-$pos); + } else { + $type = substr($type, $pos); + } + $hdr->type = $type; + } } else if (strtolower(substr($read[$i], 0, 20)) == "content-disposition:") { /* Add better content-disposition support */