/** * __construct * * Provide a uid, and parse message structure. * * @param string $uid The message UID. * * @uses rcmail::get_instance() * @uses rcube_imap::decode_mime_string() * @uses self::set_safe() * * @see self::$app, self::$imap, self::$opt, self::$structure */ function __construct($uid) { $this->app = rcmail::get_instance(); $this->imap = $this->app->imap; $this->uid = $uid; $this->headers = $this->imap->get_headers($uid, NULL, true, true); $this->subject = rcube_imap::decode_mime_string($this->headers->subject, $this->headers->charset); list(, $this->sender) = each($this->imap->decode_address_list($this->headers->from)); $this->set_safe(intval($_GET['_safe']) || $_SESSION['safe_messages'][$uid]); $this->opt = array('safe' => $this->is_safe, 'prefer_html' => $this->app->config->get('prefer_html'), 'get_url' => rcmail_url('get', array('_mbox' => $this->imap->get_mailbox_name(), '_uid' => $uid))); if ($this->structure = $this->imap->get_structure($uid, $this->headers->body_structure)) { $this->get_mime_numbers($this->structure); $this->parse_structure($this->structure); } else { $this->body = $this->imap->get_body($uid); } }
/** * __construct * * Provide a uid, and parse message structure. * * @param string $uid The message UID. * * @uses rcmail::get_instance() * @uses rcube_imap::decode_mime_string() * @uses self::set_safe() * * @see self::$app, self::$imap, self::$opt, self::$structure */ function __construct($uid) { $this->app = rcmail::get_instance(); $this->imap = $this->app->imap; $this->imap->get_all_headers = true; $this->uid = $uid; $this->headers = $this->imap->get_message($uid); if (!$this->headers) { return; } $this->subject = rcube_imap::decode_mime_string($this->headers->subject, $this->headers->charset); list(, $this->sender) = each($this->imap->decode_address_list($this->headers->from)); $this->set_safe(intval($_GET['_safe']) || $_SESSION['safe_messages'][$uid]); $this->opt = array('safe' => $this->is_safe, 'prefer_html' => $this->app->config->get('prefer_html'), 'get_url' => rcmail_url('get', array('_mbox' => $this->imap->get_mailbox_name(), '_uid' => $uid))); if (!empty($this->headers->structure)) { $this->get_mime_numbers($this->headers->structure); $this->parse_structure($this->headers->structure); } else { $this->body = $this->imap->get_body($uid); } // notify plugins and let them analyze this structured message object $this->app->plugins->exec_hook('message_load', array('object' => $this)); }
/** * Decode a mime-encoded string to internal charset * * @param string $input Header value * @param string $fallback Fallback charset if none specified * * @return string Decoded string * @static */ public static function decode_mime_string($input, $fallback = null) { // Initialize variable $out = ''; // Iterate instead of recursing, this way if there are too many values we don't have stack overflows // rfc: all line breaks or other characters not found // in the Base64 Alphabet must be ignored by decoding software // delete all blanks between MIME-lines, differently we can // receive unnecessary blanks and broken utf-8 symbols $input = preg_replace("/\\?=\\s+=\\?/", '?==?', $input); // Check if there is stuff to decode if (strpos($input, '=?') !== false) { // Loop through the string to decode all occurences of =? ?= into the variable $out while (($pos = strpos($input, '=?')) !== false) { // Append everything that is before the text to be decoded $out .= substr($input, 0, $pos); // Get the location of the text to decode $end_cs_pos = strpos($input, "?", $pos + 2); $end_en_pos = strpos($input, "?", $end_cs_pos + 1); $end_pos = strpos($input, "?=", $end_en_pos + 1); // Extract the encoded string $encstr = substr($input, $pos + 2, $end_pos - $pos - 2); // Extract the remaining string $input = substr($input, $end_pos + 2); // Decode the string fragement $out .= rcube_imap::_decode_mime_string_part($encstr); } // Deocde the rest (if any) if (strlen($input) != 0) { $out .= rcube_imap::decode_mime_string($input, $fallback); } // return the results return $out; } // no encoding information, use fallback return rcube_charset_convert($input, !empty($fallback) ? $fallback : rcmail::get_instance()->config->get('default_charset', 'ISO-8859-1')); }
/** * Decode a message header value * * @param string $input Header value * @param boolean $remove_quotas Remove quotes if necessary * @return string Decoded string */ function decode_header($input, $remove_quotes = false) { $str = rcube_imap::decode_mime_string((string) $input, $this->default_charset); if ($str[0] == '"' && $remove_quotes) { $str = str_replace('"', '', $str); } return $str; }