From 784c67f4f4859bbbce89afc39eceb2996e772664 Mon Sep 17 00:00:00 2001 From: Jared Hancock <jared@osticket.com> Date: Tue, 4 Feb 2014 11:44:06 -0600 Subject: [PATCH] pipe: Use Delivered-To and Message-Id from outer If a wrapped mail is sent, copy the Delivered-To header into the nested message so it will be clear(er) how the mail arrived into the system. Also, copy the Message-Id into the nested mail if there is none to help against mails delivered repeatedly. --- include/class.mailparse.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/include/class.mailparse.php b/include/class.mailparse.php index 21e8dc528..141d18f96 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(){ -- GitLab