解码$str=imap_fetchbody:$str==="";但是print_r可以打印它


decoding $str= imap_fetchbody: $str ==="" but print_r can print it

我转发了一条来自Thunderbird的带有pdf附件的html消息。我收到了multipart/mixed with multipart/alternational包含html和txt的纯文本,并对pdf进行了64编码。多部分/备选方案为8位,字符集=UTF8。

我已经尝试了php.net上imap:fetchstructure/fetchbody手册页面上几乎所有的建议。它们包括解码(至少对于编码=1、3、4)、应用imap_8bit、imap_qprint和imap_base64。手动查看txt/plain显示encoding=1,因此应用imap_8bit。

示例函数甚至无法决定返回的文本是纯文本还是html,因为在所有情况下,返回的$str总是=="(空字符串)。

接下来,我不小心尝试了一个print_r($str)(如果imap_8bit没有完成),它有所需的电子邮件文本。我认为这可能是没有imap_8bit的多字节,并且mb_detect_encoding返回UTF8(正如我在原始电子邮件文本中看到的那样)。

再次尝试mb_convert_encoding($str,"ASCII")会返回一个空字符串。quoted_printable_decode在imap_8bit之前或之后都没有帮助。netbeans PHP调试器(xdebug)声明所有这些字符串为空,但声明变量为"string"。

有人知道如何获取电子邮件文本吗?print_r显示它在那里,但我的头撞在墙上好几天了,没有任何结果。

我可以手动搜索和解码边界等,这不会太难,但。。。为什么要重新发明轮子?

代码:主要,我使用了php.net fetch_structure页面和其他web资源的两个版本。我可以把它们添加到这个帖子中,但现在不想太夸张。

*getTxtBody,调用get_part*调用getpart 的getmesg

如果我看纯文本,我会清楚地看到纯文本、html和pdf的(嵌套)边界。

非常感谢您的帮助。,克劳斯

您可以尝试使用fetch库。

要解码标头,可以使用iconv_mime_decode