[英]PHP: How to determine email attachment's MIME type?
我正在使用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類型?
這有點復雜。 如果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
標題來確定這一點。
單個附件的模仿類型將存儲在部件的content-type
標頭中,就像在單個部件消息的情況下一樣。
一個注意事項-假設您正在處理消息的原始來源。 為此,可以使用getRawHeader
和getRawContent
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.