X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fimap_messages.php;h=8ae69c3c9c10c8759cd40622718199028e89c740;hb=0c46707d33b0e134bc2edba3362b043b56e9b5e1;hp=031122c9ed48e812dbad76f85890fb058ed573fc;hpb=3411d4ec9a699200e2a77256df2bd8da1f346a82;p=squirrelmail.git diff --git a/functions/imap_messages.php b/functions/imap_messages.php index 031122c9..8ae69c3c 100755 --- a/functions/imap_messages.php +++ b/functions/imap_messages.php @@ -75,6 +75,241 @@ function sqimap_message_list_squisher($messages_array) { return $msgs_str; } +/* returns the references header lines */ +function get_reference_header ($imap_stream, $message) { + $responses = array (); + $sid = sqimap_session_id(); + $results = array(); + $references = ""; + $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)) { + $responses = array (); + } + return $responses; +} + + +/* get sort order from server and + * return it as the $id array for + * mailbox_display + */ + +function sqimap_get_sort_order ($imap_stream, $sort) { + 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'); + } + $sid = sqimap_session_id(); + $sort_on = array(); + $reverse = 0; + $server_sort_array = array(); + $sort_test = array(); + $sort_query = ''; + $sort_on = array (0=> 'DATE', + 1=> 'DATE', + 2=> 'FROM', + 3=> 'FROM', + 4=> 'SUBJECT', + 5=> 'SUBJECT', + 6=> 'DATE'); + 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, false, $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'; + } + session_register('server_sort_array'); + return $server_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;$i 1) { + $thread_new[$k] .= $thread_temp[$i]; + $counter = $counter - 1; + } + else { + $thread_new[$k] .= $thread_temp[$i]; + $k++; + $thread_new[$k] = ""; + $counter = $counter - 1; + } + } + } + session_register('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; + session_register('server_sort_array'); + return $thread_list; +} + + + function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { global $squirrelmail_language, $color, $data_dir, $username; @@ -85,7 +320,6 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { $results = array(); $read_list = array(); $sizes_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 @@ -95,7 +329,7 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { $id2index[$msg_list[$i]] = $i; } - $query = "$sid FETCH $msgs_str BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority Content-Type)]\r\n"; + $query = "$sid FETCH $msgs_str BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority Content-Type In-Reply-To)]\r\n"; fputs ($imap_stream, $query); $readin_list = sqimap_read_data_list($imap_stream, $sid, true, $response, $message); @@ -157,9 +391,16 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { $date = ""; $type[0] = ""; $type[1] = ""; + $inrepto = ""; $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)) { @@ -186,6 +427,8 @@ function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) { 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'); @@ -217,7 +460,7 @@ 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; $result[] = $header; } return $result; @@ -311,6 +554,12 @@ function sqimap_get_header ($imap_stream, $read) { $hdr->charset = "us-ascii"; while ($i < count($read)) { + //unfold multi-line headers + while ($i + 1 < count($read) && strspn($read[$i + 1], "\t ") > 0) { + $read[$i + 1] = substr($read[$i], 0, -2) . ' ' . ltrim($read[$i + 1]); + array_splice($read, $i, 1); + } + if (substr($read[$i], 0, 17) == "MIME-Version: 1.0") { $hdr->mime = true; $i++; @@ -362,6 +611,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 */