Add lib for server side mime parsing (to be used by non-imap storage backends or as fallback if imap server doesn't provide a proper structure)

pull/1/head
thomascube 13 years ago
parent e472110e2c
commit 8b92d2b050

@ -40,11 +40,11 @@ class rcube_message
private $app;
/**
* Instance of imap class
* Instance of storage class
*
* @var rcube_imap
* @var rcube_storage
*/
private $imap;
private $storage;
/**
* Instance of mime class
@ -73,7 +73,7 @@ class rcube_message
*
* @param string $uid The message UID.
*
* @see self::$app, self::$imap, self::$opt, self::$structure
* @see self::$app, self::$storage, self::$opt, self::$parts
*/
function __construct($uid)
{
@ -172,7 +172,7 @@ class rcube_message
{
if ($part = $this->mime_parts[$mime_id]) {
// stored in message structure (winmail/inline-uuencode)
if ($part->encoding == 'stream') {
if (!empty($part->body) || $part->encoding == 'stream') {
if ($fp) {
fwrite($fp, $part->body);
}
@ -214,7 +214,7 @@ class rcube_message
foreach ($this->mime_parts as $mime_id => $part) {
$mimetype = strtolower($part->ctype_primary . '/' . $part->ctype_secondary);
if ($mimetype == 'text/html') {
return $this->storage->get_message_part($this->uid, $mime_id, $part);
return $this->get_part_content($mime_id);
}
}
}
@ -237,10 +237,10 @@ class rcube_message
$mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
if ($mimetype == 'text/plain') {
return $this->storage->get_message_part($this->uid, $mime_id, $part);
return $this->get_part_content($mime_id);
}
else if ($mimetype == 'text/html') {
$out = $this->storage->get_message_part($this->uid, $mime_id, $part);
$out = $this->get_part_content($mime_id);
// remove special chars encoding
$trans = array_flip(get_html_translation_table(HTML_ENTITIES));
@ -258,7 +258,7 @@ class rcube_message
/**
* Raad the message structure returend by the IMAP server
* Read the message structure returend by the IMAP server
* and build flat lists of content parts and attachments
*
* @param rcube_message_part $structure Message structure node

@ -1,6 +1,6 @@
<?php
/**
/*
+-----------------------------------------------------------------------+
| program/include/rcube_mime.php |
| |
@ -51,6 +51,67 @@ class rcube_mime
}
/**
* Parse the given raw message source and return a structure
* of rcube_message_part objects.
*
* It makes use of the PEAR:Mail_mimeDecode library
*
* @param string The message source
* @return object rcube_message_part The message structure
*/
public static function parse_message($raw_body)
{
$mime = new Mail_mimeDecode($raw_body);
$struct = $mime->decode(array('include_bodies' => true, 'decode_bodies' => true));
return self::structure_part($struct);
}
/**
* Recursive method to convert a Mail_mimeDecode part into a rcube_message_part object
*
* @param object A message part struct
* @param int Part count
* @param string Parent MIME ID
*
* @return object rcube_message_part
*/
private static function structure_part($part, $count=0, $parent='')
{
$struct = new rcube_message_part;
$struct->mime_id = $part->mime_id ? $part->mime_id : (empty($parent) ? (string)$count : "$parent.$count");
$struct->headers = $part->headers;
$struct->ctype_primary = $part->ctype_primary;
$struct->ctype_secondary = $part->ctype_secondary;
$struct->mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
$struct->ctype_parameters = $part->ctype_parameters;
if ($part->headers['content-transfer-encoding'])
$struct->encoding = $part->headers['content-transfer-encoding'];
if ($part->ctype_parameters['charset'])
$struct->charset = $part->ctype_parameters['charset'];
$part_charset = $struct->charset ? $struct->charset : self::$default_charset;
// TODO: determine filename
if (($filename = $part->d_parameters['filename']) || ($filename = $part->ctype_parameters['name'])) {
$struct->filename = rcube_mime::decode_mime_string($filename, $part_charset);
}
// copy part body and convert it to UTF-8 if necessary
$struct->body = $part->ctype_primary == 'text' ? rcube_charset::convert($part->body, $part_charset) : $part->body;
$struct->size = strlen($part->body);
$struct->disposition = $part->disposition;
foreach ((array)$part->parts as $child_part) {
$struct->parts[] = self::structure_part($child_part, ++$count, $struct->mime_id);
}
return $struct;
}
/**
* Split an address list into a structured array list
*

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save