Partial fix Job XF:EmailUnsubscribe: Invalid header value detected

To be clear (and maybe pedantic), the issue isn't that X-Ham-Report is an invalid header name (it's not, non-standard X- headers are not only extremely common but permitted), but that the header has an invalid value. This is something that could (should) be fixed in SpamAssassin.

If this bug from SpamAssassin then where we can report this issue? Please can you report this bug to SpamAssassin developer?
 
Thank you for reporting this issue, it has now been resolved. We are aiming to include any changes that have been made in a future XF release (2.2.0 RC3).

Change log:
Improve error handling for invalid messages in the unsubscribe email address inbox
There may be a delay before changes are rolled out to the XenForo Community.
 
Just to clarify, the changes here generally improve the error handling here, though if the email isn't to spec, we still won't be able to parse it. This should prevent getting stuck on an email, for example, though depending on configuration, it might not end up feeling too different.

However, we do also log the contents of the mail now which should aid in debugging, so that we can indeed confirm what is invalid (in case there is ultimately a bug in the upstream email parsing library). So if you get this error after running 2.2, let us know.
 
I've noticed I get these errors whenever someone "unsubscribes" using Apple Mail.

The email is never deleted from the mail inbox nor is the user marked as unsubscribing.

The only fix for me is to:

  • manually remove the email from the unsubscribe@ email account (so it doesn't continually trigger an error every time the cron runs)
  • manually unsubscribe the user in the XF user administration

Here's what the email always looks like:

1601332168164.png
 
The changes in 2.2 will help with the "manually remove the email" part, so it won't get stuck.

But if you still have the full, raw version of the email (including all of the headers as they were received), can you send it to me (via a conversation)? This will allow me to confirm the contents of the invalid header.
 
@Mike Still getting this type Server error log with v2.2.1

Code:
Laminas\Mail\Header\Exception\InvalidArgumentException: Bounce message processing failed: Invalid header value detected src/vendor/laminas/laminas-mail/src/Header/GenericHeader.php:64

Generated by: Unknown account Oct 30, 2020 at 8:53 PM

Stack trace

#0 src/vendor/laminas/laminas-mail/src/Headers.php(544): Laminas\Mail\Header\GenericHeader::splitHeaderLine('X-Ham-Report: S...')
#1 src/vendor/laminas/laminas-mail/src/Headers.php(284): Laminas\Mail\Headers->loadHeader('X-Ham-Report: S...')
#2 src/vendor/laminas/laminas-mail/src/Headers.php(105): Laminas\Mail\Headers->addHeaderLine('X-Ham-Report: S...')
#3 src/vendor/laminas/laminas-mime/src/Decode.php(150): Laminas\Mail\Headers::fromString('Return-Path: <c...', '
')
#4 src/vendor/laminas/laminas-mail/src/Storage/Part.php(103): Laminas\Mime\Decode::splitMessage('Return-Path: <c...', 'Return-Path: <c...', 'PGRpdiBkaXI9Imx...', '
', false)
#5 src/vendor/laminas/laminas-mail/src/Storage/Message.php(53): Laminas\Mail\Storage\Part->__construct(Array)
#6 src/XF/EmailBounce/Parser.php(169): Laminas\Mail\Storage\Message->__construct(Array)
#7 src/XF/EmailBounce/Processor.php(94): XF\EmailBounce\Parser->parseMessage('Return-Path: <c...')
#8 src/XF/EmailBounce/Processor.php(70): XF\EmailBounce\Processor->processMessage('Return-Path: <c...')
#9 src/XF/Job/EmailBounce.php(27): XF\EmailBounce\Processor->processFromStorage(Object(XF\Mail\Storage\Imap), G)
#10 src/XF/Job/Manager.php(258): XF\Job\EmailBounce->run(G)
#11 src/XF/Job/Manager.php(200): XF\Job\Manager->runJobInternal(Array, G)
#12 src/XF/Job/Manager.php(84): XF\Job\Manager->runJobEntry(Array, G)
#13 job.php(43): XF\Job\Manager->runQueue(false, 8)
#14 {main}

Request state

array(4) {
  ["url"] => string(8) "/job.php"
  ["referrer"] => string(91) "/threads/the_show.80169/"
  ["_GET"] => array(0) {
  }
  ["_POST"] => array(0) {
  }
}
 
As stated, if you can track down the specific email that triggered the error then we can investigate.

But if you still have the full, raw version of the email (including all of the headers as they were received), can you send it to me (via a conversation)? This will allow me to confirm the contents of the invalid header.
 
As stated, if you can track down the specific email that triggered the error then we can investigate.
We get about 2 of these messages every time we email our users out of 10,000. Not really concerning, but does generate a server error in the log. What can we do to resolve, if anything?


Code:
Laminas\Mail\Exception\RuntimeException: Bounce message processing failed: Line "Hello," does not match header format! src\vendor\laminas\laminas-mail\src\Headers.php:110

#0 src\vendor\laminas\laminas-mime\src\Decode.php(150): Laminas\Mail\Headers::fromString('Received: ; Wed...', '
')
#1 src\vendor\laminas\laminas-mail\src\Storage\Pop3.php(107): Laminas\Mime\Decode::splitMessage('Received: ; Wed...', 'Received: ; Wed...', 'Received: from ...')
#2 src\XF\EmailBounce\Processor.php(52): Laminas\Mail\Storage\Pop3->getRawContent(155)
#3 src\XF\Job\EmailBounce.php(27): XF\EmailBounce\Processor->processFromStorage(Object(XF\Mail\Storage\Pop3), 8)
#4 src\XF\Job\Manager.php(258): XF\Job\EmailBounce->run(8)
#5 src\XF\Job\Manager.php(200): XF\Job\Manager->runJobInternal(Array, 8)
#6 src\XF\Job\Manager.php(84): XF\Job\Manager->runJobEntry(Array, 8)
#7 job.php(43): XF\Job\Manager->runQueue(false, 8)
#8 {main}

Code:
Laminas\Mail\Exception\RuntimeException: Bounce message processing failed: Line "Hello," does not match header format! src\vendor\laminas\laminas-mail\src\Headers.php:110


#0 src\vendor\laminas\laminas-mime\src\Decode.php(150): Laminas\Mail\Headers::fromString('Content-Type: t...', '
')
#1 src\vendor\laminas\laminas-mime\src\Decode.php(81): Laminas\Mime\Decode::splitMessage('Content-Type: t...', 'Content-Type: t...', 'Unfortunately y...', '
')
#2 src\vendor\laminas\laminas-mail\src\Storage\Part.php(194): Laminas\Mime\Decode::splitMessageStruct('--=============...', '===============...')
#3 src\vendor\laminas\laminas-mail\src\Storage\Part.php(256): Laminas\Mail\Storage\Part->cacheContent()
#4 src\vendor\laminas\laminas-mail\src\Storage\Part.php(471): Laminas\Mail\Storage\Part->countParts()
#5 src\XF\EmailBounce\Parser.php(243): Laminas\Mail\Storage\Part->rewind()
#6 src\XF\EmailBounce\Parser.php(203): XF\EmailBounce\Parser->extractContent(Object(Laminas\Mail\Storage\Message), Object(XF\EmailBounce\ParseResult))
#7 src\XF\EmailBounce\Processor.php(94): XF\EmailBounce\Parser->parseMessage(Object(Laminas\Mail\Storage\Message))
#8 src\XF\EmailBounce\Processor.php(70): XF\EmailBounce\Processor->processMessage('Return-Path: <>...')
#9 src\XF\Job\EmailBounce.php(27): XF\EmailBounce\Processor->processFromStorage(Object(XF\Mail\Storage\Pop3), 8)
#10 src\XF\Job\Manager.php(258): XF\Job\EmailBounce->run(8)
#11 src\XF\Job\Manager.php(200): XF\Job\Manager->runJobInternal(Array, 8)
#12 src\XF\Job\Manager.php(84): XF\Job\Manager->runJobEntry(Array, 8)
#13 job.php(43): XF\Job\Manager->runQueue(false, 8)
#14 {main}
 
We get about 2 of these messages every time we email our users out of 10,000. Not really concerning, but does generate a server error in the log. What can we do to resolve, if anything?
There's probably not a lot you can do to resolve it if the mail itself is invalid (as the processor is quite strict on the standards).

The mail will be included in the bounce log. It will likely display with several of the fields as blank (or unknown). The date should correspond with when you received the error. If you want me to look at the email, you can click "view" and send me the raw output via a conversation. It's likely the email is actually invalid (based on the standard at least) and thus there probably won't be anything else we'd do. It may point to the email address that's triggering it though.
 
Here is one that has appeared three times this week.
ErrorException: Bounce message processing failed: [E_WARNING] str_split(): The length of each segment must be greater than zero src\vendor\laminas\laminas-mail\src\Header\ContentDisposition.php:152 Generated by: Unknown account Jun 10, 2021 at 5:23 AM

There is only one email even close to that time:


<removed by moderator>
 
Last edited by a moderator:
* NOTE - THIS DIDN'T WORK FOR ME, THOUGH SHOULD - IF YOU KNOW HOW TO MAKE THIS WORK PLEASE POST *

* LATER POST HAS A HACK WORK AROUND *

For anyone having this issue I followed the following instructions to remove the: X-Ham-Report from message header under WHM/CPanel

The following documents can help you do this yourself:
  1. https://forums.cpanel.net/threads/how-to-remove-x-ham-report-from-message-header.636153/
  2. https://documentation.cpanel.net/display/CKB/How+to+Customize+the+Exim+System+Filter+File
To complete this task you do need root access to your server by SSH to create the custom filter, and access to WHM to enable it.

Here are the steps taken:
  1. Login as root (or su root)
  2. Create a file in /usr/local/cpanel/etc/exim/sysfilter/options
    1. I named this file: remove_x_ham_report_header
  3. Edit (nano) this file to include the code shown below
  4. Save the file
  5. Login to WHM
  6. Under "Exim Configuration Manager" -> "Basic Editor" -> "Filters"
  7. Near the bottom you need to enable the newly created filter (it'll be disabled by default), it should be named "Custom Filter: remove_x_ham_report_header"
remove_x_ham_report_header code:

Code:
#HamRemoval
if
$header_to: is "email@email-domain-test.tld"
then
headers remove "X-Ham-Report"
deliver "email@email-domain-test.tld"
endif
Hi all,

Thanks again for @Wutime's post to partially sort it out (I'm going to have to try it out!), but is this still Xenforo's only way (using cPanel) to stop it?

Thanks,

Alex
 
Last edited:
Thanks again for @Wutime's post to partially sort it out (I'm going have to try it out!), but is this still Xenforo's only way (using cPanel) to stop it?
Not sure if this is helpful or annoying to hear, but I haven't had this issue since as far as I know.
 
Back
Top Bottom