检测到无效 header 值:imap 邮件接收 header 带有 utf-8 法语口音

Invalid header value detected: imap mail reception with header having utf-8 french accents

我正在使用 Zend Framework 2.4.13 开发一个项目,我必须从 imap 检索邮件 邮箱。为此,我使用 \Zend\Mail\Storage\Imap:

foreach ($this->imap as $index => $message) {
    // ...
}

它运行良好,除了无法解析的特定邮件。 From header 无效 因为它包含原始 UTF-8 字符(法语口音):

From: "Stéph" <abc@def.fr>

然后我得到以下 Zend 错误:

An error occurred during execution; please try again later.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Informations complémentaires:

Zend\Mail\Header\Exception\InvalidArgumentException

Fichier:

    /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Header/GenericHeader.php:61

Message:

    Invalid header value detected

Pile d'exécution:

    #0 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Header/GenericHeader.php(35): Zend\Mail\Header\GenericHeader::splitHeaderLine('From: "St\xC3\xA9ph" ...')
    #1 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Headers.php(230): Zend\Mail\Header\GenericHeader::fromString('From: "St\xC3\xA9ph" ...')
    #2 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Headers.php(95): Zend\Mail\Headers->addHeaderLine('From: "St\xC3\xA9ph" ...')
    #3 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mime/Decode.php(141): Zend\Mail\Headers::fromString('MIME-Version: 1...', '\n')
    #4 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Storage/Part.php(106): Zend\Mime\Decode::splitMessage('MIME-Version: 1...', 'MIME-Version: 1...', '')
    #5 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Storage/Message.php(54): Zend\Mail\Storage\Part->__construct(Array)
    #6 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Storage/Imap.php(118): Zend\Mail\Storage\Message->__construct(Array)
    #7 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mail/Storage/AbstractStorage.php(267): Zend\Mail\Storage\Imap->getMessage(1)
    #8 /var/www/project/module/Application/src/Application/Helpers/LeadParser/Mail/Inbox.php(52): Zend\Mail\Storage\AbstractStorage->current()
    #9 /var/www/project/module/Application/src/Application/Helpers/LeadParser/InboxProcessor.php(81): Application\Helpers\LeadParser\Mail\Inbox->getMails()
    #10 /var/www/project/module/Application/src/WebService/Controller/LeadParserController.php(52): Application\Helpers\LeadParser\InboxProcessor->process()
    #11 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractActionController.php(82): WebService\Controller\LeadParserController->indexAction()
    #12 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent))
    #13 /var/www/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(444): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
    #14 /var/www/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(205): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #15 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(118): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #16 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php(93): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
    #17 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
    #18 /var/www/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(444): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
    #19 /var/www/project/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(205): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #20 /var/www/project/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(314): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
    #21 /var/www/project/public/index.php(69): Zend\Mvc\Application->run()
    #22 {main}

我猜这些问题是关于 RFC 的。据此 RFC-2822 此 header 无效,因为 UTF-8 字符,Zend 抱怨它 when the header is validated.

我在网上看到很多关于这个的问题,但大多数都在谈论电子邮件创建,而不是 接待.

我也看到了 RFC-6532 是关于 Internationalized 的 电子邮件 Headers,但邮件似乎不遵守此标准(没有 message/global 部分)。

实际解决方法

我目前找到的唯一解决方案是使用 barbushin/php-imap, 原生 php imap 函数的包装器。这个包貌似比较tolerant/updated,找回 邮件正确。

问题

我需要找到一个解决方案让邮件接收过程更加宽容,以便接受 这样的邮件headers。但是我不相信我的解决方法,它为某些东西添加了供应商依赖性 已经在框架中实现。

是否可以通过ZF2框架直接解决这个问题?

尽管 RFC 6532 与问题并不严格相关,但在 ZF2 中实现读取支持可能是解决问题的最简单方法。

这是因为 6532 扩展了消息格式以支持诸如 stéph@example.com 之类的地址,并且这样做的方式类似于多年来的常见行为。人们做了很多不恰当的 just-send-8,而 6532 的作者选择匹配观察到的最常见的用户行为类型。您要阅读的消息仅使用 6532 编码并允许的那种不恰当的 just-send-8。

添加对阅读 6532 兼容消息的支持应该与编辑各种语法检查和让更多代码点通过一样简单。我有some test messages on github;如果 ZF2 可以解析那些您将能够阅读并处理真实用户发送的 EAI 消息。

对 mailer-daemon 发送的邮件采取行动也需要 6533 support,回复可能需要更多与 6532 相关的工作。那一点很复杂。但是阅读邮件本身就是一种有用的能力。