diff --git a/include/class.mailparse.php b/include/class.mailparse.php index 21e8dc5286f968ebf7860fceec8326f47159d1aa..141d18f96419c0ffdc1fe9b9512ce74a48995ea6 100644 --- a/include/class.mailparse.php +++ b/include/class.mailparse.php @@ -53,18 +53,39 @@ class Mail_Parse { 'include_bodies'=> $this->include_bodies, 'decode_headers'=> $this->decode_headers, 'decode_bodies' => $this->decode_bodies); - $this->splitBodyHeader(); $this->struct=Mail_mimeDecode::decode($params); if (PEAR::isError($this->struct)) return false; + $this->splitBodyHeader(); + // Handle wrapped emails when forwarded if ($this->struct && $this->struct->parts) { $outer = $this->struct; $ctype = $outer->ctype_primary.'/'.$outer->ctype_secondary; - if (strcasecmp($ctype, 'message/rfc822') === 0) + if (strcasecmp($ctype, 'message/rfc822') === 0) { + // Capture Delivered-To header from the outer mail + $dt = $this->struct->headers['delivered-to']; + // Capture Message-Id from outer mail + $mid = $this->struct->headers['message-id']; + $this->struct = $outer->parts[0]; + + // Add (clobber) delivered to header from the outer mail + if ($dt) + $this->struct->headers['delivered-to'] = $dt; + // Ensure the nested mail has a Message-Id + if (!isset($this->struct->headers['message-id'])) + $this->struct->headers['message-id'] = $mid; + + // Use headers of the wrapped message + $headers = array(); + foreach ($this->struct->headers as $h=>$v) + $headers[mb_convert_case($h, MB_CASE_TITLE)] = $v; + $this->header = Format::array_implode( + ": ", "\n", $headers); + } } return (count($this->struct->headers) > 1); @@ -166,7 +187,9 @@ class Mail_Parse { } function getMessageId(){ - return $this->struct->headers['message-id']; + if (!($mid = $this->struct->headers['message-id'])) + $mid = sprintf('<%s@local>', md5($this->getHeader())); + return $mid; } function getSubject(){