2012-03-01 48 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