| | |
| | | private $opt = array(); |
| | | private $inline_parts = array(); |
| | | private $parse_alternative = false; |
| | | |
| | | |
| | | public $uid = null; |
| | | public $headers; |
| | | public $structure; |
| | |
| | | public $subject = ''; |
| | | public $sender = null; |
| | | public $is_safe = false; |
| | | |
| | | |
| | | |
| | | /** |
| | | * __construct |
| | |
| | | // notify plugins and let them analyze this structured message object |
| | | $this->app->plugins->exec_hook('message_load', array('object' => $this)); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * Return a (decoded) message header |
| | | * |
| | |
| | | return $raw ? $value : $this->imap->decode_header($value); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Set is_safe var and session data |
| | | * |
| | |
| | | if ($plugin['abort']) |
| | | continue; |
| | | |
| | | if ($part_mimetype == 'text/html') { |
| | | $got_html_part = true; |
| | | } |
| | | |
| | | $mail_part = $plugin['structure']; |
| | | list($primary_type, $secondary_type) = explode('/', $plugin['mimetype']); |
| | | |
| | |
| | | $mail_part->type = 'content'; |
| | | $this->parts[] = $mail_part; |
| | | } |
| | | |
| | | |
| | | // list as attachment as well |
| | | if (!empty($mail_part->filename)) |
| | | $this->attachments[] = $mail_part; |
| | |
| | | } |
| | | // part is a file/attachment |
| | | else if (preg_match('/^(inline|attach)/', $mail_part->disposition) || |
| | | $mail_part->headers['content-id'] || (empty($mail_part->disposition) && $mail_part->filename) |
| | | $mail_part->headers['content-id'] || |
| | | ($mail_part->filename && |
| | | (empty($mail_part->disposition) || preg_match('/^[a-z0-9!#$&.+^_-]+$/i', $mail_part->disposition))) |
| | | ) { |
| | | // skip apple resource forks |
| | | if ($message_ctype_secondary == 'appledouble' && $secondary_type == 'applefile') |
| | |
| | | // attachment encapsulated within message/rfc822 part needs further decoding (#1486743) |
| | | else if ($part_orig_mimetype == 'message/rfc822') { |
| | | $this->parse_structure($mail_part, true); |
| | | |
| | | // list as attachment as well (mostly .eml) |
| | | if (!empty($mail_part->filename)) |
| | | $this->attachments[] = $mail_part; |
| | | } |
| | | // is a regular attachment |
| | | else if (preg_match('!^[a-z0-9-.+_]+/[a-z0-9-.+_]+$!i', $part_mimetype)) { |
| | | // is a regular attachment (content-type name regexp according to RFC4288.4.2) |
| | | else if (preg_match('/^[a-z0-9!#$&.+^_-]+\/[a-z0-9!#$&.+^_-]+$/i', $part_mimetype)) { |
| | | if (!$mail_part->filename) |
| | | $mail_part->filename = 'Part '.$mail_part->mime_id; |
| | | $this->attachments[] = $mail_part; |
| | |
| | | $part_url = $this->get_part_url($inline_object->mime_id); |
| | | if ($inline_object->content_id) |
| | | $a_replaces['cid:'.$inline_object->content_id] = $part_url; |
| | | if ($inline_object->content_location) |
| | | if ($inline_object->content_location) { |
| | | $a_replaces[$inline_object->content_location] = $part_url; |
| | | } |
| | | // MS Outlook sends sometimes non-related attachments as related |
| | | // In this case multipart/related message has only one text part |
| | | // We'll add all such attachments to the attachments list |
| | | if (!isset($got_html_part) && empty($inline_object->content_id) |
| | | && !empty($inline_object->filename) |
| | | ) { |
| | | $this->attachments[] = $inline_object; |
| | | } |
| | | } |
| | | |
| | | // add replace array to each content part |