Fixed Email bouncing error

Tom

Active member
Affected version
2.0.1
This error seems to be showing up in the logs quite frequently. I'm not entirely sure if it's at the fault of XF or how I have emails configured.

Zend\Mail\Exception\RuntimeException: Bounce message processing failed: Malformed header detected src/vendor/zendframework/zend-mail/src/Headers.php:88

Stack Trace:

Code:
#0 src/vendor/zendframework/zend-mime/src/Decode.php(141): Zend\Mail\Headers::fromString('Return-Path: <6...', '\n')
#1 src/vendor/zendframework/zend-mail/src/Storage/Part.php(99): Zend\Mime\Decode::splitMessage('Return-Path: <6...', 'Return-Path: <6...', 'This is a multi...', '\n', false)
#2 src/vendor/zendframework/zend-mail/src/Storage/Message.php(54): Zend\Mail\Storage\Part->__construct(Array)
#3 src/XF/EmailBounce/Parser.php(168): Zend\Mail\Storage\Message->__construct(Array)
#4 src/XF/EmailBounce/Processor.php(69): XF\EmailBounce\Parser->parseMessage('Return-Path: <6...')
#5 src/XF/EmailBounce/Processor.php(53): XF\EmailBounce\Processor->processMessage('Return-Path: <6...')
#6 src/XF/Job/EmailBounce.php(27): XF\EmailBounce\Processor->processFromStorage(Object(Zend\Mail\Storage\Imap), 8)
#7 src/XF/Job/Manager.php(241): XF\Job\EmailBounce->run(8)
#8 src/XF/Job/Manager.php(187): XF\Job\Manager->runJobInternal(Array, 8)
#9 src/XF/Job/Manager.php(76): XF\Job\Manager->runJobEntry(Array, 8)
#10 job.php(15): XF\Job\Manager->runQueue(false, 8)
#11 {main}

Request State:

Code:
array(4) {
  ["url"] => string(8) "/job.php"
  ["referrer"] => string(58) "https://fellowsfilm.co.uk/files/ukdt-cotterell.180/reviews"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}
 
I have a feeling I know what this is as it may be a bug I reported in the underlying library we use, though it wasn't fixed until a version that we are currently unable to use. This is potentially the first time it's been seen in the wild though.

There should be at least one email in the bounce log at the same time as this error. The original value of that email should be logged (by clicking "view"). Can you send me that raw message? I should be able to test and reproduce the issue then.
 
Code:
Return-Path: <>
Delivered-To: no-reply@fellowsfilm.co.uk
Received: from aristotle.versobit.net
    by aristotle.versobit.net with LMTP id WK18CtBsRVrhbgAAdT6w6g
    for <no-reply@fellowsfilm.co.uk>; Thu, 28 Dec 2017 17:14:40 -0500
Return-path: <>
Envelope-to: no-reply@fellowsfilm.co.uk
Delivery-date: Thu, 28 Dec 2017 17:14:40 -0500
Received: from mailnull by aristotle.versobit.net with local (Exim 4.89_1)
    id 1eUgRk-0007Nj-4o
    for no-reply@fellowsfilm.co.uk; Thu, 28 Dec 2017 17:14:40 -0500
Auto-Submitted: auto-replied
From: Mail Delivery System <Mailer-Daemon@aristotle.versobit.net>
To: no-reply@fellowsfilm.co.uk
Content-Type: multipart/report; report-type=delivery-status; boundary=1514499280-eximdsn-1562098278
MIME-Version: 1.0
Subject: Warning: message 1eTURX-0000jW-GM delayed 72 hours
Message-Id: <E1eUgRk-0007Nj-4o@aristotle.versobit.net>
Date: Thu, 28 Dec 2017 17:14:40 -0500

--1514499280-eximdsn-1562098278
Content-type: text/plain; charset=us-ascii

This message was created automatically by mail delivery software.
A message that you sent has not yet been delivered to one or more of its
recipients after more than 72 hours on the queue on aristotle.versobit.net.

The message identifier is:     1eTURX-0000jW-GM
The date of the message is:    Mon, 25 Dec 2017 15:13:30 +0000
The subject of the message is: Welcome to Fellowsfilm Network!

The address to which the message has not yet been delivered is:

  email@gmail.com
    host alt4.gmail-smtp-in.l.google.com [74.125.128.27]
    Delay reason: SMTP error from remote mail server after RCPT TO:<email@gmail.com>:
    452-4.2.2 The email account that you tried to reach is over quota. Please direct
    452-4.2.2 the recipient to
    452 4.2.2  https://support.google.com/mail/?p=OverQuotaTemp f13si6152533edm.455 - gsmtp

No action is required on your part. Delivery attempts will continue for
some time, and this warning may be repeated at intervals if the message
remains undelivered. Eventually the mail delivery software will give up,
and when that happens, the message will be returned to you.

--1514499280-eximdsn-1562098278
Content-type: message/delivery-status

Reporting-MTA: dns; aristotle.versobit.net

Action: delayed
Final-Recipient: rfc822;email@gmail.com
Status: 4.0.0
Remote-MTA: dns; alt4.gmail-smtp-in.l.google.com
Diagnostic-Code: smtp; 452-4.2.2 The email account that you tried to reach is over quota. Please direct
452-4.2.2 the recipient to
452 4.2.2  https://support.google.com/mail/?p=OverQuotaTemp f13si6152533edm.455 - gsmtp

--1514499280-eximdsn-1562098278
Content-type: text/rfc822-headers

Return-path: <no-reply@fellowsfilm.co.uk>
Received: from [192.99.39.70] (port=38816 helo=fellowsfilm.co.uk)
    by aristotle.versobit.net with esmtpsa (TLSv1:ECDHE-RSA-AES128-SHA:128)
    (Exim 4.89_1)
    (envelope-from <no-reply@fellowsfilm.co.uk>)
    id 1eTURX-0000jW-GM
    for email@gmail.com; Mon, 25 Dec 2017 10:13:31 -0500
Message-ID: <36b5fa78860204b911001cb4c36cb142@fellowsfilm.co.uk>
Date: Mon, 25 Dec 2017 15:13:30 +0000
Subject: Welcome to Fellowsfilm Network!
From: Fellowsfilm Team <no-reply@fellowsfilm.co.uk>
To: user <email@gmail.com>
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="_=_swift_v4_1514214810_6bdc48fe44c19aaf9b71a09eae2aaac4_=_"
X-To-Validate: 708c8c98+email@gmail.com


--1514499280-eximdsn-1562098278--
 
Last edited by a moderator:
In hindsight, I don't think that was the email that actually triggered this issue as it seems to parse without a problem in my tests.

However, I did have a test case for this so I have added some code that I believe should prevent this in 2.0.2.
 
Just got this error again running 2.0.2:
Zend\Mail\Exception\RuntimeException: Bounce message processing failed: Malformed header detected src/vendor/zendframework/zend-mail/src/Headers.php:88

Code:
#0 src/vendor/zendframework/zend-mime/src/Decode.php(141): Zend\Mail\Headers::fromString('Return-Path: <k...', '\n')
#1 src/vendor/zendframework/zend-mail/src/Storage/Part.php(99): Zend\Mime\Decode::splitMessage('Return-Path: <k...', 'Return-Path: <k...', '--001a114b3346b...', '\n', false)
#2 src/vendor/zendframework/zend-mail/src/Storage/Message.php(54): Zend\Mail\Storage\Part->__construct(Array)
#3 src/XF/EmailBounce/Parser.php(169): Zend\Mail\Storage\Message->__construct(Array)
#4 src/XF/EmailBounce/Processor.php(69): XF\EmailBounce\Parser->parseMessage('Return-Path: <k...')
#5 src/XF/EmailBounce/Processor.php(53): XF\EmailBounce\Processor->processMessage('Return-Path: <k...')
#6 src/XF/Job/EmailBounce.php(27): XF\EmailBounce\Processor->processFromStorage(Object(Zend\Mail\Storage\Imap), 7.9999861717224)
#7 src/XF/Job/Manager.php(241): XF\Job\EmailBounce->run(7.9999861717224)
#8 src/XF/Job/Manager.php(187): XF\Job\Manager->runJobInternal(Array, 7.9999861717224)
#9 src/XF/Job/Manager.php(76): XF\Job\Manager->runJobEntry(Array, 7.9999861717224)
#10 job.php(15): XF\Job\Manager->runQueue(false, 8)
#11 {main}

Code:
array(4) {
  ["url"] => string(8) "/job.php"
  ["referrer"] => string(65) "https://fellowsfilm.co.uk/threads/yorkshire-counties.3330/page-25"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}
 
Can you try to identify the email that error relates to? We'd need to be able to reproduce it.

On the face of it, this looks like an invalid email (or a bug in the underlying email parsing library we use).
 
Unfortunately this is a manifestation of a bug in zend-mail or zend-mime as far as I can see.

It relates to this issue:
https://github.com/zendframework/zend-mail/issues/92

However, specifically, it would appear to be exasperated by the specific format of the bounce message. Arguably it is not invalid, as per this: https://tools.ietf.org/html/rfc7103#section-7.3

But it would appear to be things like this:

1519391066988.webp

The double line break there is problematic. A double line break in the mail header indicates the headers are finished, but in this case they're not.

That doesn't appear to be the only issue though. If the dodgy line breaks are removed, it falls over elsewhere.

I don't have an immediate workaround unfortunately.
 
I ran into exactly the same problem with the bounce handler that I wrote on my own for our CMS and vBulletin 4. I "solved" it by catching the \Zend\Mail\Exception\RuntimeException and moving the offending message to the trash folder. IIRC this issue got triggered by a spam mail and not by regular bounces.
 
Some mail parsers handle it accurately though. Maybe that could be an ok workaround. They’ve sort of confirmed it was a bug but it seems like they want a contributor submit a PR with the fix rather than giving it any attention themselves. Which we could do, but that fix would then be in an update we can’t use yet due to PHP requirements. If we identify a proper fix we might be able to monkey patch it though.
 
There will be as soon as we can reproduce it reliably and have a decent test case.

If you can copy and paste the problematic email from your email bounce log and confirm the error as it appears in your server error log, it will help.
 
Does the same error keep appearing in your server error log?

I think this issue is similar to the one reported here but it appears as though it’s happening in a different place.
 
Yes.

New ones:

Code:
     Zend\Mail\Exception\RuntimeException: Job XF:EmailBounce: Malformed header detected src/vendor/zendframework/zend-mail/src/Headers.php:88
    
     Stack trace

#0 src/vendor/zendframework/zend-mime/src/Decode.php(141): Zend\Mail\Headers::fromString('Return-Path: <w...', '\n')
#1 src/vendor/zendframework/zend-mail/src/Storage/Pop3.php(108): Zend\Mime\Decode::splitMessage('Return-Path: <w...', 'Return-Path: <w...', '<html><body><sp...')
#2 src/XF/EmailBounce/Processor.php(48): Zend\Mail\Storage\Pop3->getRawContent(1)
#3 src/XF/Job/EmailBounce.php(27): XF\EmailBounce\Processor->processFromStorage(Object(Zend\Mail\Storage\Pop3), 7.9999988079071)
#4 src/XF/Job/Manager.php(241): XF\Job\EmailBounce->run(7.9999988079071)
#5 src/XF/Job/Manager.php(187): XF\Job\Manager->runJobInternal(Array, 7.9999988079071)
#6 src/XF/Job/Manager.php(76): XF\Job\Manager->runJobEntry(Array, 7.9999988079071)
#7 job.php(15): XF\Job\Manager->runQueue(false, 8)
#8 {main}

Request state

array(4) {
  ["url"] => string(8) "/job.php"
  ["referrer"] => string(77) "https://www.talkjesus.com/threads/the-two-witnesses-dreams-and-visions.61001/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}
 
Ok. I think you opened a ticket earlier. Can you please reply to that and ask for it to be assigned to me and at the same time also include FTP and database access (such as cPanel or PhpMyAdmin) and hopefully we’ll get you back up and running and figure this bug out too.
 
Top Bottom