2012-03-01 47 views
0

我如何知道消息具有多少個附件?Zend_Mail_Part:獲取附件數

該方法可靠嗎?

$attachments = 0; 
$msg = $mail->getMessage($msgno); 
if($msg->isMultipart()){ 
    $parts = $msg->countParts(); 
    for($i=1; $i<=$parts; $i++){ 
     $part = $msg->getPart($i); 
     try { 
      if(strpos($part->contentType,'text/html')===false && strpos($part->contentType,'text/plain')===false) 
       $attachments++; 
     } catch (Zend_Mail_Exception $e) {} 
    } 
} 

or this?

$matches = array(); 
$pattern = '`Content-Disposition: (?!inline)(.*)[\s]*filename=`'; 
$attachments = (string) preg_match_all($pattern, $storage->getRawContent($msgno), $matches); 

回答

3

它可能有是text/htmltext/plain附件,所以它可能不會在所有情況下可靠。例如,如果有一個附件是HTML文件,則可能會出現這種情況。

你可能會更好檢查每個MIME部分,而不是content-disposition

$attachments = 0; 
$msg = $mail->getMessage($msgno); 
if($msg->isMultipart()){ 
    foreach($msg->getParts() as $part) { 
     try { 
      if ($part->disposition == Zend_Mime::DISPOSITION_ATTACHMENT || 
       $part->disposition == Zend_Mime::DISPOSITION_INLINE) 
       $attachments++; 
     } catch (Zend_Mail_Exception $e) {} 
    } 
} 
+1

Zend_Mail_Message ::的getParts不存在。我的答案中的第二種方法呢? – AHHP 2012-03-05 13:12:03

+1

'Zend_Mail'直接從具有'getParts()'的Zend_Mime_Message'繼承,所以'Zend_Mail'繼承它。我只是測試了這個方法,它工作。在上面的例子中,'$ msg'必須是'Zend_Mail'對象。我不確定'$ mail-> getMessage'在做什麼,但是如果'$ mail'是你的'Zend_Mail'對象,也許可以跳過。如果郵件很大或有很大的附件,獲取郵件的原始內容可能不是最好的想法。看看你是否可以得到上述方法的工作。如果沒有給我更多關於變量的信息,或者我可以在不同的上下文中發佈一個例子。 – drew010 2012-03-05 16:41:29

+0

我用它和一個異常就像'異常'Zend_Mail_Exception'消息'沒有名稱處置或處置發現頭''我的'$ msg'對象是'Zend_Mail_Storage_Imap'我應該這樣做嗎? – 2012-07-23 09:53:52