簡體   English   中英

PHP:如何確定電子郵件附件的MIME類型?

[英]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-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標題來確定這一點。
單個附件的模仿類型將存儲在部件的content-type標頭中,就像在單個部件消息的情況下一樣。

一個注意事項-假設您正在處理消息的原始來源。 為此,可以使用getRawHeadergetRawContent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM