PHP:如何确定电子邮件附件的MIME类型?

时间:2011-10-18 02:08:34

标签: php zend-framework mime-types zend-mail

我正在使用Zend的Zend_Mail_Storage_Pop3连接到邮件服务器,打开电子邮件,并遍历其附件。如果附件是PDF,我需要下载它。在每个消息部分的每次迭代中,我调用getHeaders并使用Regex来确定附件的mime类型。在大多数情况下,我得到这样的东西:

["content-type"]=> string(64) "application/octet-stream; name=abc.pdf"
["content-transfer-encoding"]=> string(6) "base64"

但在某些情况下,我会得到类似的结果:

multipart/mixed; boundary=--boundary_2_1dca5b3b-499e-4109-b074-d8b5f914404a

如何确定此类附件的mime类型?

1 个答案:

答案 0 :(得分:0)

这是一个复杂的案例。当content-typemultipart/mixed时,表示该电子邮件有多个部分。这些中的一个或多个可能是附件(除了可能包括html区域或纯文本)。

content-typemultipart/mixed时,也会给出边界。您可以使用此正则表达式来确定您是否正在处理多部分电子邮件:

$contentType = $this->GetHeader('content-type');
$regex = '%multipart.*?boundary\s*=\s*"?(\w+)?"?%is';
$matches = array();

if (preg_match($regex, $contentType, $matches)) {
    $this->isMultiPart = true;
    $this->boundary = $matches[1];
} else {
    $this->isMultiPart = false;
}

(请注意,此示例是处理电子邮件的较大类的一部分)

如果您的邮件是多部分电子邮件,则下一步是分隔所有部分。你可以这样做:

$parts = explode("--$this->boundary", $this->fullBody);

根据电子邮件标准,边界始终以--开头。那么剩下要做的就是解析每个部分 您可能已经有代码来执行此操作。每个部分都会与您在问题中提到的标题相同:content-typecontent-transfer-encoding 可能还有其他部分标题,您将要删除它们(如果我没记错的话,它们都会以前缀content开头)。
然后确保如果部件是base64编码的,那么您可以考虑({1}}标题以确定这一点。
单个附件的mime类型将存储在部件的content-transfer-encoding标题中,就像单个部件消息一样。

一个注意事项 - 这假设您正在处理消息的原始来源。为此,您可以使用content-typegetRawHeader