| | |
| | | if (!empty($this->conn->rootdir)) |
| | | { |
| | | $this->set_rootdir($this->conn->rootdir); |
| | | $this->root_ns = ereg_replace('[\.\/]$', '', $this->conn->rootdir); |
| | | $this->root_ns = preg_replace('/[.\/]$/', '', $this->conn->rootdir); |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | function set_rootdir($root) |
| | | { |
| | | if (ereg('[\.\/]$', $root)) //(substr($root, -1, 1)==='/') |
| | | if (preg_match('/[.\/]$/', $root)) //(substr($root, -1, 1)==='/') |
| | | $root = substr($root, 0, -1); |
| | | |
| | | $this->root_dir = $root; |
| | |
| | | { |
| | | // delete from cache |
| | | if ($cache_index[$headers->id] && $cache_index[$headers->id] == $headers->uid) |
| | | $this->remove_message_cache($cache_key, $headers->id); |
| | | $this->remove_message_cache($cache_key, $headers->uid); |
| | | |
| | | $deleted_count++; |
| | | continue; |
| | |
| | | // other message at this position |
| | | if (isset($cache_index[$id])) |
| | | { |
| | | $this->remove_message_cache($cache_key, $id); |
| | | $this->remove_message_cache($cache_key, $cache_index[$id]); |
| | | unset($cache_index[$id]); |
| | | } |
| | | |
| | |
| | | if (!empty($cache_index)) |
| | | { |
| | | foreach ($cache_index as $id => $uid) |
| | | $this->remove_message_cache($cache_key, $id); |
| | | $this->remove_message_cache($cache_key, $uid); |
| | | } |
| | | } |
| | | |
| | |
| | | // set message charset from message headers |
| | | if ($headers->charset) |
| | | $this->struct_charset = $headers->charset; |
| | | // ... or from first part headers |
| | | else if (is_array($structure[2]) && $structure[2][0] == 'charset') |
| | | $this->struct_charset = $structure[2][1]; |
| | | else if (is_array($structure[0][2]) && $structure[0][2][0] == 'charset') |
| | | $this->struct_charset = $structure[0][2][1]; |
| | | else if (is_array($structure[0][0][2]) && $structure[0][0][2][0] == 'charset') |
| | | $this->struct_charset = $structure[0][0][2][1]; |
| | | else |
| | | $this->struct_charset = null; |
| | | $this->struct_charset = $this->_structure_charset($structure); |
| | | |
| | | $struct = &$this->_structure_part($structure); |
| | | $struct->headers = get_object_vars($headers); |
| | |
| | | $part->filename = rcube_charset_convert(urldecode($filename_encoded), $filename_charset); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * Get charset name from message structure (first part) |
| | | * |
| | | * @access private |
| | | * @param array Message structure |
| | | * @return string Charset name |
| | | */ |
| | | function _structure_charset($structure) |
| | | { |
| | | while (is_array($structure)) { |
| | | if (is_array($structure[2]) && $structure[2][0] == 'charset') |
| | | return $structure[2][1]; |
| | | $structure = $structure[0]; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Fetch message body of a specific message from the server |
| | | * |
| | |
| | | |
| | | if (!$part) $part = 'TEXT'; |
| | | |
| | | if ($print) |
| | | { |
| | | $mode = $o_part->encoding == 'base64' ? 3 : ($o_part->encoding == 'quoted-printable' ? 1 : 2); |
| | | $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, $mode); |
| | | $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, |
| | | $o_part->encoding, $print, $fp); |
| | | |
| | | // we have to decode the part manually before printing |
| | | if ($mode == 1) |
| | | { |
| | | echo $this->mime_decode($body, $o_part->encoding); |
| | | $body = true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if ($fp && $o_part->encoding == 'base64') |
| | | return iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 3, $fp); |
| | | else |
| | | $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1); |
| | | if ($fp || $print) |
| | | return true; |
| | | |
| | | // decode part body |
| | | if ($o_part->encoding) |
| | | $body = $this->mime_decode($body, $o_part->encoding); |
| | | // convert charset (if text or message part) |
| | | if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') { |
| | | // assume default if no charset specified |
| | | if (empty($o_part->charset)) |
| | | $o_part->charset = $this->default_charset; |
| | | |
| | | // convert charset (if text or message part) |
| | | if ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') |
| | | { |
| | | // assume default if no charset specified |
| | | if (empty($o_part->charset)) |
| | | $o_part->charset = $this->default_charset; |
| | | |
| | | $body = rcube_charset_convert($body, $o_part->charset); |
| | | } |
| | | |
| | | if ($fp) |
| | | { |
| | | fwrite($fp, $body); |
| | | return true; |
| | | } |
| | | $body = rcube_charset_convert($body, $o_part->charset); |
| | | } |
| | | |
| | | return $body; |
| | |
| | | function &get_body($uid, $part=1) |
| | | { |
| | | $headers = $this->get_headers($uid); |
| | | return rcube_charset_convert( |
| | | $this->mime_decode($this->get_message_part($uid, $part), 'quoted-printable'), |
| | | return rcube_charset_convert($this->get_message_part($uid, $part, NULL), |
| | | $headers->charset ? $headers->charset : $this->default_charset); |
| | | } |
| | | |
| | |
| | | if (!($msg_id = $this->_uid2id($uid))) |
| | | return FALSE; |
| | | |
| | | iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 2); |
| | | iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, NULL, true); |
| | | } |
| | | |
| | | |
| | |
| | | * |
| | | * @param mixed Message UIDs as array or as comma-separated string |
| | | * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT |
| | | * @param string Folder name |
| | | * @return boolean True on success, False on failure |
| | | */ |
| | | function set_flag($uids, $flag) |
| | | function set_flag($uids, $flag, $mbox_name=NULL) |
| | | { |
| | | $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox; |
| | | |
| | | $flag = strtoupper($flag); |
| | | $msg_ids = array(); |
| | | if (!is_array($uids)) |
| | | $uids = explode(',',$uids); |
| | | |
| | | foreach ($uids as $uid) { |
| | | $msg_ids[$uid] = $this->_uid2id($uid); |
| | | } |
| | | |
| | | if ($flag=='UNDELETED') |
| | | $result = iil_C_Undelete($this->conn, $this->mailbox, join(',', array_values($msg_ids))); |
| | | $result = iil_C_Undelete($this->conn, $mailbox, join(',', $uids)); |
| | | else if ($flag=='UNSEEN') |
| | | $result = iil_C_Unseen($this->conn, $this->mailbox, join(',', array_values($msg_ids))); |
| | | $result = iil_C_Unseen($this->conn, $mailbox, join(',', $uids)); |
| | | else if ($flag=='UNFLAGGED') |
| | | $result = iil_C_UnFlag($this->conn, $this->mailbox, join(',', array_values($msg_ids)), 'FLAGGED'); |
| | | $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), 'FLAGGED'); |
| | | else |
| | | $result = iil_C_Flag($this->conn, $this->mailbox, join(',', array_values($msg_ids)), $flag); |
| | | $result = iil_C_Flag($this->conn, $mailbox, join(',', $uids), $flag); |
| | | |
| | | // reload message headers if cached |
| | | $cache_key = $this->mailbox.'.msg'; |
| | | $cache_key = $mailbox.'.msg'; |
| | | if ($this->caching_enabled) |
| | | { |
| | | foreach ($msg_ids as $uid => $id) |
| | | { |
| | | foreach ($uids as $uid) |
| | | if ($cached_headers = $this->get_cached_message($cache_key, $uid)) |
| | | { |
| | | $this->remove_message_cache($cache_key, $id); |
| | | //$this->get_headers($uid); |
| | | } |
| | | } |
| | | $this->remove_message_cache($cache_key, $uid); |
| | | |
| | | // close and re-open connection |
| | | // this prevents connection problems with Courier |
| | |
| | | } |
| | | |
| | | // set nr of messages that were flaged |
| | | $count = count($msg_ids); |
| | | $count = count($uids); |
| | | |
| | | // clear message count cache |
| | | if ($result && $flag=='SEEN') |
| | | $this->_set_messagecount($this->mailbox, 'UNSEEN', $count*(-1)); |
| | | $this->_set_messagecount($mailbox, 'UNSEEN', $count*(-1)); |
| | | else if ($result && $flag=='UNSEEN') |
| | | $this->_set_messagecount($this->mailbox, 'UNSEEN', $count); |
| | | $this->_set_messagecount($mailbox, 'UNSEEN', $count); |
| | | else if ($result && $flag=='DELETED') |
| | | $this->_set_messagecount($this->mailbox, 'ALL', $count*(-1)); |
| | | $this->_set_messagecount($mailbox, 'ALL', $count*(-1)); |
| | | |
| | | return $result; |
| | | } |
| | |
| | | $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL); |
| | | |
| | | // exit if no message uids are specified |
| | | if (!is_array($a_uids)) |
| | | if (!is_array($a_uids) || empty($a_uids)) |
| | | return false; |
| | | |
| | | // convert uids to message ids |
| | | $a_mids = array(); |
| | | foreach ($a_uids as $uid) |
| | | $a_mids[] = $this->_uid2id($uid, $from_mbox); |
| | | |
| | | $iil_move = iil_C_Move($this->conn, join(',', $a_mids), $from_mbox, $to_mbox); |
| | | $iil_move = iil_C_Move($this->conn, join(',', $a_uids), $from_mbox, $to_mbox); |
| | | $moved = !($iil_move === false || $iil_move < 0); |
| | | |
| | | // send expunge command in order to have the moved message |
| | |
| | | // but only when flag_for_deletion is set to false |
| | | if (!rcmail::get_instance()->config->get('flag_for_deletion', false)) |
| | | { |
| | | $this->_expunge($from_mbox, FALSE); |
| | | $this->_expunge($from_mbox, FALSE, $a_uids); |
| | | $this->_clear_messagecount($from_mbox); |
| | | $this->_clear_messagecount($to_mbox); |
| | | } |
| | | } |
| | | // moving failed |
| | | else if (rcmail::get_instance()->config->get('delete_always', false)) { |
| | | return iil_C_Delete($this->conn, $from_mbox, join(',', $a_mids)); |
| | | return iil_C_Delete($this->conn, $from_mbox, join(',', $a_uids)); |
| | | } |
| | | |
| | | // remove message ids from search set |
| | | if ($moved && $this->search_set && $from_mbox == $this->mailbox) |
| | | if ($moved && $this->search_set && $from_mbox == $this->mailbox) { |
| | | foreach ($a_uids as $uid) |
| | | $a_mids[] = $this->_uid2id($uid, $from_mbox); |
| | | $this->search_set = array_diff($this->search_set, $a_mids); |
| | | |
| | | } |
| | | // update cached message headers |
| | | $cache_key = $from_mbox.'.msg'; |
| | | if ($moved && ($a_cache_index = $this->get_message_cache_index($cache_key))) |
| | |
| | | $a_uids = is_string($uids) ? explode(',', $uids) : (is_array($uids) ? $uids : NULL); |
| | | |
| | | // exit if no message uids are specified |
| | | if (!is_array($a_uids)) |
| | | if (!is_array($a_uids) || empty($a_uids)) |
| | | return false; |
| | | |
| | | // convert uids to message ids |
| | | $a_mids = array(); |
| | | foreach ($a_uids as $uid) |
| | | $a_mids[] = $this->_uid2id($uid, $mailbox); |
| | | |
| | | $deleted = iil_C_Delete($this->conn, $mailbox, join(',', $a_mids)); |
| | | $deleted = iil_C_Delete($this->conn, $mailbox, join(',', $a_uids)); |
| | | |
| | | // send expunge command in order to have the deleted message |
| | | // really deleted from the mailbox |
| | | if ($deleted) |
| | | { |
| | | $this->_expunge($mailbox, FALSE); |
| | | $this->_expunge($mailbox, FALSE, $a_uids); |
| | | $this->_clear_messagecount($mailbox); |
| | | unset($this->uid_id_map[$mailbox]); |
| | | } |
| | | |
| | | // remove message ids from search set |
| | | if ($deleted && $this->search_set && $mailbox == $this->mailbox) |
| | | if ($deleted && $this->search_set && $mailbox == $this->mailbox) { |
| | | foreach ($a_uids as $uid) |
| | | $a_mids[] = $this->_uid2id($uid, $mailbox); |
| | | $this->search_set = array_diff($this->search_set, $a_mids); |
| | | |
| | | } |
| | | |
| | | // remove deleted messages from cache |
| | | $cache_key = $mailbox.'.msg'; |
| | | if ($deleted && ($a_cache_index = $this->get_message_cache_index($cache_key))) |
| | |
| | | * Send IMAP expunge command and clear cache |
| | | * |
| | | * @see rcube_imap::expunge() |
| | | * @param string Mailbox name |
| | | * @param boolean False if cache should not be cleared |
| | | * @param string List of UIDs to remove, separated by comma |
| | | * @return boolean True on success |
| | | * @access private |
| | | */ |
| | | function _expunge($mailbox, $clear_cache=TRUE) |
| | | function _expunge($mailbox, $clear_cache=TRUE, $uids=NULL) |
| | | { |
| | | $result = iil_C_Expunge($this->conn, $mailbox); |
| | | if ($uids && $this->get_capability('UIDPLUS')) |
| | | $a_uids = is_array($uids) ? join(',', $uids) : $uids; |
| | | else |
| | | $a_uids = NULL; |
| | | |
| | | $result = iil_C_Expunge($this->conn, $mailbox, $a_uids); |
| | | |
| | | if ($result>=0 && $clear_cache) |
| | | { |
| | |
| | | /** |
| | | * @access private |
| | | */ |
| | | function remove_message_cache($key, $index) |
| | | function remove_message_cache($key, $uid) |
| | | { |
| | | if (!$this->caching_enabled) |
| | | return; |
| | |
| | | "DELETE FROM ".get_table_name('messages')." |
| | | WHERE user_id=? |
| | | AND cache_key=? |
| | | AND idx=?", |
| | | AND uid=?", |
| | | $_SESSION['user_id'], |
| | | $key, |
| | | $index); |
| | | $uid); |
| | | } |
| | | |
| | | /** |
| | |
| | | { |
| | | switch (strtolower($encoding)) |
| | | { |
| | | case '7bit': |
| | | return $input; |
| | | break; |
| | | |
| | | case 'quoted-printable': |
| | | return quoted_printable_decode($input); |
| | | break; |
| | |
| | | case 'base64': |
| | | return base64_decode($input); |
| | | break; |
| | | |
| | | |
| | | case 'x-uuencode': |
| | | case 'x-uue': |
| | | case 'uue': |
| | | case 'uuencode': |
| | | return convert_uudecode($input); |
| | | break; |
| | | |
| | | case '7bit': |
| | | default: |
| | | return $input; |
| | | } |
| | |
| | | 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, 'UTF-7')); |
| | | $folders[$folder] = rc_strtolower(rcube_charset_convert($folder, 'UTF7-IMAP')); |
| | | } |
| | | |
| | | // sort folders and place defaults on the top |