| | |
| | | var $default_charset = 'ISO-8859-1'; |
| | | var $struct_charset = NULL; |
| | | var $default_folders = array('INBOX'); |
| | | var $default_folders_lc = array('inbox'); |
| | | var $fetch_add_headers = ''; |
| | | var $cache = array(); |
| | | var $cache_keys = array(); |
| | |
| | | if ($use_ssl && extension_loaded('openssl')) |
| | | $ICL_SSL = $use_ssl == 'imaps' ? 'ssl' : $use_ssl; |
| | | else if ($use_ssl) { |
| | | raise_error(array('code' => 403, 'type' => 'imap', 'file' => __FILE__, |
| | | 'message' => 'Open SSL not available;'), TRUE, FALSE); |
| | | raise_error(array('code' => 403, 'type' => 'imap', |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'message' => "Open SSL not available"), TRUE, FALSE); |
| | | $port = 143; |
| | | } |
| | | |
| | |
| | | else if (!$this->conn && $GLOBALS['iil_error']) |
| | | { |
| | | $this->error_code = $GLOBALS['iil_errornum']; |
| | | raise_error(array('code' => 403, |
| | | 'type' => 'imap', |
| | | 'message' => $GLOBALS['iil_error']), TRUE, FALSE); |
| | | raise_error(array('code' => 403, 'type' => 'imap', |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'message' => $GLOBALS['iil_error']), TRUE, FALSE); |
| | | } |
| | | |
| | | // get server properties |
| | |
| | | if (is_array($arr)) |
| | | { |
| | | $this->default_folders = $arr; |
| | | $this->default_folders_lc = array(); |
| | | |
| | | // add inbox if not included |
| | | if (!in_array_nocase('INBOX', $this->default_folders)) |
| | | array_unshift($this->default_folders, 'INBOX'); |
| | | |
| | | // create a second list with lower cased names |
| | | foreach ($this->default_folders as $mbox) |
| | | $this->default_folders_lc[] = strtolower($mbox); |
| | | } |
| | | } |
| | | |
| | |
| | | if (!$force && is_array($a_mailbox_cache[$mailbox]) && isset($a_mailbox_cache[$mailbox][$mode])) |
| | | return $a_mailbox_cache[$mailbox][$mode]; |
| | | |
| | | if (!is_array($a_mailbox_cache[$mailbox])) |
| | | $a_mailbox_cache[$mailbox] = array(); |
| | | |
| | | // RECENT count is fetched a bit different |
| | | if ($mode == 'RECENT') |
| | | $count = iil_C_CheckForRecent($this->conn, $mailbox); |
| | |
| | | $index = $this->_search_index($mailbox, $search_str); |
| | | $count = is_array($index) ? count($index) : 0; |
| | | } |
| | | else |
| | | { |
| | | else { |
| | | if ($mode == 'UNSEEN') |
| | | $count = iil_C_CountUnseen($this->conn, $mailbox); |
| | | else |
| | | else { |
| | | $count = iil_C_CountMessages($this->conn, $mailbox); |
| | | $_SESSION['maxuid'][$mailbox] = $count ? $this->_id2uid($count) : 0; |
| | | } |
| | | } |
| | | |
| | | if (!is_array($a_mailbox_cache[$mailbox])) |
| | | $a_mailbox_cache[$mailbox] = array(); |
| | | |
| | | $a_mailbox_cache[$mailbox][$mode] = (int)$count; |
| | | |
| | | // write back to cache |
| | |
| | | |
| | | return count($a_msg_headers); |
| | | } |
| | | |
| | | /** |
| | | * Fetches IDS of pseudo recent messages. |
| | | * |
| | | * We compare the maximum UID to determine the number of |
| | | * new messages because the RECENT flag is not reliable. |
| | | * |
| | | * @param string Mailbox/folder name |
| | | * @return array List of recent message UIDs |
| | | */ |
| | | function recent_uids($mbox_name = null, $nofetch = false) |
| | | { |
| | | $mailbox = $mbox_name ? $this->mod_mailbox($mbox_name) : $this->mailbox; |
| | | $old_maxuid = intval($_SESSION['maxuid'][$mailbox]); |
| | | |
| | | // refresh message count -> will update $_SESSION['maxuid'][$mailbox] |
| | | $this->messagecount($mbox_name, 'ALL', true); |
| | | |
| | | if ($_SESSION['maxuid'][$mailbox] > $old_maxuid) { |
| | | $maxuid = max(1, $old_maxuid+1); |
| | | return array_values((array)iil_C_FetchHeaderIndex($this->conn, $mailbox, "$maxuid:*", 'UID', $this->skip_deleted, true)); |
| | | } |
| | | |
| | | return array(); |
| | | } |
| | | |
| | | /** |
| | | * Return sorted array of message IDs (not UIDs) |
| | |
| | | /** |
| | | * Append a mail message (source) to a specific mailbox |
| | | * |
| | | * @param string Target mailbox |
| | | * @param string Message source |
| | | * @param string Target mailbox |
| | | * @param string The message source string or filename |
| | | * @param string Headers string if $message contains only the body |
| | | * @param boolean True if $message is a filename |
| | | * |
| | | * @return boolean True on success, False on error |
| | | */ |
| | | function save_message($mbox_name, &$message) |
| | | function save_message($mbox_name, &$message, $headers='', $is_file=false) |
| | | { |
| | | $mailbox = $this->mod_mailbox($mbox_name); |
| | | |
| | | // make sure mailbox exists |
| | | if (($mailbox == 'INBOX') || in_array($mailbox, $this->_list_mailboxes())) |
| | | $saved = iil_C_Append($this->conn, $mailbox, $message); |
| | | if (($mailbox == 'INBOX') || in_array($mailbox, $this->_list_mailboxes())) { |
| | | if ($is_file) { |
| | | $separator = rcmail::get_instance()->config->header_delimiter(); |
| | | $saved = iil_C_AppendFromFile($this->conn, $mailbox, $message, |
| | | $headers, $separator.$separator); |
| | | } |
| | | else |
| | | $saved = iil_C_Append($this->conn, $mailbox, $message); |
| | | } |
| | | |
| | | if ($saved) |
| | | { |
| | |
| | | foreach ($this->default_folders as $folder) |
| | | { |
| | | $abs_name = $this->mod_mailbox($folder); |
| | | if (!in_array_nocase($abs_name, $a_folders)) |
| | | if (!in_array($abs_name, $a_folders)) |
| | | $this->create_mailbox($folder, TRUE); |
| | | else if (!in_array_nocase($abs_name, $a_subscribed)) |
| | | else if (!in_array($abs_name, $a_subscribed)) |
| | | $this->subscribe($folder); |
| | | } |
| | | } |
| | |
| | | if ((!empty($this->root_ns) && $this->root_ns == $mbox_name) || $mbox_name == 'INBOX') |
| | | return $mbox_name; |
| | | |
| | | if (!empty($this->root_dir) && $mode=='in') |
| | | $mbox_name = $this->root_dir.$this->delimiter.$mbox_name; |
| | | else if (strlen($this->root_dir) && $mode=='out') |
| | | $mbox_name = substr($mbox_name, strlen($this->root_dir)+1); |
| | | |
| | | if (!empty($this->root_dir)) { |
| | | if ($mode=='in') |
| | | $mbox_name = $this->root_dir.$this->delimiter.$mbox_name; |
| | | else if (!empty($mbox_name)) // $mode=='out' |
| | | $mbox_name = substr($mbox_name, strlen($this->root_dir)+1); |
| | | } |
| | | |
| | | return $mbox_name; |
| | | } |
| | | |
| | |
| | | if ($folder{0}=='.') |
| | | continue; |
| | | |
| | | if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p]) |
| | | 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')); |
| | |
| | | { |
| | | if (!$mbox_name) |
| | | $mbox_name = $this->mailbox; |
| | | |
| | | $index = array_flip((array)$this->uid_id_map[$mbox_name]); |
| | | if (isset($index[$id])) |
| | | $uid = $index[$id]; |
| | | else |
| | | { |
| | | $uid = iil_C_ID2UID($this->conn, $mbox_name, $id); |
| | | $this->uid_id_map[$mbox_name][$uid] = $id; |
| | | } |
| | | |
| | | if ($uid = array_search($id, (array)$this->uid_id_map[$mbox_name])) |
| | | return $uid; |
| | | |
| | | $uid = iil_C_ID2UID($this->conn, $mbox_name, $id); |
| | | $this->uid_id_map[$mbox_name][$uid] = $id; |
| | | |
| | | return $uid; |
| | | } |