$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)) {
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<count($thread_new);$i++) {
+ $thread_new[$i] = preg_replace("/\s\(/", "(", $thread_new[$i]);
+ $thread_new[$i] = preg_replace("/(\d+)/", "$1|", $thread_new[$i]);
+ $thread_new[$i] = preg_split("/\|/", $thread_new[$i], -1, PREG_SPLIT_NO_EMPTY);
+ }
+ $indent_array = array();
+ if (!$thread_new) {
+ $thread_new = array();
+ }
+ /* looping through the parts of one message thread */
+
+ for ($i=0;$i<count($thread_new);$i++) {
+ /* first grab the parent, it does not indent */
+
+ if (isset($thread_new[$i][0])) {
+ if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
+ $parent = $regs[1];
+ }
+ }
+ $indent_array[$parent] = 0;
+
+ /* now the children, checking each thread portion for
+ ),(, and space, adjusting the level and space values
+ to get the indent level
+ */
+ $level = 0;
+ $spaces = 0;
+ $indent = 0;
+ $fake = FALSE;
+ for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
+ $chars = count_chars($thread_new[$i][$k], 1);
+ if (isset($chars['40'])) { /* testing for ( */
+ $level = $level + $chars['40'];
+ }
+ if (isset($chars['41'])) { /* testing for ) */
+ $level = $level - $chars['41'];
+ $spaces = 0;
+ /* if we were faking lets stop, this portion
+ of the thread is over
+ */
+ if ($level == $cutoff) {
+ $fake = FALSE;
+ }
+ }
+ if (isset($chars['32'])) { /* testing for space */
+ $spaces = $spaces + $chars['32'];
+ }
+ $indent = $level + $spaces;
+ /* must have run into a message that broke the thread
+ so we are adjusting for that portion
+ */
+ if ($fake == TRUE) {
+ $indent = $indent +1;
+ }
+ if (preg_match("/(\d+)/", $thread_new[$i][$k], $regs)) {
+ $child = $regs[1];
+ }
+ /* the thread must be broken if $indent == 0
+ so indent the message once and start faking it
+ */
+ if ($indent == 0) {
+ $indent = 1;
+ $fake = TRUE;
+ $cutoff = $level;
+ }
+ /* dont need abs but if indent was negative
+ errors would occur
+ */
+ $indent_array[$child] = abs($indent);
+ }
+ }
+ return $indent_array;
+}
+
+
+/* returns an array with each element as a string
+ representing one message thread as returned by
+ the IMAP server
+*/
+
+function get_thread_sort ($imap_stream) {
+ global $thread_new, $sort_by_ref, $default_charset, $server_sort_array;
+ if (session_is_registered('thread_new')) {
+ session_unregister('thread_new');
+ }
+ if (session_is_registered('server_sort_array')) {
+ session_unregister('server_srot_array');
+ }
+ $sid = sqimap_session_id();
+ $thread_temp = array ();
+ if ($sort_by_ref == 1) {
+ $sort_type = 'REFERENCES';
+ }
+ else {
+ $sort_type = 'ORDEREDSUBJECT';
+ }
+ $thread_query = "$sid THREAD $sort_type ".strtoupper($default_charset)." ALL\r\n";
+ fputs($imap_stream, $thread_query);
+ $thread_test = sqimap_read_data($imap_stream, $sid, false, $response, $message);
+ if (isset($thread_test[0])) {
+ if (preg_match("/^\* THREAD (.+)$/", $thread_test[0], $regs)) {
+ $thread_list = trim($regs[1]);
+ }
+ }
+ else {
+ $thread_list = "";
+ }
+ if (!preg_match("/OK/", $response)) {
+ $server_sort_array = 'no';
+ return $server_sort_array;
+ }
+ $thread_temp = preg_split("//", $thread_list, -1, PREG_SPLIT_NO_EMPTY);
+ $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;
+ }
+ }
+ }
+ 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;
$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
$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)) {
$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++;
} 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 */