/** * Fetch message body of a specific message from the server * * @param int Message UID * @param string Part number * @param rcube_message_part Part object created by get_structure() * @param mixed True to print part, resource to write part contents in * @param resource File pointer to save the message part * @param boolean Disables charset conversion * @param int Only read this number of bytes * @param boolean Enables formatting of text/* parts bodies * * @return string Message/part body if not printed */ public function get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL, $skip_charset_conv=false, $max_bytes=0, $formatted=true) { if (!$this->check_connection()) { return null; } // get part data if not provided if (!is_object($o_part)) { $structure = $this->conn->getStructure($this->folder, $uid, true); $part_data = rcube_imap_generic::getStructurePartData($structure, $part); $o_part = new rcube_message_part; $o_part->ctype_primary = $part_data['type']; $o_part->encoding = $part_data['encoding']; $o_part->charset = $part_data['charset']; $o_part->size = $part_data['size']; } if ($o_part && $o_part->size) { $formatted = $formatted && $o_part->ctype_primary == 'text'; $body = $this->conn->handlePartBody($this->folder, $uid, true, $part ? $part : 'TEXT', $o_part->encoding, $print, $fp, $formatted, $max_bytes); } if ($fp || $print) { return true; } // convert charset (if text or message part) if ($body && preg_match('/^(text|message)$/', $o_part->ctype_primary)) { // Remove NULL characters if any (#1486189) if ($formatted && strpos($body, "\x00") !== false) { $body = str_replace("\x00", '', $body); } if (!$skip_charset_conv) { if (!$o_part->charset || strtoupper($o_part->charset) == 'US-ASCII') { // try to extract charset information from HTML meta tag (#1488125) if ($o_part->ctype_secondary == 'html' && preg_match('/<meta[^>]+charset=([a-z0-9-_]+)/i', $body, $m)) { $o_part->charset = strtoupper($m[1]); } else { $o_part->charset = $this->default_charset; } } $body = rcube_charset::convert($body, $o_part->charset); } } return $body; }