我正在使用Linux Debian 8.4服务器,我正在运行一个PHP脚本,该脚本使用mime-type
读取和解析2个文本文件文本/无格式;字符集= US-ASCII
并根据文本文件的内容发送2封电子邮件。在文本文件中,它们具有以下结构:
收件人:example@email.com
来自:example2@email.com
主题:示例
等等。当回显第一个文本文件的mime类型时,它打印
文本/无格式;字符集= US-ASCII
到控制台
为了测试我的代码是否正常工作,我将电子邮件的格式更改为:
来自:example2@email.com
收件人:example@email.com
主题:示例
现在在回显mime类型之后,它将其打印到控制台:
消息/ RFC822;字符集= US-ASCII
为什么mime类型会改变,即使我只切换了2行?无论如何,文件是否始终是文本文件,并且应该具有text / plain mime类型?
提前致谢。
答案 0 :(得分:0)
我认为您(或您正在使用的库)是使用Fileinfo或直接调用file命令确定MIME类型。
Fileinfo的工作原理是在提供的文件中搜索文件中特定位置的某些“魔术”字节序列。作为一个基本示例,如果文档的前四个字节为0xFE
0x37
0
0x23
,则Fileinfo会猜测它是Microsoft Word文档。
当然,这种方法并不是万无一失的,对于基于文本(而不是二进制)的格式来说,它并不总是有明显的字节序列。
message / rfc822 是一种电子邮件格式,用于在其他电子邮件中包含电子邮件,例如通过邮件列表发送或在邮件阅读器中“转发为附件”。它的定义(相当令人惊讶的是,就像你第一次在RFC 2046中了解到“1812 Overture”是在1880年写的那样)并且它只是电子邮件内容的纯文本表示。它以标题和第一个标题开头,因此文件的开头内容为From: example@example.com
。
这就是为什么Fileinfo断定您的文档是基于开头行的电子邮件摘要中的消息:这是魔术文件中与 message / rfc822 匹配的模式。真的不可能知道文件是电子邮件还是只是以From:
开头的纯文本,所以你得到了一个有根据的猜测。 documentation for Fileinfo明确表示“它不是防弹方法”。
您可以在魔术文件中添加自己的附加内容。在Ubuntu中,它们以/etc/magic.mime
描述的格式进入man 5 magic
(可能是Debian中的类似位置),因此从理论上讲,您可以覆盖 message / rfc822 匹配< em> text / plain 匹配。我不是语法方面的专家,所以我无法真正帮助解决这个问题,但有在线指南。
或者您可以在代码中捕获此异常情况,例如$mime_type = preg_replace("[^message/rfc822\b]", "text/plain", $mime_type);
。不完全优雅,但你去了。