我正在使用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类型?
答案 0 :(得分:0)
这是一个复杂的案例。当content-type
为multipart/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-type
和content-transfer-encoding
可能还有其他部分标题,您将要删除它们(如果我没记错的话,它们都会以前缀content
开头)。
然后确保如果部件是base64编码的,那么您可以考虑({1}}标题以确定这一点。
单个附件的mime类型将存储在部件的content-transfer-encoding
标题中,就像单个部件消息一样。
一个注意事项 - 这假设您正在处理消息的原始来源。为此,您可以使用content-type
和getRawHeader
。