| | |
| | | * |
| | | * @package Mail |
| | | * @author Thomas Bruederli <roundcube@gmail.com> |
| | | * @version 1.40 |
| | | * @version 1.5 |
| | | * @link http://ilohamail.org |
| | | */ |
| | | class rcube_imap |
| | |
| | | var $debug_level = 1; |
| | | var $error_code = 0; |
| | | var $options = array('imap' => 'check'); |
| | | |
| | | private $host, $user, $pass, $port, $ssl; |
| | | |
| | | |
| | | /** |
| | |
| | | // check for Open-SSL support in PHP build |
| | | if ($use_ssl && extension_loaded('openssl')) |
| | | $ICL_SSL = $use_ssl == 'imaps' ? 'ssl' : $use_ssl; |
| | | else if ($use_ssl) |
| | | { |
| | | else if ($use_ssl) { |
| | | raise_error(array('code' => 403, 'type' => 'imap', 'file' => __FILE__, |
| | | 'message' => 'Open SSL not available;'), TRUE, FALSE); |
| | | $port = 143; |
| | | } |
| | | } |
| | | |
| | | $ICL_PORT = $port; |
| | | $IMAP_USE_INTERNAL_DATE = false; |
| | | |
| | | $attempt = 0; |
| | | do { |
| | | $data = rcmail::get_instance()->plugins->exec_hook('imap_connect', array('host' => $host, 'user' => $user, 'attempt' => ++$attempt)); |
| | | if (!empty($data['pass'])) |
| | | $pass = $data['pass']; |
| | | |
| | | $this->conn = iil_Connect($host, $user, $pass, $this->options); |
| | | $this->host = $host; |
| | | $this->user = $user; |
| | | $this->conn = iil_Connect($data['host'], $data['user'], $pass, $this->options); |
| | | } while(!$this->conn && $data['retry']); |
| | | |
| | | $this->host = $data['host']; |
| | | $this->user = $data['user']; |
| | | $this->pass = $pass; |
| | | $this->port = $port; |
| | | $this->ssl = $use_ssl; |
| | |
| | | |
| | | // use saved message set |
| | | if ($this->search_string && $mailbox == $this->mailbox) |
| | | return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order); |
| | | return $this->_list_header_set($mailbox, $page, $sort_field, $sort_order, $slice); |
| | | |
| | | $this->_set_sort_order($sort_field, $sort_order); |
| | | |
| | |
| | | { |
| | | $start_msg = ($page-1) * $this->page_size; |
| | | $a_msg_headers = $this->get_message_cache($cache_key, $start_msg, $start_msg+$this->page_size, $this->sort_field, $this->sort_order); |
| | | return array_values($a_msg_headers); |
| | | $result = array_values($a_msg_headers); |
| | | if ($slice) |
| | | $result = array_slice($result, -$slice, $slice); |
| | | return $result; |
| | | } |
| | | // cache is dirty, sync it |
| | | else if ($this->caching_enabled && $cache_status==-1 && !$recursive) |
| | | { |
| | | $this->sync_header_index($mailbox); |
| | | return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE); |
| | | return $this->_list_headers($mailbox, $page, $this->sort_field, $this->sort_order, TRUE, $slice); |
| | | } |
| | | |
| | | // retrieve headers from IMAP |
| | |
| | | * @param int Current page to list |
| | | * @param string Header field to sort by |
| | | * @param string Sort order [ASC|DESC] |
| | | * @param boolean Number of slice items to extract from result array |
| | | * @return array Indexed array with message header objects |
| | | * @access private |
| | | * @see rcube_imap::list_header_set() |
| | | */ |
| | | private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL) |
| | | private function _list_header_set($mailbox, $page=NULL, $sort_field=NULL, $sort_order=NULL, $slice=0) |
| | | { |
| | | if (!strlen($mailbox) || empty($this->search_set)) |
| | | return array(); |
| | |
| | | // get messages uids for one page |
| | | $msgs = array_slice(array_values($msgs), $start_msg, min(count($msgs)-$start_msg, $this->page_size)); |
| | | |
| | | if ($slice) |
| | | $msgs = array_slice($msgs, -$slice, $slice); |
| | | |
| | | // fetch headers |
| | | $this->_fetch_headers($mailbox, join(',',$msgs), $a_msg_headers, NULL); |
| | | |
| | |
| | | $a_index = $this->message_index('', $this->sort_field, $this->sort_order); |
| | | // get messages uids for one page... |
| | | $msgs = array_slice($a_index, $start_msg, min($cnt-$start_msg, $this->page_size)); |
| | | if ($slice) |
| | | $msgs = array_slice($msgs, -$slice, $slice); |
| | | // ...and fetch headers |
| | | $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL); |
| | | |
| | |
| | | $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($cnt-$start_msg, $this->page_size)); |
| | | $a_msg_headers = array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size)); |
| | | if ($slice) |
| | | $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice); |
| | | |
| | | return $a_msg_headers; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | else |
| | | $a_messages = iil_C_Search($this->conn, $mailbox, ($charset ? "CHARSET $charset " : '') . $criteria); |
| | | |
| | | // clean message list (there might be some empty entries) |
| | | if (is_array($a_messages)) |
| | | { |
| | | foreach ($a_messages as $i => $val) |
| | | if (empty($val)) |
| | | unset($a_messages[$i]); |
| | | } |
| | | |
| | | // update messagecount cache ? |
| | | // $a_mailbox_cache = get_cache('messagecount'); |
| | |
| | | |
| | | // write structure to cache |
| | | if ($this->caching_enabled) |
| | | $this->add_message_cache($cache_key, $msg_id, $headers, $struct); |
| | | $this->add_message_cache($cache_key, $this->_msg_id, $headers, $struct); |
| | | } |
| | | |
| | | return $struct; |
| | |
| | | { |
| | | $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true); |
| | | $structure = iml_GetRawStructureArray($structure_str); |
| | | // error or message not found |
| | | if (empty($structure)) |
| | | return false; |
| | | |
| | | $part_type = iml_GetPartTypeCode($structure, $part); |
| | | $o_part = new rcube_message_part; |
| | | $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other'); |
| | |
| | | |
| | | $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, $part, |
| | | $o_part->encoding, $print, $fp); |
| | | |
| | | |
| | | if ($fp || $print) |
| | | return true; |
| | | |
| | |
| | | if (!is_array($uids)) |
| | | $uids = explode(',',$uids); |
| | | |
| | | if ($flag=='UNDELETED') |
| | | $result = iil_C_Undelete($this->conn, $mailbox, join(',', $uids)); |
| | | else if ($flag=='UNSEEN') |
| | | $result = iil_C_Unseen($this->conn, $mailbox, join(',', $uids)); |
| | | else if ($flag=='UNFLAGGED') |
| | | $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), 'FLAGGED'); |
| | | if (strpos($flag, 'UN') === 0) |
| | | $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), substr($flag, 2)); |
| | | else |
| | | $result = iil_C_Flag($this->conn, $mailbox, join(',', $uids), $flag); |
| | | |
| | |
| | | $this->_set_messagecount($mailbox, 'ALL', $count*(-1)); |
| | | |
| | | return $result; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Remove message flag for one or several messages |
| | | * |
| | | * @param mixed Message UIDs as array or as comma-separated string |
| | | * @param string Flag to unset: SEEN, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT |
| | | * @param string Folder name |
| | | * @return boolean True on success, False on failure |
| | | * @see set_flag |
| | | */ |
| | | function unset_flag($uids, $flag, $mbox_name=NULL) |
| | | { |
| | | return $this->set_flag($uids, 'UN'.$flag, $mbox_name); |
| | | } |
| | | |
| | | |
| | |
| | | $key, |
| | | $index, |
| | | $headers->uid, |
| | | (string)rc_substr($this->db->encode($this->decode_header($headers->subject, TRUE)), 0, 128), |
| | | (string)rc_substr($this->db->encode($this->decode_header($headers->from, TRUE)), 0, 128), |
| | | (string)rc_substr($this->db->encode($this->decode_header($headers->to, TRUE)), 0, 128), |
| | | (string)rc_substr($this->db->encode($this->decode_header($headers->cc, TRUE)), 0, 128), |
| | | (string)mb_substr($this->db->encode($this->decode_header($headers->subject, TRUE)), 0, 128), |
| | | (string)mb_substr($this->db->encode($this->decode_header($headers->from, TRUE)), 0, 128), |
| | | (string)mb_substr($this->db->encode($this->decode_header($headers->to, TRUE)), 0, 128), |
| | | (string)mb_substr($this->db->encode($this->decode_header($headers->cc, TRUE)), 0, 128), |
| | | (int)$headers->size, |
| | | serialize($this->db->encode(clone $headers)), |
| | | is_object($struct) ? serialize($this->db->encode(clone $struct)) : NULL |
| | |
| | | if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p]) |
| | | $a_defaults[$p] = $folder; |
| | | else |
| | | $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP')); |
| | | $folders[$folder] = mb_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP')); |
| | | } |
| | | |
| | | // sort folders and place defaults on the top |