| | |
| | | * |
| | | * @package Mail |
| | | * @author Thomas Bruederli <roundcube@gmail.com> |
| | | * @version 1.6 |
| | | * @author Aleksander Machniak <alec@alec.pl> |
| | | * @version 2.0 |
| | | */ |
| | | class rcube_imap |
| | | { |
| | |
| | | */ |
| | | function connect($host, $user, $pass, $port=143, $use_ssl=null) |
| | | { |
| | | // check for Open-SSL support in PHP build |
| | | // check for OpenSSL support in PHP build |
| | | if ($use_ssl && extension_loaded('openssl')) |
| | | $this->options['ssl_mode'] = $use_ssl == 'imaps' ? 'ssl' : $use_ssl; |
| | | else if ($use_ssl) { |
| | |
| | | /** |
| | | * Get message count for a specific mailbox |
| | | * |
| | | * @param string Mailbox/folder name |
| | | * @param string Mode for count [ALL|THREADS|UNSEEN|RECENT] |
| | | * @param boolean Force reading from server and update cache |
| | | * @return int Number of messages |
| | | * @access public |
| | | * @param string Mailbox/folder name |
| | | * @param string Mode for count [ALL|THREADS|UNSEEN|RECENT] |
| | | * @param boolean Force reading from server and update cache |
| | | * @param boolean Enables MAXUIDs checking |
| | | * @return int Number of messages |
| | | * @access public |
| | | */ |
| | | function messagecount($mbox_name='', $mode='ALL', $force=false) |
| | | function messagecount($mbox_name='', $mode='ALL', $force=false, $maxuid=true) |
| | | { |
| | | $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox; |
| | | return $this->_messagecount($mailbox, $mode, $force); |
| | | return $this->_messagecount($mailbox, $mode, $force, $maxuid); |
| | | } |
| | | |
| | | |
| | |
| | | * @access private |
| | | * @see rcube_imap::messagecount() |
| | | */ |
| | | private function _messagecount($mailbox='', $mode='ALL', $force=false) |
| | | private function _messagecount($mailbox='', $mode='ALL', $force=false, $maxuid=true) |
| | | { |
| | | $mode = strtoupper($mode); |
| | | |
| | |
| | | |
| | | if ($mode == 'THREADS') { |
| | | $count = $this->_threadcount($mailbox, $msg_count); |
| | | $_SESSION['maxuid'][$mailbox] = $msg_count ? $this->_id2uid($msg_count) : 0; |
| | | if ($maxuid) |
| | | $_SESSION['maxuid'][$mailbox] = $msg_count ? $this->_id2uid($msg_count, $mailbox) : 0; |
| | | } |
| | | // RECENT count is fetched a bit different |
| | | else if ($mode == 'RECENT') { |
| | |
| | | |
| | | $count = is_array($index) ? count($index) : 0; |
| | | |
| | | if ($mode == 'ALL') |
| | | $_SESSION['maxuid'][$mailbox] = $index ? $this->_id2uid(max($index)) : 0; |
| | | if ($mode == 'ALL' && $maxuid) |
| | | $_SESSION['maxuid'][$mailbox] = $index ? $this->_id2uid(max($index), $mailbox) : 0; |
| | | } |
| | | else { |
| | | if ($mode == 'UNSEEN') |
| | | $count = $this->conn->countUnseen($mailbox); |
| | | else { |
| | | $count = $this->conn->countMessages($mailbox); |
| | | $_SESSION['maxuid'][$mailbox] = $count ? $this->_id2uid($count) : 0; |
| | | if ($maxuid) |
| | | $_SESSION['maxuid'][$mailbox] = $count ? $this->_id2uid($count, $mailbox) : 0; |
| | | } |
| | | } |
| | | |
| | |
| | | function get_headers($id, $mbox_name=NULL, $is_uid=true, $bodystr=false) |
| | | { |
| | | $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox; |
| | | $uid = $is_uid ? $id : $this->_id2uid($id); |
| | | $uid = $is_uid ? $id : $this->_id2uid($id, $mailbox); |
| | | |
| | | // get cached headers |
| | | if ($uid && ($headers = &$this->get_cached_message($mailbox.'.msg', $uid))) |
| | |
| | | $a_out = array(); |
| | | $a_mboxes = $this->_list_mailboxes($root, $filter); |
| | | |
| | | foreach ($a_mboxes as $mbox_row) { |
| | | $name = $this->mod_mailbox($mbox_row, 'out'); |
| | | if (strlen($name)) |
| | | foreach ($a_mboxes as $idx => $mbox_row) { |
| | | if ($name = $this->mod_mailbox($mbox_row, 'out')) |
| | | $a_out[] = $name; |
| | | unset($a_mboxes[$idx]); |
| | | } |
| | | |
| | | // INBOX should always be available |
| | |
| | | */ |
| | | function list_unsubscribed($root='') |
| | | { |
| | | static $sa_unsubscribed; |
| | | static $a_folders; |
| | | |
| | | if (is_array($sa_unsubscribed)) |
| | | return $sa_unsubscribed; |
| | | if (is_array($a_folders)) |
| | | return $a_folders; |
| | | |
| | | // retrieve list of folders from IMAP server |
| | | $a_mboxes = $this->conn->listMailboxes($this->mod_mailbox($root), '*'); |
| | | |
| | | // modify names with root dir |
| | | foreach ($a_mboxes as $mbox_name) { |
| | | $name = $this->mod_mailbox($mbox_name, 'out'); |
| | | if (strlen($name)) |
| | | foreach ($a_mboxes as $idx => $mbox_name) { |
| | | if ($name = $this->mod_mailbox($mbox_name, 'out')) |
| | | $a_folders[] = $name; |
| | | unset($a_mboxes[$idx]); |
| | | } |
| | | |
| | | // INBOX should always be available |
| | | if (!in_array('INBOX', $a_folders)) |
| | | array_unshift($a_folders, 'INBOX'); |
| | | |
| | | // filter folders and sort them |
| | | $sa_unsubscribed = $this->_sort_mailbox_list($a_folders); |
| | | return $sa_unsubscribed; |
| | | $a_folders = $this->_sort_mailbox_list($a_folders); |
| | | return $a_folders; |
| | | } |
| | | |
| | | |
| | |
| | | foreach ($a_mboxes as $mbox_name) { |
| | | $mailbox = $this->mod_mailbox($mbox_name); |
| | | $sub_mboxes = $this->conn->listMailboxes($this->mod_mailbox(''), |
| | | $mbox_name . $this->delimiter . '*'); |
| | | $mbox_name . $this->delimiter . '*'); |
| | | |
| | | // unsubscribe mailbox before deleting |
| | | $this->conn->unsubscribe($mailbox); |
| | |
| | | return true; |
| | | |
| | | if ($subscription) { |
| | | if ($a_folders = $this->conn->listSubscribed($this->mod_mailbox(''), $mbox_name)) |
| | | return true; |
| | | $a_folders = $this->conn->listSubscribed($this->mod_mailbox(''), $mbox_name); |
| | | } |
| | | else { |
| | | $a_folders = $this->conn->listMailboxes($this->mod_mailbox(''), $mbox_mbox); |
| | | |
| | | if (is_array($a_folders) && in_array($this->mod_mailbox($mbox_name), $a_folders)) |
| | | $a_folders = $this->conn->listMailboxes($this->mod_mailbox(''), $mbox_name); |
| | | } |
| | | |
| | | if (is_array($a_folders) && in_array($this->mod_mailbox($mbox_name), $a_folders)) { |
| | | return true; |
| | | } |
| | | } |
| | |
| | | if (!$this->caching_enabled) |
| | | return; |
| | | |
| | | // check for an existing record (probly headers are cached but structure not) |
| | | // check for an existing record (probably headers are cached but structure not) |
| | | if (!$force) { |
| | | $sql_result = $this->db->query( |
| | | "SELECT message_id". |
| | |
| | | if (($p = array_search($folder, $this->default_folders)) !== false && !$a_defaults[$p]) |
| | | $a_defaults[$p] = $folder; |
| | | else |
| | | $folders[$folder] = mb_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP')); |
| | | $folders[$folder] = rcube_charset_convert($folder, 'UTF7-IMAP'); |
| | | } |
| | | |
| | | // sort folders and place defaults on the top |