| | |
| | | if (is_array($str) && $msgs == null) |
| | | list($str, $msgs, $charset, $sort_field) = $str; |
| | | if ($msgs != null && !is_array($msgs)) |
| | | $msgs = split(',', $msgs); |
| | | $msgs = explode(',', $msgs); |
| | | |
| | | $this->search_string = $str; |
| | | $this->search_set = $msgs; |
| | |
| | | { |
| | | $struct = new rcube_message_part; |
| | | $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count"; |
| | | |
| | | |
| | | // multipart |
| | | if (is_array($part[0])) |
| | | { |
| | |
| | | // fetch message headers if message/rfc822 or named part (could contain Content-Location header) |
| | | if (strtolower($part[$i][0]) == 'message' || |
| | | (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL'))) { |
| | | $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.$i+1 : $i+1; |
| | | $part_headers[] = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1; |
| | | } |
| | | |
| | | |
| | | // pre-fetch headers of all parts (in one command for better performance) |
| | | if ($part_headers) |
| | | $part_headers = iil_C_FetchMIMEHeaders($this->conn, $this->mailbox, $this->_msg_id, $part_headers); |
| | | |
| | | $struct->parts = array(); |
| | | for ($i=0, $count=0; $i<count($part); $i++) |
| | | if (is_array($part[$i]) && count($part[$i]) > 3) |
| | | if (is_array($part[$i]) && count($part[$i]) > 3) { |
| | | $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id, |
| | | $part_headers[$struct->mime_id ? $struck->mime_id.'.'.$i+1 : $i+1]); |
| | | $part_headers[$struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1]); |
| | | } |
| | | |
| | | return $struct; |
| | | } |
| | |
| | | |
| | | 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, '', $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); |
| | | if (!is_array($uids)) |
| | | $uids = explode(',',$uids); |
| | | |
| | | if ($flag=='UNDELETED') |
| | | $result = iil_C_Undelete($this->conn, $this->mailbox, join(',', $uids)); |
| | | $result = iil_C_Undelete($this->conn, $mailbox, join(',', $uids)); |
| | | else if ($flag=='UNSEEN') |
| | | $result = iil_C_Unseen($this->conn, $this->mailbox, join(',', $uids)); |
| | | $result = iil_C_Unseen($this->conn, $mailbox, join(',', $uids)); |
| | | else if ($flag=='UNFLAGGED') |
| | | $result = iil_C_UnFlag($this->conn, $this->mailbox, join(',', $uids), 'FLAGGED'); |
| | | $result = iil_C_UnFlag($this->conn, $mailbox, join(',', $uids), 'FLAGGED'); |
| | | else |
| | | $result = iil_C_Flag($this->conn, $this->mailbox, join(',', $uids), $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 ($uids as $uid) |
| | |
| | | |
| | | // 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; |
| | | } |
| | |
| | | // send expunge command in order to have the moved message |
| | | // really deleted from the source mailbox |
| | | if ($moved) { |
| | | // 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->_clear_messagecount($from_mbox); |
| | | $this->_clear_messagecount($to_mbox); |
| | | } |
| | | $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)) { |
| | |
| | | // 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]); |
| | | } |
| | |
| | | * 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) |
| | | { |
| | |
| | | { |
| | | 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 |
| | |
| | | return $posa - $posb; |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Add quoted-printable encoding to a given string |
| | | * |
| | | * @param string String to encode |
| | | * @param int Add new line after this number of characters |
| | | * @param boolean True if spaces should be converted into =20 |
| | | * @return string Encoded string |
| | | */ |
| | | function quoted_printable_encode($input, $line_max=76, $space_conv=false) |
| | | { |
| | | $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); |
| | | $lines = preg_split("/(?:\r\n|\r|\n)/", $input); |
| | | $eol = "\r\n"; |
| | | $escape = "="; |
| | | $output = ""; |
| | | |
| | | while( list(, $line) = each($lines)) |
| | | { |
| | | //$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary |
| | | $linlen = strlen($line); |
| | | $newline = ""; |
| | | for($i = 0; $i < $linlen; $i++) |
| | | { |
| | | $c = substr( $line, $i, 1 ); |
| | | $dec = ord( $c ); |
| | | if ( ( $i == 0 ) && ( $dec == 46 ) ) // convert first point in the line into =2E |
| | | { |
| | | $c = "=2E"; |
| | | } |
| | | if ( $dec == 32 ) |
| | | { |
| | | if ( $i == ( $linlen - 1 ) ) // convert space at eol only |
| | | { |
| | | $c = "=20"; |
| | | } |
| | | else if ( $space_conv ) |
| | | { |
| | | $c = "=20"; |
| | | } |
| | | } |
| | | else if ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) // always encode "\t", which is *not* required |
| | | { |
| | | $h2 = floor($dec/16); |
| | | $h1 = floor($dec%16); |
| | | $c = $escape.$hex["$h2"].$hex["$h1"]; |
| | | } |
| | | |
| | | if ( (strlen($newline) + strlen($c)) >= $line_max ) // CRLF is not counted |
| | | { |
| | | $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay |
| | | $newline = ""; |
| | | // check if newline first character will be point or not |
| | | if ( $dec == 46 ) |
| | | { |
| | | $c = "=2E"; |
| | | } |
| | | } |
| | | $newline .= $c; |
| | | } // end of for |
| | | $output .= $newline.$eol; |
| | | } // end of while |
| | | |
| | | return trim($output); |
| | | } |
| | | |
| | | |