这是一个有点复杂的案例。当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 编码的,您对此负责(您可以检查content-transfer-encoding
标题以确定这一点。
单个附件的 mime 类型将存储在部分的content-type
标题中,就像在单个部分消息的情况下一样.
一个注释 - 这假设您正在处理消息的原始来源。为此,您可以使用getRawHeader
和getRawContent
。