Made special character handling better in From and Subject
[squirrelmail.git] / functions / mailbox.php
index 1bcc6340663bc740ce9fa44723cba8745457cc10..45dbbb7a97bf802488a1e87876a8b3b5a004b119 100644 (file)
       }
    }
 
-   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<BR>";
+         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("<", "&lt;", $read);
+               $read = ereg_replace(">", "&gt;", $read);
+               $date[$date_num] = substr($read, 5, strlen($read) - 6);
+               $date_num++;
+            }
+            else if (substr($read, 0, 8) == "Subject:") {
+               $read = ereg_replace("<", "&lt;", $read);
+               $read = ereg_replace(">", "&gt;", $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);
          } else {
             $flags[0] = "None";
          }
+         $count++;
          $read = fgets($imapConnection, 1024);
       }
    }
       echo "UNKNOWN ERROR copying messages $from_id to $to_id to folder $folder.<BR>";
       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;
+   }
 ?>