* Made everything here global too to work with new include system
[squirrelmail.git] / functions / imap_messages.php
index 9af572e9fb907efecee8fa80428abfe3fa1cb52b..2c47d5abf5ae5f80dbb2ae67875176eea3225fa9 100755 (executable)
@@ -2,10 +2,14 @@
    /**
     **  imap_messages.php
     **
-    **  This implements functions that manipulate messages 
+    **  This implements functions that manipulate messages
+    **
+    **  $Id$
     **/
 
-   if (!isset($mime_php)) include "../functions/mime.php";
+   if (defined ('imap_messages_php'))
+       return;
+   define ('imap_messages_php', true);
 
    /******************************************************************************
     **  Copies specified messages to specified folder
@@ -21,7 +25,7 @@
    function sqimap_messages_delete ($imap_stream, $start, $end, $mailbox) {
       global $move_to_trash, $trash_folder, $auto_expunge;
 
-      if (($move_to_trash == true) && (sqimap_mailbox_exists($imap_stream, $trash_folder))) {
+      if (($move_to_trash == true) && (sqimap_mailbox_exists($imap_stream, $trash_folder) && ($mailbox != $trash_folder))) {
          sqimap_messages_copy ($imap_stream, $start, $end, $trash_folder);
          sqimap_messages_flag ($imap_stream, $start, $end, "Deleted");
       } else {
       $read = sqimap_read_data ($imap_stream, "a001", true, $response, $message);
    }
 
+
+   /******************************************************************************
+    **  Remove specified flag from specified messages
+    ******************************************************************************/
+   function sqimap_messages_remove_flag ($imap_stream, $start, $end, $flag) {
+      fputs ($imap_stream, "a001 STORE $start:$end -FLAGS (\\$flag)\r\n");
+      $read = sqimap_read_data ($imap_stream, "a001", true, $response, $message);
+   }
+
+
    /******************************************************************************
     **  Returns some general header information -- FROM, DATE, and SUBJECT
     ******************************************************************************/
    class small_header {
-      var $from, $subject, $date, $to, $priority, $message_id;
+      var $from = '', $subject = '', $date = '', $to = '', 
+          $priority = 0, $message_id = 0, $cc = '';
    }
         
    function sqimap_get_small_header ($imap_stream, $id, $sent) {
 
-      fputs ($imap_stream, "a001 FETCH $id BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority)]\r\n");
+      fputs ($imap_stream, "a001 FETCH $id BODY.PEEK[HEADER.FIELDS (Date To From Cc Subject Message-Id X-Priority Content-Type)]\r\n");
       $read = sqimap_read_data ($imap_stream, "a001", true, $response, $message);
 
       $subject = _("(no subject)");
       $from = _("Unknown Sender");
       $priority = "0";
       $messageid = "<>";
+      $cc = "";
+      $to = "";
+      $date = "";
+      $type[0] = "";
+      $type[1] = "";
 
       $g = 0;
       for ($i = 0; $i < count($read); $i++) {
-         if (eregi ("^to:", $read[$i])) {
+         if (eregi ("^to:(.*)$", $read[$i], $regs)) {
             //$to = sqimap_find_displayable_name(substr($read[$i], 3));
-            $to = substr($read[$i], 3);
-             } else if (eregi ("^from:", $read[$i])) {
+            $to = $regs[1];
+        } else if (eregi ("^from:(.*)$", $read[$i], $regs)) {
             //$from = sqimap_find_displayable_name(substr($read[$i], 5));
-            $from = substr($read[$i], 5);
-             } else if (eregi ("^x-priority:", $read[$i])) {
-            $priority = trim(substr($read[$i], 11));
-         } else if (eregi ("^message-id:", $read[$i])) {
-            $messageid = trim(substr($read[$i], 11));
-         } else if (eregi ("^cc:", $read[$i])) {
-            $cc = substr($read[$i], 3);
-         } else if (eregi ("^date:", $read[$i])) {
-            $date = substr($read[$i], 5);
-         } else if (eregi ("^subject:", $read[$i])) {
-            $subject = htmlspecialchars(eregi_replace ("^subject: ", "", $read[$i]));
-            if (trim($subject) == "")
+            $from = $regs[1];
+        } else if (eregi ("^x-priority:(.*)$", $read[$i], $regs)) {
+            $priority = trim($regs[1]);
+         } else if (eregi ("^message-id:(.*)$", $read[$i], $regs)) {
+            $messageid = trim($regs[1]);
+         } else if (eregi ("^cc:(.*)$", $read[$i], $regs)) {
+            $cc = $regs[1];
+         } else if (eregi ("^date:(.*)$", $read[$i], $regs)) {
+            $date = $regs[1];
+         } else if (eregi ("^subject:(.*)$", $read[$i], $regs)) {
+            $subject = htmlspecialchars(trim($regs[1]));
+            if ($subject == "")
                $subject = _("(no subject)");
+         } else if (eregi ("^content-type:(.*)$", $read[$i], $regs)) {
+            $type = strtolower(trim($regs[1]));
+            if ($pos = strpos($type, ";"))
+               $type = substr($type, 0, $pos);
+            $type = explode("/", $type);
+           if (! isset($type[1]))
+               $type[1] = '';
          }
+         
       }
 
       // If there isn't a date, it takes the internal date and uses
          $date = implode (" ", $date_ary);
       }
 
+      fputs ($imap_stream, "a003 FETCH $id RFC822.SIZE\r\n");
+      $read = sqimap_read_data($imap_stream, "a003", true, $r, $m);
+      eregi("([0-9]+)[^0-9]*$", $read[0], $regs);
+      $size = $regs[1];
+      
       $header = new small_header;
       if ($sent == true)
-         $header->from = $to;
+         $header->from = (trim($to) != '')? $to : _("(only Cc/Bcc)");
       else   
          $header->from = $from;
 
       $header->priority = $priority;
       $header->message_id = $messageid;
       $header->cc = $cc;
-
+      $header->size = $size;
+      $header->type0 = $type[0];
+      $header->type1 = $type[1];
+      
       return $header;
    }
 
    function sqimap_get_flags ($imap_stream, $i) {
       fputs ($imap_stream, "a001 FETCH $i:$i FLAGS\r\n");
       $read = sqimap_read_data ($imap_stream, "a001", true, $response, $message);
-      if (strpos($read[0], "FLAGS")) {
-         $tmp = ereg_replace("\(", "", $read[0]);
-         $tmp = ereg_replace("\)", "", $tmp);
-         $tmp = str_replace("\\", "", $tmp);
-         $tmp = substr($tmp, strpos($tmp, "FLAGS")+6, strlen($tmp));
-         $tmp = trim($tmp);
-         $flags = explode(" ", $tmp);
-      } else {
-         $flags[0] = "None";
-      }
-      return $flags;
+      if (ereg("FLAGS(.*)", $read[0], $regs))
+          return explode(" ", trim(ereg_replace('[\\(\\)\\\\]', '', $regs[1])));
+      return Array('None');
    }
 
    /******************************************************************************
     ******************************************************************************/
    function sqimap_get_message ($imap_stream, $id, $mailbox) {
       $header = sqimap_get_message_header($imap_stream, $id, $mailbox);
-      $msg = sqimap_get_message_body($imap_stream, &$header);
-      return $msg;
+      return sqimap_get_message_body($imap_stream, $header);
    }
 
    /******************************************************************************
             }
 
             /** Detect the boundary of a multipart message **/
-            if (eregi("boundary=\"([^\"]+)\"", $line, $regs)) {                             
+            if (eregi('boundary="([^"]+)"', $line, $regs)) {                             
                $hdr->boundary = $regs[1];                                             
             }
 
             if (strpos(strtolower(trim($line)), "charset=")) {
                $pos = strpos($line, "charset=") + 8;
                $charset = trim($line);
-               if (strpos($line, " ", $pos) > 0) {
-                  $charset = substr($charset, $pos, strpos($line, " ", $pos));
+               if (strpos($line, ";", $pos) > 0) {
+                  $charset = substr($charset, $pos, strpos($line, ";", $pos)-$pos);
                } else {
                   $charset = substr($charset, $pos);
                }
 
          }
 
-         else if (strtolower(substr($read[$i], 0, 20)) == "content-disposition:") {   
+         else if (strtolower(substr($read[$i], 0, 20)) == "content-disposition:") {
             /** Add better dontent-disposition support **/
             
             $line = $read[$i];
          /** FROM **/
          else if (strtolower(substr($read[$i], 0, 5)) == "from:") {
             $hdr->from = trim(substr($read[$i], 5, strlen($read[$i]) - 6));
-            if ($hdr->replyto == "")
+            if (! isset($hdr->replyto) || $hdr->replyto == "")
                $hdr->replyto = $hdr->from;
             $i++;
          }
          else if (strtolower(substr($read[$i], 0, 5)) == "date:") {
             $d = substr($read[$i], 5);
             $d = trim($d);
-            $d = ereg_replace("  ", " ", $d);
-            $d = explode(" ", $d);
+            $d = strtr($d, array('  ' => ' '));
+            $d = explode(' ', $d);
             $hdr->date = getTimeStamp($d);
             $i++;
          }
     ******************************************************************************/
    function sqimap_get_message_body ($imap_stream, &$header) {
       $id = $header->id;
-      return decodeMime($imap_stream, $body, &$header);
+      return decodeMime($imap_stream, $header);
    }