X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fmailbox.php;h=45dbbb7a97bf802488a1e87876a8b3b5a004b119;hb=df978e807f87dce0478a71a5c264743f65bee34a;hp=1bcc6340663bc740ce9fa44723cba8745457cc10;hpb=aa4c3749e589871cd930b3cd2e94ccaeb5a71bc5;p=squirrelmail.git diff --git a/functions/mailbox.php b/functions/mailbox.php index 1bcc6340..45dbbb7a 100644 --- a/functions/mailbox.php +++ b/functions/mailbox.php @@ -20,42 +20,73 @@ } } - function getMessageHeaders($imapConnection, $i, &$from, &$subject, &$date) { - fputs($imapConnection, "messageFetch FETCH $i:$i RFC822.HEADER.LINES (From Subject Date)\n"); - $read = fgets($imapConnection, 1024); - /* I have to replace <> with [] because HTML uses <> as tags, thus not printing what's in <> */ - $read = ereg_replace("<", "[", $read); - $read = ereg_replace(">", "]", $read); + /** This function sends a request to the IMAP server for headers, 50 at a time + ** until $end is reached. I originally had it do them all at one time, but found + ** it slightly faster to do it this way. + ** + ** Originally we had getMessageHeaders get the headers for one message at a time. + ** Doing it in bunches gave us a speed increase from 9 seconds (for a box of 800 + ** messages) to about 3.5 seconds. + **/ + function getMessageHeaders($imapConnection, $start, $end, &$from, &$subject, &$date) { + $rel_start = $start; + if (($start > $end) || ($start < 1)) { + echo "Error in message header fetching. Start message: $start, End message: $end
"; + exit; + } - while ((substr($read, 0, 15) != "messageFetch OK") && (substr($read, 0, 16) != "messageFetch BAD")) { - if (substr($read, 0, 5) == "From:") { - $read = ereg_replace("<", "EMAILSTART--", $read); - $read = ereg_replace(">", "--EMAILEND", $read); - $from = substr($read, 5, strlen($read) - 6); - } - else if (substr($read, 0, 5) == "Date:") { - $read = ereg_replace("<", "[", $read); - $read = ereg_replace(">", "]", $read); - $date = substr($read, 5, strlen($read) - 6); - } - else if (substr($read, 0, 8) == "Subject:") { - $read = ereg_replace("<", "[", $read); - $read = ereg_replace(">", "]", $read); - $subject = substr($read, 8, strlen($read) - 9); + while ($rel_start <= $end) { + if ($end - $rel_start > 50) { + $rel_end = $rel_start + 50; + } else { + $rel_end = $end; } - + fputs($imapConnection, "messageFetch FETCH $rel_start:$rel_end RFC822.HEADER.LINES (From Subject Date)\n"); $read = fgets($imapConnection, 1024); + + $from_num = $rel_start - 1; + $date_num = $rel_start - 1; + $subj_num = $rel_start - 1; + while ((substr($read, 0, 15) != "messageFetch OK") && (substr($read, 0, 16) != "messageFetch BAD")) { + if (substr($read, 0, 5) == "From:") { + $read = ereg_replace("<", "EMAILSTART--", $read); + $read = ereg_replace(">", "--EMAILEND", $read); + $from[$from_num] = substr($read, 5, strlen($read) - 6); + $from_num++; + } + else if (substr($read, 0, 5) == "Date:") { + $read = ereg_replace("<", "<", $read); + $read = ereg_replace(">", ">", $read); + $date[$date_num] = substr($read, 5, strlen($read) - 6); + $date_num++; + } + else if (substr($read, 0, 8) == "Subject:") { + $read = ereg_replace("<", "<", $read); + $read = ereg_replace(">", ">", $read); + $subject[$subj_num] = substr($read, 8, strlen($read) - 9); + $subj_num++; + } + $read = fgets($imapConnection, 1024); + } + $rel_start = $rel_start + 50; } } - function setMessageFlag($imapConnection, $i, $flag) { - fputs($imapConnection, "messageStore STORE $i:$i +FLAGS (\\$flag)\n"); + function setMessageFlag($imapConnection, $i, $q, $flag) { + fputs($imapConnection, "messageStore STORE $i:$q +FLAGS (\\$flag)\n"); } - function getMessageFlags($imapConnection, $i, &$flags) { + /** This function gets the flags for message $j. It does only one message at a + ** time, rather than doing groups of messages (like getMessageHeaders does). + ** I found it one or two seconds quicker (on a box of 800 messages) to do it + ** individually. I'm not sure why it happens like that, but that's what my + ** testing found. Perhaps later I will be proven wrong and this will change. + **/ + function getMessageFlags($imapConnection, $j, &$flags) { /** * 2 FETCH (FLAGS (\Answered \Seen)) */ - fputs($imapConnection, "messageFetch FETCH $i:$i FLAGS\n"); + fputs($imapConnection, "messageFetch FETCH $j:$j FLAGS\n"); $read = fgets($imapConnection, 1024); + $count = 0; while ((substr($read, 0, 15) != "messageFetch OK") && (substr($read, 0, 16) != "messageFetch BAD")) { if (strpos($read, "FLAGS")) { $read = ereg_replace("\(", "", $read); @@ -71,6 +102,7 @@ } else { $flags[0] = "None"; } + $count++; $read = fgets($imapConnection, 1024); } } @@ -146,4 +178,19 @@ echo "UNKNOWN ERROR copying messages $from_id to $to_id to folder $folder.
"; return false; } + + /** expunges a mailbox **/ + function expungeBox($imapConnection, $mailbox) { + selectMailbox($imapConnection, $mailbox, $num); + fputs($imapConnection, "1 EXPUNGE\n"); + } + + function getFolderNameMinusINBOX($mailbox) { + if (substr($mailbox, 0, 6) == "INBOX.") + $box = substr($mailbox, 6, strlen($mailbox)); + else + $box = $mailbox; + + return $box; + } ?>