1

我正在使用 ZendZend_Mail_Storage_Pop3连接到邮件服务器、打开电子邮件并遍历其附件。如果附件是PDF,我需要下载它。在每个消息部分的每次迭代中,我调用getHeaders并使用正则表达式来确定附件的 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 类型?

4

1 回答 1

0

这是一个有点复杂的案例。当content-typemultipart/mixed这意味着有几封电子邮件。其中一个或多个可能是附件(除了可能包括 html 区域或纯文本)。

content-type为时multipart/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 编码的,您对此负责(您可以检查content-transfer-encoding标题以确定这一点。
单个附件的 mime 类型将存储在部分的content-type标题中,就像在单个部分消息的情况下一样.

一个注释 - 这假设您正在处理消息的原始来源。为此,您可以使用getRawHeadergetRawContent

于 2011-10-18T02:33:59.637 回答