| | |
| | | */ |
| | | function connect($host, $user, $pass, $port=143, $use_ssl=FALSE) |
| | | { |
| | | global $ICL_SSL, $ICL_PORT; |
| | | global $ICL_SSL, $ICL_PORT, $IMAP_USE_INTERNAL_DATE; |
| | | |
| | | // check for Open-SSL support in PHP build |
| | | if ($use_ssl && in_array('openssl', get_loaded_extensions())) |
| | |
| | | } |
| | | |
| | | $ICL_PORT = $port; |
| | | $IMAP_USE_INTERNAL_DATE = false; |
| | | |
| | | $this->conn = iil_Connect($host, $user, $pass, array('imap' => 'check')); |
| | | $this->host = $host; |
| | | $this->user = $user; |
| | |
| | | $count = iil_C_CountMessages($this->conn, $mailbox); |
| | | } |
| | | |
| | | if (is_array($a_mailbox_cache[$mailbox])) |
| | | if (!is_array($a_mailbox_cache[$mailbox])) |
| | | $a_mailbox_cache[$mailbox] = array(); |
| | | |
| | | $a_mailbox_cache[$mailbox][$mode] = (int)$count; |
| | |
| | | |
| | | |
| | | /** |
| | | * Private method for listing message header |
| | | * Private method for listing message headers |
| | | * |
| | | * @access private |
| | | * @see rcube_imap::list_headers |
| | |
| | | $max = $this->_messagecount($mailbox); |
| | | $start_msg = ($this->list_page-1) * $this->page_size; |
| | | |
| | | list($begin, $end) = $this->_get_message_range($max, $page); |
| | | |
| | | /* |
| | | if ($page=='all') |
| | | { |
| | | $begin = 0; |
| | |
| | | if ($begin < 0) $begin = 0; |
| | | if ($end < 0) $end = $max; |
| | | if ($end > $max) $end = $max; |
| | | |
| | | */ |
| | | |
| | | //console("fetch headers $start_msg to ".($start_msg+$this->page_size)." (msg $begin to $end)"); |
| | | |
| | | $headers_sorted = FALSE; |
| | |
| | | |
| | | $msgs = $msg_index[$begin]; |
| | | for ($i=$begin+1; $i < $end; $i++) |
| | | { |
| | | //if ($this->sort_order == 'DESC') |
| | | // $msgs = $msg_index[$i].','.$msgs; |
| | | //else |
| | | $msgs = $msgs.','.$msg_index[$i]; |
| | | } |
| | | $msgs = $msgs.','.$msg_index[$i]; |
| | | |
| | | $sorted = TRUE; |
| | | } |
| | |
| | | |
| | | |
| | | // fetch reuested headers from server |
| | | $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs); |
| | | $a_msg_headers = array(); |
| | | $deleted_count = $this->_fetch_headers($mailbox, $msgs, $a_msg_headers, $cache_key); |
| | | |
| | |
| | | |
| | | return array_values($a_msg_headers); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Public method for listing a specific set of headers |
| | | * convert mailbox name with root dir first |
| | | * |
| | | * @param string Mailbox/folder name |
| | | * @param array List of message ids to list |
| | | * @param number Current page to list |
| | | * @param string Header field to sort by |
| | | * @param string Sort order [ASC|DESC] |
| | | * @return array Indexed array with message header objects |
| | | * @access public |
| | | */ |
| | | function list_header_set($mbox='', $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL) |
| | | { |
| | | $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; |
| | | return $this->_list_header_set($mailbox, $msgs, $page, $sort_field, $sort_order); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Private method for listing a set of message headers |
| | | * |
| | | * @access private |
| | | * @see rcube_imap::list_header_set |
| | | */ |
| | | function _list_header_set($mailbox, $msgs, $page=NULL, $sort_field=NULL, $sort_order=NULL) |
| | | { |
| | | // also accept a comma-separated list of message ids |
| | | if (is_string($msgs)) |
| | | $msgs = split(',', $msgs); |
| | | |
| | | if (!strlen($mailbox) || empty($msgs)) |
| | | return array(); |
| | | |
| | | if ($sort_field!=NULL) |
| | | $this->sort_field = $sort_field; |
| | | if ($sort_order!=NULL) |
| | | $this->sort_order = strtoupper($sort_order); |
| | | |
| | | $max = count($msgs); |
| | | $start_msg = ($this->list_page-1) * $this->page_size; |
| | | |
| | | // fetch reuested headers from server |
| | | $a_msg_headers = array(); |
| | | $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL); |
| | | |
| | | // return empty array if no messages found |
| | | if (!is_array($a_msg_headers) || empty($a_msg_headers)) |
| | | return array(); |
| | | |
| | | // if not already sorted |
| | | $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order); |
| | | |
| | | // only return the requested part of the set |
| | | return array_slice(array_values($a_msg_headers), $start_msg, min($max-$start_msg, $this->page_size)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Helper function to get first and last index of the requested set |
| | | * |
| | | * @param number message count |
| | | * @param mixed page number to show, or string 'all' |
| | | * @return array array with two values: first index, last index |
| | | * @access private |
| | | */ |
| | | function _get_message_range($max, $page) |
| | | { |
| | | $start_msg = ($this->list_page-1) * $this->page_size; |
| | | |
| | | if ($page=='all') |
| | | { |
| | | $begin = 0; |
| | | $end = $max; |
| | | } |
| | | else if ($this->sort_order=='DESC') |
| | | { |
| | | $begin = $max - $this->page_size - $start_msg; |
| | | $end = $max - $start_msg; |
| | | } |
| | | else |
| | | { |
| | | $begin = $start_msg; |
| | | $end = $start_msg + $this->page_size; |
| | | } |
| | | |
| | | if ($begin < 0) $begin = 0; |
| | | if ($end < 0) $end = $max; |
| | | if ($end > $max) $end = $max; |
| | | |
| | | return array($begin, $end); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Fetches message headers |
| | | * Used for loop |
| | | * |
| | | * @param string Mailbox name |
| | | * @param string Message indey to fetch |
| | | * @param string Message index to fetch |
| | | * @param array Reference to message headers array |
| | | * @param array Array with cache index |
| | | * @return number Number of deleted messages |
| | |
| | | { |
| | | // cache is incomplete |
| | | $cache_index = $this->get_message_cache_index($cache_key); |
| | | |
| | | |
| | | // fetch reuested headers from server |
| | | $a_header_index = iil_C_FetchHeaders($this->conn, $mailbox, $msgs); |
| | | $deleted_count = 0; |
| | |
| | | // cache is OK |
| | | if ($cache_status>0) |
| | | { |
| | | $a_index = $this->get_message_cache_index($cache_key, FALSE, $this->sort_field); |
| | | $a_index = $this->get_message_cache_index($cache_key, TRUE, $this->sort_field, $this->sort_order); |
| | | return array_values($a_index); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | function search($mbox='', $criteria='ALL') |
| | | /** |
| | | * Invoke search request to IMAP server |
| | | * |
| | | * @param string mailbox name to search in |
| | | * @param string search criteria (ALL, TO, FROM, SUBJECT, etc) |
| | | * @param string search string |
| | | * @return array search results as list of message ids |
| | | * @access public |
| | | */ |
| | | function search($mbox='', $criteria='ALL', $str=NULL) |
| | | { |
| | | $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; |
| | | return $this->_search_index($mailbox, $criteria); |
| | | } |
| | | |
| | | |
| | | if ($str && $criteria) |
| | | { |
| | | $criteria .= " \"$str\""; |
| | | return $this->_search_index($mailbox, $criteria); |
| | | } |
| | | else |
| | | return $this->_search_index($mailbox, $criteria); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Private search method |
| | | * |
| | | * @return array search results as list of message ids |
| | | * @access private |
| | | * @see rcube_imap::search() |
| | | */ |
| | | function _search_index($mailbox, $criteria='ALL') |
| | | { |
| | | $a_messages = iil_C_Search($this->conn, $mailbox, $criteria); |
| | | |
| | | // clean message list (there might be some empty entries) |
| | | foreach ($a_messages as $i => $val) |
| | | if (empty($val)) |
| | | unset($a_messages[$i]); |
| | | |
| | | return $a_messages; |
| | | } |
| | | |
| | |
| | | $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; |
| | | |
| | | // get cached headers |
| | | if ($headers = $this->get_cached_message($mailbox.'.msg', $uid)) |
| | | if ($is_uid && ($headers = $this->get_cached_message($mailbox.'.msg', $id))) |
| | | return $headers; |
| | | |
| | | $msg_id = $is_uid ? $this->_uid2id($id) : $id; |
| | |
| | | { |
| | | $mailbox = $this->_mod_mailbox($mbox); |
| | | |
| | | // make shure mailbox exists |
| | | // make sure mailbox exists |
| | | if (in_array($mailbox, $this->_list_mailboxes())) |
| | | $saved = iil_C_Append($this->conn, $mailbox, $message); |
| | | |
| | |
| | | $to_mbox = $this->_mod_mailbox($to_mbox); |
| | | $from_mbox = $from_mbox ? $this->_mod_mailbox($from_mbox) : $this->mailbox; |
| | | |
| | | // make shure mailbox exists |
| | | // make sure mailbox exists |
| | | if (!in_array($to_mbox, $this->_list_mailboxes())) |
| | | return FALSE; |
| | | |
| | | { |
| | | if (in_array(strtolower($to_mbox), $this->default_folders)) |
| | | $this->create_mailbox($to_mbox, TRUE); |
| | | else |
| | | return FALSE; |
| | | } |
| | | |
| | | // convert the list of uids to array |
| | | $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL); |
| | | |
| | |
| | | |
| | | if ($msg_count>0) |
| | | { |
| | | $this->clear_message_cache($mailbox.'.msg'); |
| | | return iil_C_ClearFolder($this->conn, $mailbox); |
| | | $cleared = iil_C_ClearFolder($this->conn, $mailbox); |
| | | |
| | | // make sure the message count cache is cleared as well |
| | | if ($cleared) |
| | | { |
| | | $this->clear_message_cache($mailbox.'.msg'); |
| | | $a_mailbox_cache = $this->get_cache('messagecount'); |
| | | unset($a_mailbox_cache[$mailbox]); |
| | | $this->update_cache('messagecount', $a_mailbox_cache); |
| | | } |
| | | |
| | | return $cleared; |
| | | } |
| | | else |
| | | return 0; |
| | |
| | | // filter folders and sort them |
| | | $sa_unsubscribed = $this->_sort_mailbox_list($a_folders); |
| | | return $sa_unsubscribed; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Get quota |
| | | * added by Nuny |
| | | */ |
| | | function get_quota() |
| | | { |
| | | if ($this->get_capability('QUOTA')) |
| | | { |
| | | $result = iil_C_GetQuota($this->conn); |
| | | if ($result["total"]) |
| | | return sprintf("%.2fMB / %.2fMB (%.0f%%)", $result["used"] / 1000.0, $result["total"] / 1000.0, $result["percent"]); |
| | | } |
| | | |
| | | return FALSE; |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | function get_message_cache_index($key, $force=FALSE, $sort_col='idx') |
| | | function get_message_cache_index($key, $force=FALSE, $sort_col='idx', $sort_order='ASC') |
| | | { |
| | | static $sa_message_index = array(); |
| | | |
| | | // empty key -> empty array |
| | | if (empty($key)) |
| | | return array(); |
| | | |
| | | if (!empty($sa_message_index[$key]) && !$force) |
| | | return $sa_message_index[$key]; |
| | |
| | | FROM ".get_table_name('messages')." |
| | | WHERE user_id=? |
| | | AND cache_key=? |
| | | ORDER BY ".$sort_col." ASC", |
| | | ORDER BY ".$this->db->quote_identifier($sort_col)." ".$sort_order, |
| | | $_SESSION['user_id'], |
| | | $key); |
| | | |
| | |
| | | |
| | | function add_message_cache($key, $index, $headers) |
| | | { |
| | | if (!is_object($headers) || empty($headers->uid)) |
| | | if (!$key || !is_object($headers) || empty($headers->uid)) |
| | | return; |
| | | |
| | | $this->db->query( |
| | | "INSERT INTO ".get_table_name('messages')." |
| | | (user_id, del, cache_key, idx, uid, subject, ".$this->db->quoteIdentifier('from').", ".$this->db->quoteIdentifier('to').", cc, date, size, headers) |
| | | VALUES (?, 0, ?, ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?)", |
| | | (user_id, del, cache_key, created, idx, uid, subject, ".$this->db->quoteIdentifier('from').", ".$this->db->quoteIdentifier('to').", cc, date, size, headers) |
| | | VALUES (?, 0, ?, now(), ?, ?, ?, ?, ?, ?, ".$this->db->fromunixtime($headers->timestamp).", ?, ?)", |
| | | $_SESSION['user_id'], |
| | | $key, |
| | | $index, |
| | | $headers->uid, |
| | | substr($this->decode_header((string)$headers->subject, TRUE), 0, 128), |
| | | substr($this->decode_header((string)$headers->from, TRUE), 0, 128), |
| | | substr($this->decode_header((string)$headers->to, TRUE), 0, 128), |
| | | substr($this->decode_header((string)$headers->cc, TRUE), 0, 128), |
| | | (string)substr($this->decode_header($headers->subject, TRUE), 0, 128), |
| | | (string)substr($this->decode_header($headers->from, TRUE), 0, 128), |
| | | (string)substr($this->decode_header($headers->to, TRUE), 0, 128), |
| | | (string)substr($this->decode_header($headers->cc, TRUE), 0, 128), |
| | | (int)$headers->size, |
| | | serialize($headers)); |
| | | } |
| | |
| | | return trim($output); |
| | | } |
| | | |
| | | ?> |
| | | ?> |