| | |
| | | { |
| | | $this->close(); |
| | | $this->connect($this->host, $this->user, $this->pass, $this->port, $this->ssl); |
| | | |
| | | // issue SELECT command to restore connection status |
| | | if ($this->mailbox) |
| | | iil_C_Select($this->conn, $this->mailbox); |
| | | } |
| | | |
| | | |
| | |
| | | * an object structure similar to the one generated by PEAR::Mail_mimeDecode |
| | | * |
| | | * @param int Message UID to fetch |
| | | * @return object stdClass Message part tree or False on failure |
| | | * @return object rcube_message_part Message part tree or False on failure |
| | | */ |
| | | function &get_structure($uid) |
| | | { |
| | |
| | | $headers = &$this->get_cached_message($cache_key, $uid, true); |
| | | |
| | | // return cached message structure |
| | | if (is_object($headers) && is_object($headers->structure)) |
| | | if (is_object($headers) && is_object($headers->structure)) { |
| | | return $headers->structure; |
| | | |
| | | // resolve message sequence number |
| | | if (!($msg_id = $this->_uid2id($uid))) |
| | | return FALSE; |
| | | } |
| | | |
| | | $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); |
| | | // resolve message sequence number |
| | | if (!($msg_id = $this->_uid2id($uid))) { |
| | | return FALSE; |
| | | } |
| | | |
| | | $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); |
| | | $structure = iml_GetRawStructureArray($structure_str); |
| | | $struct = false; |
| | | |
| | |
| | | if ($this->caching_enabled) |
| | | $this->add_message_cache($cache_key, $msg_id, $headers, $struct); |
| | | } |
| | | |
| | | |
| | | return $struct; |
| | | } |
| | | |
| | |
| | | { |
| | | if (!empty($part->d_parameters['filename'])) |
| | | $filename_mime = $part->d_parameters['filename']; |
| | | else if (!empty($part->ctype_parameters['name'])) |
| | | $filename_mime = $part->ctype_parameters['name']; |
| | | else if (!empty($part->d_parameters['filename*'])) |
| | | $filename_encoded = $part->d_parameters['filename*']; |
| | | else if (!empty($part->ctype_parameters['name*'])) |
| | |
| | | else if (!empty($part->d_parameters['filename*0'])) { |
| | | $i = 0; |
| | | while (isset($part->d_parameters['filename*'.$i])) { |
| | | $i++; |
| | | $filename_mime .= $part->d_parameters['filename*'.$i]; |
| | | } |
| | | $i++; |
| | | } |
| | | // some servers (eg. dovecot-1.x) have no support for parameter value continuations |
| | | // we must fetch and parse headers "manually" |
| | | //TODO: fetching headers for a second time is not effecient, this code should be moved somewhere earlier --tensor |
| | | if ($i<2) { |
| | | // TODO: fetch only Content-Type/Content-Disposition header |
| | | $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); |
| | | $filename_mime = ''; |
| | | $i = 0; |
| | | while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_mime .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); |
| | | $filename_mime = ''; |
| | | $i = 0; |
| | | while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_mime .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | } |
| | | else if (!empty($part->d_parameters['filename*0*'])) { |
| | | $i = 0; |
| | | while (isset($part->d_parameters['filename*'.$i.'*'])) { |
| | | $filename_encoded .= $part->d_parameters['filename*'.$i.'*']; |
| | | $i++; |
| | | $filename_encoded .= $part->d_parameters['filename*'.$i.'*']; |
| | | } |
| | | if ($i<2) { |
| | | $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); |
| | | $filename_encoded = ''; |
| | | $i = 0; |
| | | while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_encoded .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | } |
| | | if ($i<2) { |
| | | $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); |
| | | $filename_encoded = ''; |
| | | $i = 0; $matches = array(); |
| | | while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_encoded .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | } |
| | | else if (!empty($part->ctype_parameters['name*0'])) { |
| | | $i = 0; |
| | | while (isset($part->ctype_parameters['name*'.$i])) { |
| | | $i++; |
| | | $filename_mime .= $part->ctype_parameters['name*'.$i]; |
| | | } |
| | | if ($i<2) { |
| | | $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); |
| | | $filename_mime = ''; |
| | | $i = 0; |
| | | while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_mime .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | $i++; |
| | | } |
| | | if ($i<2) { |
| | | $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); |
| | | $filename_mime = ''; |
| | | $i = 0; $matches = array(); |
| | | while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_mime .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | } |
| | | else if (!empty($part->ctype_parameters['name*0*'])) { |
| | | $i = 0; |
| | | while (isset($part->ctype_parameters['name*'.$i.'*'])) { |
| | | $i++; |
| | | $filename_encoded .= $part->ctype_parameters['name*'.$i.'*']; |
| | | } |
| | | if ($i<2) { |
| | | $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); |
| | | $filename_encoded = ''; |
| | | $i = 0; |
| | | while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_encoded .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | $i++; |
| | | } |
| | | if ($i<2) { |
| | | $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); |
| | | $filename_encoded = ''; |
| | | $i = 0; $matches = array(); |
| | | while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { |
| | | $filename_encoded .= $matches[1]; |
| | | $i++; |
| | | } |
| | | } |
| | | } |
| | | // read 'name' after rfc2231 parameters as it may contains truncated filename (from Thunderbird) |
| | | else if (!empty($part->ctype_parameters['name'])) |
| | | $filename_mime = $part->ctype_parameters['name']; |
| | | // Content-Disposition |
| | | else if (!empty($part->headers['content-description'])) |
| | | $filename_mime = $part->headers['content-description']; |
| | |
| | | // decode filename |
| | | if (!empty($filename_mime)) { |
| | | $part->filename = rcube_imap::decode_mime_string($filename_mime, |
| | | $part->charset ? $part->charset : rc_detect_encoding($filename_mime, $this->default_charset)); |
| | | $part->charset ? $part->charset : rc_detect_encoding($filename_mime, $this->default_charset)); |
| | | } |
| | | else if (!empty($filename_encoded)) { |
| | | // decode filename according to RFC 2231, Section 4 |
| | | list($filename_charset,, $filename_urlencoded) = split('\'', $filename_encoded); |
| | | $part->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset); |
| | | if (preg_match("/^([^']*)'[^']*'(.*)$/", $filename_encoded, $fmatches)) { |
| | | $filename_charset = $fmatches[1]; |
| | | $filename_encoded = $fmatches[2]; |
| | | } |
| | | $part->filename = rcube_charset_convert(urldecode($filename_encoded), $filename_charset); |
| | | } |
| | | } |
| | | |
| | |
| | | * @param string Part number |
| | | * @param object rcube_message_part Part object created by get_structure() |
| | | * @param mixed True to print part, ressource to write part contents in |
| | | * @param resource File pointer to save the message part |
| | | * @return string Message/part body if not printed |
| | | */ |
| | | function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL) |
| | | function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL) |
| | | { |
| | | if (!($msg_id = $this->_uid2id($uid))) |
| | | return FALSE; |
| | |
| | | } |
| | | else |
| | | { |
| | | $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1); |
| | | 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); |
| | | |
| | | // decode part body |
| | | if ($o_part->encoding) |
| | |
| | | |
| | | $body = rcube_charset_convert($body, $o_part->charset); |
| | | } |
| | | |
| | | if ($fp) |
| | | { |
| | | fwrite($fp, $body); |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | |
| | | return $body; |
| | | } |
| | | |
| | |
| | | $body .= iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 1); |
| | | |
| | | return $body; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Returns the message headers as string |
| | | * |
| | | * @param int Message UID |
| | | * @return string Message headers string |
| | | */ |
| | | function &get_raw_headers($uid) |
| | | { |
| | | if (!($msg_id = $this->_uid2id($uid))) |
| | | return FALSE; |
| | | |
| | | $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL); |
| | | |
| | | return $headers; |
| | | } |
| | | |
| | | |
| | |
| | | $mailbox = $this->_mod_mailbox($mbox_name); |
| | | |
| | | // make sure mailbox exists |
| | | if (in_array($mailbox, $this->_list_mailboxes())) |
| | | if (($mailbox == 'INBOX') || in_array($mailbox, $this->_list_mailboxes())) |
| | | $saved = iil_C_Append($this->conn, $mailbox, $message); |
| | | |
| | | if ($saved) |