-function sqimap_get_small_header_list ($imap_stream, $msg_list, $issent) {
- global $squirrelmail_language, $color, $data_dir, $username, $imap_server_type;
- $start = gettimeofday();
- /* Get the small headers for each message in $msg_list */
- $sid = sqimap_session_id();
- $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 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 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, true, $response, $message);
-
- foreach ($readin_list as $r) {
- if (!preg_match("/^\\*\s+([0-9]+)\s+FETCH/iAU",$r[0], $regs)) {
- set_up_language($squirrelmail_language);
- echo '<br><b><font color=$color[2]>' .
- _("ERROR : Could not complete request.") .
- '</b><br>' .
- _("Unknown response from IMAP server: ") . ' 1.' .
- $r[0] . "</font><br>\n";
-
- } else if (! isset($id2index[$regs[1]]) || !count($id2index[$regs[1]])) {
- set_up_language($squirrelmail_language);
- echo '<br><b><font color=$color[2]>' .
- _("ERROR : Could not complete request.") .
- '</b><br>' .
- _("Unknown message number in reply from server: ") .
- $regs[1] . "</font><br>\n";
- } else {
- $read_list[$id2index[$regs[1]]] = $r;
- }
- }
- 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
- while ($prevline && strspn($read_part, "\t ") > 0) {
- $read_part = substr($prevline, 0, -2) . ' ' . ltrim($read_part);
- }
- $prev_line = $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;
- }
- }
- }
- } 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 ($issent) {
- $header->from = (trim($to) != '' ? $to : '(' ._("No To Address") . ')');
- } else {
- $header->from = $from;
- }
-
- $header->date = $date;
- $header->subject = $subject;
- $header->to = $to;
- $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;
- }
-// echo 'processtime (us): ' . elapsedtime($start) .'<BR>';
- return $result;