2011-10-18 51 views
1

我使用Zend的Zend_Mail_Storage_Pop3連接到郵件服務器,打開電子郵件並遍歷其附件。如果附件是PDF,我需要下載它。在每個消息部分的每次迭代中,我調用getHeaders並使用Regex來確定附件的MIME類型。在大多數情況下,我得到的是這樣的:PHP:如何確定電子郵件附件的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

它可以是你所遇到的。着名的Microsoft TNEF附件格式?(http://en.wikipedia.org/wiki/Transport_Neutral_Encapsulation_Format) – iWantSimpleLife

+1

看起來像'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

+0

我發佈了一篇相當長的關於如何解析原始郵件以查找部件的解釋,但擴展可能是一個很好的起點。你可以看看'php-mime-mailparser':http://code.google.com/p/php-mime-mail-parser/ – Andrew

回答

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編碼,你考慮的是(你可以檢查content-transfer-encoding頭,以確定這一點。
MIME類型的各個附件將被存儲在部分的content-type頭就像在箱單部分消息的

一個音符。 - 這個假設您正在處理的消息的原始來源要做到這一點,你可以使用getRawHeadergetRawContent

+0

嗨,Andrew,Zend庫公開了一個'isMultipart()'方法。我用它來確定電子郵件是否可能有附件。我開始在* second *'Zend_Mail_Message'部分循環(因爲我認爲*是附件開始的地方;第一部分是實際的電子郵件)。這是正確的嗎? – StackOverflowNewbie

+0

'fullBody'是Zend方法嗎?我想嘗試你的解決方案。 – StackOverflowNewbie

+0

一般是這樣做的方式,但它似乎像你的情況有一個在Zend Framework的某種錯誤。從你說的話,好像'isMultipart()'是'返回TRUE',但隨後一旦你看看消息部分它仍然說,這是多。 所以基本上,無論是返回'多/ mixed'應如上分析,這將(希望!)給你的各個部分。 – Andrew