diff options
author | thomascube <thomas@roundcube.net> | 2009-02-08 20:38:54 +0000 |
---|---|---|
committer | thomascube <thomas@roundcube.net> | 2009-02-08 20:38:54 +0000 |
commit | 21b160f38c98bf41ebc843e7639b5b1af588b489 (patch) | |
tree | 08bad782ccc1a146191c7af17d28cf718fc62924 /program/include | |
parent | 0ea8d3a08e6055293aaa689bff6525522986e71c (diff) |
Added TNEF support to decode MS Outlook (winmail.dat) attachments
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/rcube_imap.php | 37 | ||||
-rw-r--r-- | program/include/rcube_message.php | 12 |
2 files changed, 46 insertions, 3 deletions
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index d4bcc7462..0e2dd6a07 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -26,6 +26,7 @@ */ require_once('lib/imap.inc'); require_once('lib/mime.inc'); +require_once('lib/tnef_decoder.inc'); /** @@ -1602,7 +1603,7 @@ class rcube_imap $from_mbox = $from_mbox ? $this->_mod_mailbox($from_mbox) : $this->mailbox; // make sure mailbox exists - if (!in_array($to_mbox, $this->_list_mailboxes())) + if ($to_mbox != 'INBOX' && !in_array($to_mbox, $this->_list_mailboxes())) { if (in_array($to_mbox_in, $this->default_folders)) $this->create_mailbox($to_mbox_in, TRUE); @@ -2492,6 +2493,40 @@ class rcube_imap return $out; } + + + /** + * Decode a Microsoft Outlook TNEF part (winmail.dat) + * + * @param object rcube_message_part Message part to decode + * @param string UID of the message + * @return array List of rcube_message_parts extracted from windmail.dat + */ + function tnef_decode(&$part, $uid) + { + if (!isset($part->body)) + $part->body = $this->get_message_part($uid, $part->mime_id, $part); + + $pid = 0; + $tnef_parts = array(); + $tnef_arr = tnef_decode($part->body); + foreach ($tnef_arr as $winatt) { + $tpart = new rcube_message_part; + $tpart->filename = $winatt["name"]; + $tpart->encoding = 'stream'; + $tpart->ctype_primary = $winatt["type0"]; + $tpart->ctype_secondary = $winatt["type1"]; + $tpart->mimetype = strtolower($winatt["type0"] . "/" . $winatt["type1"]); + $tpart->mime_id = "winmail." . $part->mime_id . ".$pid"; + $tpart->size = $winatt["size"]; + $tpart->body = $winatt['stream']; + + $tnef_parts[] = $tpart; + $pid++; + } + + return $tnef_parts; + } /** diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php index fa2aebc5c..513cb4c07 100644 --- a/program/include/rcube_message.php +++ b/program/include/rcube_message.php @@ -366,6 +366,14 @@ class rcube_message // ignore "virtual" protocol parts else if ($primary_type == 'protocol') continue; + + // part is Microsoft outlook TNEF (winmail.dat) + else if ($primary_type == 'application' && $secondary_type == 'ms-tnef') { + foreach ((array)$this->imap->tnef_decode($mail_part, $structure->headers['uid']) as $tnef_part) { + $this->mime_parts[$tnef_part->mime_id] = $tnef_part; + $this->attachments[] = $tnef_part; + } + } // part is file/attachment else if ($mail_part->disposition == 'attachment' || $mail_part->disposition == 'inline' || @@ -381,10 +389,10 @@ class rcube_message if ($mail_part->headers['content-location']) $mail_part->content_location = $mail_part->headers['content-base'] . $mail_part->headers['content-location']; - if ($mail_part->content_id || $mail_part->content_location) { + if ($mail_part->content_id || $mail_part->content_location) { $this->inline_parts[] = $mail_part; } - } + } // is regular attachment else { if (!$mail_part->filename) |