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

时间:2016-05-18 19:33:56

标签: php mime-types

我正在使用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类型?

提前致谢。

1 个答案:

答案 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);。不完全优雅,但你去了。