1

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

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

它运行良好,除了无法解析的特定邮件。标From头无效,因为它包含原始 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 ,由于 UTF-8 字符,此标头无效,并且 Zend在标头被验证时抱怨它 。

我在网上看到了很多与此相关的问题,但其中大多数都在谈论电子邮件创建,而不是接收。

我还看到了有关国际化电子邮件标头的RFC-6532,但邮件似乎不遵守此标准(没有message/global 部分)。

实际解决方法

目前我发现的唯一解决方案是使用barbushin/php-imap,它是原生 php imap 函数的包装器。这个包似乎更宽容/更新,并正确检索邮件。

问题

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

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

4

1 回答 1

1

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

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

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

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

于 2019-08-02T15:20:36.903 回答