【问题标题】:Best way to handle email parsing/decoding in PHP?在 PHP 中处理电子邮件解析/解码的最佳方法?
【发布时间】:2011-06-10 22:06:39
【问题描述】:

目前我正在使用 PEAR 库的 mimeDecode.php 来解析传入的电子邮件。它似乎有很多问题并且无法解码很多消息,所以我想用更好的东西替换它。

我正在寻找能够正确分隔消息部分的东西,例如 to、from、body 等。理想情况下,它能够处理所有常见的编码方法,例如 base64、uuencode、quoted printable、等等

在同一封邮件中同时包含纯文本和 html 版本的情况下,我希望它知道它们之间的区别,以便我可以选择我希望显示的部分。

我现在并不担心附件,但如果我想在将来实现它,了解它们会很好。

我看到 PHP 有一组以 imap 开头的函数,它们似乎可以做我想做的事情,但我不确定如果不尝试它们。

目前我正在对 PHP 中的消息进行即时解码,这就是我寻找 PHP 替代解决方案的原因。

有没有人有这方面的经验可以为我指明正确的方向?我不想开始使用从长远来看最终无法满足我需要的东西。

【问题讨论】:

    标签: php email mime decode


    【解决方案1】:

    我最近开发了一个 PHP 邮件解析器,我一直在生产中使用它。
    我对它非常满意,一些开发人员已经分叉了它:

    https://github.com/plancake/official-library-php-email-parser

    【讨论】:

    • 它不能很好地处理附件 - 它在 HTML 正文中包含 base64 编码的附件内容。并且根本没有getAttachment() 之类的功能。
    • 感谢您的错误报告,Slawa - 我会调查的。如果需要解压附件,建议你试试code.google.com/p/php-mime-mail-parser
    • 非常棒的库——非常适合我的需要
    • 这很棒,但事实证明它无法处理更复杂的邮件结构。我发现了这样一种情况:一封电子邮件有一个边界值将附件与 text/html 正文分开,然后有一个不同的边界值将文本和 html 正文部分分开......这只是没有处理。
    【解决方案2】:

    我知道这个问题已经 4 岁了……但我最终需要一个邮件解析库,并且对任何可用选项都不满意。我想要一些可靠的、符合 PSR-2 的、可通过 composer 安装的东西。

    composer require zbateson/mail-mime-parser
    

    它是自己的解析器,从头开始构建,以解决其他实现中的已知问题和错误。它经过了广泛的测试和广泛的使用。

    该库使用 Psr7 流,允许您将任何类型的流传递给它。它也不会将所有信息存储在内存中——如果需要,可以将非常大的附件作为流而不是字符串返回,因此不会用完内存。同样,整个消息永远不会直接存储在内存中,只有对流的引用,并且标头保存在内存中。

    https://github.com/zbateson/mail-mime-parser

    查看website 以获取指南和 API...如果您发现错误/错别字或看到改进,请随时打开问题,或直接挖掘并提供拉取请求 :)

    【讨论】:

    • 这可能需要更多的 QA,但第一印象:它有效。谢谢你,@Zaahid
    • 效果很好!我从 S3 上的 AWS SES 收件箱流式传输 40+MB 的电子邮件,问题为零。很棒的图书馆。
    【解决方案3】:

    有趣的是你应该问...我现在实际上正在开发一个简单的通知系统。我刚刚完成了弹跳管理器,我使用Zend_Mail 来实现。它几乎具有您正在寻找的所有功能...您可以连接到邮箱(POP3、IMAP、Mbox 和 Maildir)并从中提取邮件以及对所有这些邮件进行操作。

    它处理多部分消息,但部分可能难以处理。我很难弄清楚我正在使用的 NDR 中附加的原始消息部分是哪一部分,但我有一种感觉,我只是错过了文档中的一些内容。我不确定它是如何处理编码的,因为我的使用相当简单,但我很确定它对你提到的所有编码都有规定。查看文档并浏览 API。

    【讨论】:

    • 您知道是否可以在没有存储连接器的情况下使用 Zend_Mail 吗?我想将传入消息作为字符串传递给它,并且能够使用与消息关联的方法,而无需来自存储位置。
    • 是的,我确定有一种方法,因为同一个类也用于通过邮件程序/传输类发送消息,在这种情况下,您将始终构建消息形式的字符串/文件。如果我记得它看起来像$m = new Zend_Mail_Message(array('raw' => $stringMessage)); 看看实际的类和构造函数验证的文档 cmets。
    • 这最终对我有用。 Zend 做了一些我不明白为什么的事情。当 Zend 无法识别标题时,它会抛出异常。就我而言,我不关心无法识别的标头,因此我最终注释掉了该异常。还有一个函数,Zend 在 $parts 上执行 foreach(),但有时它试图 foreach 的变量为 null,所以我添加了一个 null 检查并在 $res 那里为 null 时返回。
    • 最后在检查 mime 边界时,如果找不到关闭边界会抛出异常。就我而言,这是一条格式错误的消息,但正文仍然可读,所以我最终也注释掉了该异常。我宁愿给用户一个畸形的身体而不是什么。
    • 嗯 id dint 遇到任何标题问题,我实际上是在使用自定义标题(如 X-CUSTOMNS-CUSTOMNAME)。但是,如果您尝试读取不存在的标头,它将引发异常。您必须亲自使用 $msg->hasHeader($header) 我宁愿它返回 null、false 或 -1 而不必显式测试...
    【解决方案4】:

    我派生了 php-mime-mail-parser 来纠正所有问题:Fork of php-mime-mail-parser

    超过 52 个测试和 764 个断言 代码覆盖率:100% 行、100% 函数和方法、100% 类和特征

    您需要 PECL 包 MailParse 才能使用它,但包装器没有问题并且经过全面测试。

    【讨论】:

      【解决方案5】:

      为了完整起见,这是我要尝试的一个。 http://code.google.com/p/php-mime-mail-parser/ - 它是 PHP MailParse 的包装器,需要安装。

      【讨论】:

      • 一直不工作,我有一些例子无法处理电子邮件。
      【解决方案6】:

      我目前也在寻找一个易于使用、功能强大的 MIME 电子邮件解析库,并且目前正在认真研究来自 eZ Components 的 Mail 组件。但是,如果您正在寻找可以像 echo $email->text;echo $email->html; 一样简单的东西,就像我一样,您会失望的。实际上,由于 MIME 的工作方式,现在我认为这种简化是不可能的。但它似乎确实是 PHP 世界中最好的选择。

      我开始使用 Zend_Mail 组件处理我当前的项目,但是当真正深入研究这些电子邮件部分和编码的标头时,Zend_Mail 几乎让你一无所获。您需要自己完成大部分解码,这一点都不好玩。

      至于IMAP PHP 扩展,它的目的是处理从您的邮箱中检索邮件,而不是 MIME 解码它们。虽然,它确实具有您可能需要的一些方便的解码功能。另一方面,Mailparse PECL 扩展正好处理该问题集。我还没有尝试过,但似乎您需要编写很多代码才能真正获取您想要的数据。

      【讨论】:

      • 通过查看文档看起来不错。我已经投入了时间来实现和测试 Zend_Mail 库,而且它看起来工作得很好。老实说,我现在不能花更多的时间在工作上寻找一个新的图书馆。不过感谢您的回复:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2010-09-06
      • 2010-09-05
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2015-05-12
      相关资源
      最近更新 更多