- /**
- ** imap_mailbox.php
- **
- ** This impliments all functions that manipulate mailboxes
- **/
-
- /******************************************************************************
- ** Expunges a mailbox
- ******************************************************************************/
- function sqimap_mailbox_expunge ($imap_stream, $mailbox,$handle_errors = true) {
- sqimap_mailbox_select ($imap_stream, $mailbox);
- fputs ($imap_stream, "a001 EXPUNGE\r\n");
- $read = sqimap_read_data($imap_stream, "a001", $handle_errors, $response, $message);
- sqimap_mailbox_close ($imap_stream);
- }
-
-
- /******************************************************************************
- ** Checks whether or not the specified mailbox exists
- ******************************************************************************/
- function sqimap_mailbox_exists ($imap_stream, $mailbox) {
- fputs ($imap_stream, "a001 LIST \"\" \"$mailbox\"\r\n");
- $mbx = sqimap_read_data($imap_stream, "a001", true, $response, $message);
- if ($mailbox) {
- return !!(ereg ("$mailbox", $mbx[0])); // To force into true/false
- }
- }
-
- /******************************************************************************
- ** Closes an open mailbox
- ******************************************************************************/
- function sqimap_mailbox_close ($imap_stream) {
- fputs ($imap_stream, "a001 CLOSE\r\n");
- $tmp = sqimap_read_data($imap_stream, "a001", false, $response, $message);
- }
-
- /******************************************************************************
- ** Selects a mailbox
- ******************************************************************************/
- function sqimap_mailbox_select ($imap_stream, $mailbox, $hide=true, $recent=false) {
- global $auto_expunge;
-
- fputs ($imap_stream, "a001 SELECT \"$mailbox\"\r\n");
- $read = sqimap_read_data($imap_stream, "a001", true, $response, $message);
- if ($recent) {
- for ($i=0; $i<count($read); $i++) {
- if (strpos(strtolower($read[$i]), "recent")) {
- $r = explode(" ", $read[$i]);
+
+/**
+ * imap_mailbox.php
+ *
+ * Copyright (c) 1999-2002 The SquirrelMail Project Team
+ * Licensed under the GNU GPL. For full terms see the file COPYING.
+ *
+ * This impliments all functions that manipulate mailboxes
+ *
+ * $Id$
+ */
+require_once('../functions/imap_utf7_encode_local.php');
+require_once('../functions/imap_utf7_decode_local.php');
+global $boxesnew;
+
+class mailboxes {
+ var $mailboxname_full = '', $mailboxname_sub= '', $is_noselect = false,
+ $is_special = false, $is_root = false, $is_inbox = false, $is_sent = false,
+ $is_trash = false, $is_draft = false, $mbxs = array(),
+ $unseen = false, $total = false;
+
+ function addMbx($mbx, $delimiter, $start, $specialfirst) {
+ $ary = explode($delimiter, $mbx->mailboxname_full);
+ $mbx_parent = &$this;
+ for ($i=$start; $i < (count($ary) -1); $i++) {
+ $mbx_childs = &$mbx_parent->mbxs;
+ $found = false;
+ foreach ($mbx_childs as $key => $parent) {
+ if ($parent->mailboxname_sub == $ary[$i]) {
+ $mbx_parent = &$mbx_parent->mbxs[$key];
+ $found = true;
+ }
+ }
+ if (!$found) {
+ $no_select_mbx = new mailboxes();
+ if (isset($mbx_parent->mailboxname_full) && $mbx_parent->mailboxname_full != '') {
+ $no_select_mbx->mailboxname_full = $mbx_parent->mailboxname_full.$delimiter.$ary[$i];
+ } else {
+ $no_select_mbx->mailboxname_full = $ary[$i];
+ }
+ $no_select_mbx->mailboxname_sub = $ary[$i];
+ $no_select_mbx->is_noselect = true;
+ $mbx_parent->mbxs[] = $no_select_mbx;
+ $i--;
+ }
+
+ }
+ $mbx_parent->mbxs[] = $mbx;
+ if ($mbx->is_special && $specialfirst) {
+ usort($mbx_parent->mbxs, 'sortSpecialMbx');
+ }
+
+ }
+}
+
+function sortSpecialMbx($a, $b) {
+ if ($a->is_inbox) {
+ $acmp = '0'. $a->mailboxname_full;
+ } else if ($a->is_special) {
+ $acmp = '1'. $a->mailboxname_full;
+ } else {
+ $acmp = '2' . $a->mailboxname_full;
+ }
+ if ($b->is_inbox) {
+ $bcmp = '0'. $b->mailboxname_full;
+ }else if ($b->is_special) {
+ $bcmp = '1' . $b->mailboxname_full;
+ } else {
+ $bcmp = '2' . $b->mailboxname_full;
+ }
+ if ($acmp == $bcmp) return 0;
+ return ($acmp>$bcmp) ? 1: -1;
+}
+
+
+function find_mailbox_name ($mailbox) {
+ if (ereg(" *\"([^\r\n\"]*)\"[ \r\n]*$", $mailbox, $regs))
+ return $regs[1];
+ ereg(" *([^ \r\n\"]*)[ \r\n]*$",$mailbox,$regs);
+ return $regs[1];
+
+}
+
+/**
+ * If $haystack is a full mailbox name, and $needle is the mailbox
+ * separator character, returns the second last part of the full
+ * mailbox name (i.e. the mailbox's parent mailbox)
+ */
+function readMailboxParent($haystack, $needle) {
+
+ if ($needle == '') {
+ $ret = '';
+ } else {
+ $parts = explode($needle, $haystack);
+ $elem = array_pop($parts);
+ while ($elem == '' && count($parts)) {
+ $elem = array_pop($parts);
+ }
+ $ret = join($needle, $parts);
+ }
+ return( $ret );
+}
+
+
+function isBoxBelow( $box2, $box1 ) {
+ global $delimiter, $folder_prefix, $imap_server_type;
+
+ if ( $imap_server_type == 'uw' ) {
+ $boxs = $box2;
+ $i = strpos( $box1, $delimiter, strlen( $folder_prefix ) );
+ if ( $i === false ) {
+ $i = strlen( $box2 );
+ }
+ } else {
+ $boxs = $box2 . $delimiter;
+ /* Skip next second delimiter */
+ $i = strpos( $box1, $delimiter );
+ $i = strpos( $box1, $delimiter, $i + 1 );
+ if ( $i === false ) {
+ $i = strlen( $box2 );
+ } else {
+ $i++;
+ }
+ }
+
+ return ( substr( $box1, 0, $i ) == substr( $boxs, 0, $i ) );
+}
+
+/* Defines special mailboxes */
+function isSpecialMailbox( $box ) {
+ global $trash_folder, $sent_folder, $draft_folder,
+ $move_to_trash, $move_to_sent, $save_as_draft;
+
+ $ret = ( (strtolower($box) == 'inbox') ||
+ ( $move_to_trash && isBoxBelow( $box, $trash_folder ) ) ||
+ ( $move_to_sent && isBoxBelow( $box, $sent_folder )) ||
+ ($save_as_draft && $box == $draft_folder ) );
+
+ if ( !$ret ) {
+ $ret = do_hook_function( 'special_mailbox', $box );
+ }
+
+ return $ret;
+}
+
+/* Expunges a mailbox */
+function sqimap_mailbox_expunge ($imap_stream, $mailbox, $handle_errors = true) {
+ $read = sqimap_run_command($imap_stream, 'EXPUNGE', $handle_errors,
+ $response, $message);
+}
+
+/* Checks whether or not the specified mailbox exists */
+function sqimap_mailbox_exists ($imap_stream, $mailbox) {
+ if (! isset($mailbox)) {
+ return false;
+ }
+ $mbx = sqimap_run_command($imap_stream, "LIST \"\" \"$mailbox\"",
+ true, $response, $message);
+ return isset($mbx[0]);
+}
+
+/* Selects a mailbox */
+function sqimap_mailbox_select ($imap_stream, $mailbox,
+ $hide = true, $recent = false, $extrainfo = false) {
+ global $auto_expunge;
+
+ if ( $mailbox == 'None' ) {
+ return;
+ }
+
+ $read = sqimap_run_command($imap_stream, "SELECT \"$mailbox\"",
+ true, $response, $message);
+ if ($recent) {
+ for ($i=0; $i<count($read); $i++) {
+ if (strpos(strtolower($read[$i]), 'recent')) {
+ $r = explode(' ', $read[$i]);
+ }
+ }
+ return $r[1];
+ } else {
+ if ($auto_expunge) {
+ $tmp = sqimap_run_command($imap_stream, 'EXPUNGE', false, $a, $b);
+ }
+ if (isset( $extrainfo ) && $extrainfo) {
+ $result = array();
+ for ($i=0; $i<count($read); $i++) {
+ if (preg_match("/PERMANENTFLAGS(.*)/i",$read[$i], $regs)) {
+ $regs[1]=trim(preg_replace ( array ("/\(/","/\)/","/\]/") ,'', $regs[1])) ;
+ $result['PERMANENTFLAGS'] = $regs[1];
+ }
+ else if (preg_match("/FLAGS(.*)/i",$read[$i], $regs)) {
+ $regs[1]=trim(preg_replace ( array ("/\(/","/\)/") ,'', $regs[1])) ;
+ $result['FLAGS'] = $regs[1];
+ }
+ else if (preg_match("/(.*)EXISTS/i",$read[$i], $regs)) {
+ $result['EXISTS']=trim($regs[1]);
+ }
+ else if (preg_match("/(.*)RECENT/i",$read[$i], $regs)) {
+ $result['RECENT']=trim($regs[1]);
+ }
+ else if (preg_match("/\[UNSEEN(.*)\]/i",$read[$i], $regs)) {
+ $result['UNSEEN']=trim($regs[1]);
+ }
+