這是一個複雜的案例。當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
它可以是你所遇到的。着名的Microsoft TNEF附件格式?(http://en.wikipedia.org/wiki/Transport_Neutral_Encapsulation_Format) – iWantSimpleLife
看起來像'Zend_Ma il_Storage_Pop3'無法解析電子郵件。您可能想要使用Mailparse擴展名:http://php.net/manual/en/book.mailparse.php或Imap擴展名http://www.php.net/manual/en/book.imap.php – hakre
我發佈了一篇相當長的關於如何解析原始郵件以查找部件的解釋,但擴展可能是一個很好的起點。你可以看看'php-mime-mailparser':http://code.google.com/p/php-mime-mail-parser/ – Andrew