Example #1
0
 /**
  * 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, "") !== false) {
             $body = str_replace("", '', $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;
 }