/** * Checks if folder is noselect (can't store messages) * * Function does not check if folder subscribed. * @param stream $imap_stream imap connection resource * @param string $imap_folder imap folder name * @return boolean true, when folder has noselect flag. false in any other case. * @since 1.5.1 and 1.4.5 */ function mail_fetch_check_noselect($imap_stream, $imap_folder) { $boxes = sqimap_mailbox_list($imap_stream); foreach ($boxes as $box) { if ($box['unformatted'] == $imap_folder) { return (bool) check_is_noselect($box['raw']); } } return false; }
/** * Checks if folder is noselect (can't store messages) * * Function does not check if folder subscribed. * @param stream $oImapStream imap connection resource * @param string $sImapFolder imap folder name * @param object $oBoxes mailboxes class object. * @return boolean true, when folder has noselect flag. false in any other case. * @since 1.5.1 */ function sqimap_mailbox_is_noselect($oImapStream, $sImapFolder, &$oBoxes) { // build mailbox object if it is not available if (!is_object($oBoxes)) { $oBoxes = sqimap_mailbox_list($oImapStream); } foreach ($oBoxes as $box) { if ($box['unformatted'] == $sImapFolder) { return (bool) check_is_noselect($box['raw']); } } return false; }
function sqimap_mailbox_tree($imap_stream) { global $boxesnew, $default_folder_prefix, $unseen_notify, $unseen_type; if (!isset($boxesnew)) { global $data_dir, $username, $list_special_folders_first, $folder_prefix, $delimiter, $trash_folder, $move_to_trash; $inbox_in_list = false; $inbox_subscribed = false; require_once SM_PATH . 'include/load_prefs.php'; /* LSUB array */ $lsub_ary = sqimap_run_command($imap_stream, "LSUB \"{$folder_prefix}\" \"*\"", true, $response, $message); /* * Section about removing the last element was removed * We don't return "* OK" anymore from sqimap_read_data */ $sorted_lsub_ary = array(); $cnt = count($lsub_ary); for ($i = 0; $i < $cnt; $i++) { /* * Workaround for EIMS * Doesn't work if the mailbox name is multiple lines */ if (isset($lsub_ary[$i + 1]) && ereg("^(\\* [A-Z]+.*)\\{[0-9]+\\}([ \n\r\t]*)\$", $lsub_ary[$i], $regs)) { $i++; $lsub_ary[$i] = $regs[1] . '"' . addslashes(trim($lsub_ary[$i])) . '"' . $regs[2]; } /* if (preg_match("/^\*\s+LSUB\s+\((.*)\)\s+\"(.*)\"\s+\"?(.+(?=\")|.+).*$/",$lsub_ary[$i],$regs)) { $flag = $regs[1]; $mbx = trim($regs[3]); $sorted_lsub_ary[] = array ('mbx' => $mbx, 'flag' => $flag); } */ $mbx = find_mailbox_name($lsub_ary[$i]); $noselect = check_is_noselect($lsub_ary[$i]); if (substr($mbx, -1) == $delimiter) { $mbx = substr($mbx, 0, strlen($mbx) - 1); } $sorted_lsub_ary[] = array('mbx' => $mbx, 'noselect' => $noselect); } array_multisort($sorted_lsub_ary, SORT_ASC, SORT_REGULAR); for ($i = 0; $i < $cnt; $i++) { if ($sorted_lsub_ary[$i]['mbx'] == 'INBOX') { $inbox_in_list = true; break; } } /* * Just in case they're not subscribed to their inbox, * we'll get it for them anyway */ if (!$inbox_in_list) { $inbox_ary = sqimap_run_command($imap_stream, "LIST \"\" \"INBOX\"", true, $response, $message); /* Another workaround for EIMS */ if (isset($inbox_ary[1]) && ereg("^(\\* [A-Z]+.*)\\{[0-9]+\\}([ \n\r\t]*)\$", $inbox_ary[0], $regs)) { $inbox_ary[0] = $regs[1] . '"' . addslashes(trim($inbox_ary[1])) . '"' . $regs[2]; } $mbx = find_mailbox_name($inbox_ary[0]); if (substr($mbx, -1) == $delimiter) { $mbx = substr($mbx, 0, strlen($mbx) - 1); } if ($mbx == 'INBOX') { $sorted_lsub_ary[] = array('mbx' => $mbx, 'flag' => ''); sqimap_subscribe($imap_stream, 'INBOX'); $cnt++; } /* if (preg_match("/^\*\s+LIST\s+\((.*)\)\s+\"(.*)\"\s+\"?(.+(?=\")|.+).*$/",$inbox_ary[0],$regs)) { $flag = $regs[1]; $mbx = trim($regs[3]); if (substr($mbx, -1) == $delimiter) { $mbx = substr($mbx, 0, strlen($mbx) - 1); } $sorted_lsub_ary[] = array ('mbx' => $mbx, 'flag' => $flag); } */ } for ($i = 0; $i < $cnt; $i++) { $mbx = $sorted_lsub_ary[$i]['mbx']; if ($unseen_notify == 2 && $mbx == 'INBOX' || $unseen_notify == 3 || $move_to_trash && $mbx == $trash_folder) { if ($sorted_lsub_ary[$i]['noselect']) { $sorted_lsub_ary[$i]['unseen'] = 0; } else { $sorted_lsub_ary[$i]['unseen'] = sqimap_unseen_messages($imap_stream, $mbx); } if ($unseen_type == 2 || $move_to_trash && $mbx == $trash_folder || $mbx == $trash_folder) { if ($sorted_lsub_ary[$i]['noselect']) { $sorted_lsub_ary[$i]['nummessages'] = 0; } else { $sorted_lsub_ary[$i]['nummessages'] = sqimap_get_num_messages($imap_stream, $mbx); } } } } $boxesnew = sqimap_fill_mailbox_tree($sorted_lsub_ary); return $boxesnew; } }
function sqimap_mailbox_tree($imap_stream) { global $default_folder_prefix, $unseen_notify, $unseen_type; if (true) { global $data_dir, $username, $list_special_folders_first, $folder_prefix, $delimiter, $trash_folder, $move_to_trash, $imap_server_type; $inbox_in_list = false; $inbox_subscribed = false; $noselect = false; $noinferiors = false; require_once SM_PATH . 'include/load_prefs.php'; /* LSUB array */ $lsub_ary = sqimap_run_command($imap_stream, "LSUB \"{$folder_prefix}\" \"*\"", true, $response, $message); $lsub_ary = compact_mailboxes_response($lsub_ary); /* Check to see if we have an INBOX */ $has_inbox = false; for ($i = 0, $cnt = count($lsub_ary); $i < $cnt; $i++) { if (preg_match("/^\\*\\s+LSUB.*\\s\"?INBOX\"?[^(\\/\\.)].*\$/i", $lsub_ary[$i])) { $lsub_ary[$i] = strtoupper($lsub_ary[$i]); // in case of an unsubscribed inbox an imap server can // return the inbox in the lsub results with a \NoSelect // flag. if (!preg_match("/\\*\\s+LSUB\\s+\\(.*\\\\NoSelect.*\\).*/i", $lsub_ary[$i])) { $has_inbox = true; } else { // remove the result and request it again with a list // response at a later stage. unset($lsub_ary[$i]); // re-index the array otherwise the addition of the LIST // response will fail in PHP 4.1.2 and probably other older versions $lsub_ary = array_values($lsub_ary); } break; } } if ($has_inbox == false) { // do a list request for inbox because we should always show // inbox even if the user isn't subscribed to it. $inbox_ary = sqimap_run_command($imap_stream, 'LIST "" INBOX', true, $response, $message); $inbox_ary = compact_mailboxes_response($inbox_ary); if (count($inbox_ary)) { $lsub_ary[] = $inbox_ary[0]; } } /* * Section about removing the last element was removed * We don't return "* OK" anymore from sqimap_read_data */ $sorted_lsub_ary = array(); $cnt = count($lsub_ary); for ($i = 0; $i < $cnt; $i++) { $mbx = find_mailbox_name($lsub_ary[$i]); // only do the noselect test if !uw, is checked later. FIX ME see conf.pl setting if ($imap_server_type != "uw") { $noselect = check_is_noselect($lsub_ary[$i]); $noinferiors = check_is_noinferiors($lsub_ary[$i]); } if (substr($mbx, -1) == $delimiter) { $mbx = substr($mbx, 0, strlen($mbx) - 1); } $sorted_lsub_ary[] = array('mbx' => $mbx, 'noselect' => $noselect, 'noinferiors' => $noinferiors); } // FIX ME this requires a config setting inside conf.pl instead of checking on server type if ($imap_server_type == "uw") { $aQuery = array(); $aTag = array(); // prepare an array with queries foreach ($sorted_lsub_ary as $aMbx) { $mbx = stripslashes($aMbx['mbx']); sqimap_prepare_pipelined_query('LIST "" ' . sqimap_encode_mailbox_name($mbx), $tag, $aQuery, false); $aTag[$tag] = $mbx; } $sorted_lsub_ary = array(); // execute all the queries at once $aResponse = sqimap_run_pipelined_command($imap_stream, $aQuery, false, $aServerResponse, $aServerMessage); foreach ($aTag as $tag => $mbx) { if ($aServerResponse[$tag] == 'OK') { $sResponse = implode('', $aResponse[$tag]); $noselect = check_is_noselect($sResponse); $noinferiors = check_is_noinferiors($sResponse); $sorted_lsub_ary[] = array('mbx' => $mbx, 'noselect' => $noselect, 'noinferiors' => $noinferiors); } } $cnt = count($sorted_lsub_ary); } $sorted_lsub_ary = array_values($sorted_lsub_ary); usort($sorted_lsub_ary, 'mbxSort'); $boxestree = sqimap_fill_mailbox_tree($sorted_lsub_ary, false, $imap_stream); return $boxestree; } }