diff --git a/include/class.mailfetch.php b/include/class.mailfetch.php index 0b739e7c82eeb4a9a1668a096effcbc8ade8616e..237d1d9f78b79621edb6a46134c765a20e9b28ca 100644 --- a/include/class.mailfetch.php +++ b/include/class.mailfetch.php @@ -515,15 +515,23 @@ class MailFetcher { return false; } - function getOriginalMessage($mid) { - if (!($body = $this->getPart($mid, 'message/rfc822'))) - return null; + function getOriginalMessageHeaders($mid) { + if (!($body = $this->getPart($mid, 'message/rfc822'))) { + // Handle rfc1892 style bounces + if (!($body = $this->getPart($mid, 'text/rfc822-headers'))) { + return null; + } + else { + // Add a junk body for the parser + $body .= "\n\nIgnored"; + } + } $msg = new Mail_Parse($body); if (!$msg->decode()) return null; - return $msg->struct; + return $msg->struct->headers; } function getPriority($mid) { @@ -619,9 +627,9 @@ class MailFetcher { if ($this->isBounceNotice($mid)) { // Fetch the original References and assign to 'references' - if ($msg = $this->getOriginalMessage($mid)) { - $vars['references'] = $msg->headers['references']; - unset($vars['in-reply-to']); + if ($headers = $this->getOriginalMessageHeaders($mid)) { + $vars['references'] = $headers['references']; + $vars['in-reply-to'] = @$headers['in-reply-to'] ?: null; } // Fetch deliver status report $vars['message'] = $this->getDeliveryStatusMessage($mid); diff --git a/include/class.mailparse.php b/include/class.mailparse.php index 378c68c1959e2a5c6ff4d442a9b8282c43c7aee3..5b1a0271037fe473f760db7535e9c2f2277220de 100644 --- a/include/class.mailparse.php +++ b/include/class.mailparse.php @@ -268,11 +268,17 @@ class Mail_Parse { return false; } - function getOriginalMessage() { + function getOriginalMessageHeaders() { foreach ($this->struct->parts as $p) { $ctype = $p->ctype_primary.'/'.$p->ctype_secondary; if (strtolower($ctype) === 'message/rfc822') - return $p->parts[0]; + return $p->parts[0]->headers; + // Handle rfc1892 style bounces + if (strtolower($ctype) === 'text/rfc822-headers') { + $T = new Mail_mimeDecode($p->body . "\n\nIgnored"); + if ($struct = $T->decode()) + return $struct->headers; + } } return null; } @@ -604,8 +610,10 @@ class EmailDataParser { if ($parser->isBounceNotice()) { // Fetch the original References and assign to 'references' - if ($msg = $parser->getOriginalMessage()) - $data['references'] = $msg->headers['references']; + if ($headers = $parser->getOriginalMessageHeaders()) { + $data['references'] = $headers['references']; + $data['in-reply-to'] = @$headers['in-reply-to'] ?: null; + } // Fetch deliver status report $data['message'] = $parser->getDeliveryStatusMessage(); $data['thread-type'] = 'N';