为什么在更改文本文件的内容后,文本文件的mime类型会发生更改


Why did the mime type of a text file change after changing the contents of a text file?

我使用的是Linux Debian 8.4服务器,我运行的是一个PHP脚本,它读取并解析2个具有mime类型的文本文件

text/plain;charset=us ascii

并基于文本文件的内容发送2封电子邮件。在文本文件中,它们具有以下结构:

收件人:example@email.com

发件人:example2@email.com

主题:示例

等等。当回显第一个文本文件的mime类型时,它会打印

text/plain;charset=us ascii

到控制台

为了测试我的代码是否正常工作,我将电子邮件的格式改为:

发件人:example2@email.com

收件人:example@email.com

主题:示例

现在,在呼应mime类型后,它将其打印到控制台:

message/rfc822;charset=us ascii

为什么我只换了两行,哑剧的类型却变了?不管怎样,文件不是总是一个文本文件,并且应该具有文本/纯mime类型吗?

提前谢谢。

我认为您(或您正在使用的库)正在使用Fileinfo或直接调用file命令来确定MIME类型。

Fileinfo通过在所提供的文件的内容中搜索特定的";魔术;文件中特定位置的字节序列。作为一个基本示例,如果文档的前四个字节是0xFE 0x37 0 0x23,则Fileinfo会猜测它是一个Microsoft Word文档。

当然,这种方法不是万无一失的,对于不总是有明显字节序列的基于文本(而不是二进制)的格式来说,这是一个挑战。

message/rfc822是一种电子邮件格式,用于将电子邮件消息包含在另一封电子邮件中,例如通过邮件列表发送或当您";作为附件转发";在您的邮件阅读器中。它是在RFC 2046中定义的(相当令人惊讶,就像你第一次了解到"1812序曲"是在1880年写的一样),它只是电子邮件内容的纯文本表示。它以标头和第一个标头开始,因此文件的打开内容是From: example@example.com

这就是为什么Fileinfo根据开头一行得出结论,您的文档是电子邮件摘要中的一条消息:这是魔法文件中与message/rfc822匹配的模式。真的不可能知道这个文件是一封电子邮件,还是只是以From:开头的纯文本,所以你可以得到一个有根据的猜测。Fileinfo的文档是明确的;不是一种防弹的方法";。

您可以在magic文件中编写自己的附加内容。在Ubuntu中,它们以man 5 magic描述的格式进入/etc/magic.mime(可能在Debian中的类似位置),因此理论上你可以用text/plain匹配来覆盖message/rfc822的匹配。我不是语法专家,所以我真的帮不上忙,但有在线指南。

或者,您可以在代码中使用$mime_type = preg_replace("[^message/rfc822'b]", "text/plain", $mime_type);之类的东西来捕获这种不寻常的情况。不太优雅,但你可以。