【问题标题】:Zend_Mail_Part: Get number of attachmentsZend_Mail_Part:获取附件数量
【发布时间】:2012-03-20 01:00:39
【问题描述】:

我怎样才能知道一条消息有多少个附件?

这个方法靠谱吗?

$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) {}
    }
}

还是这个?

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

【问题讨论】:

    标签: zend-framework imap email-attachments zend-mail


    【解决方案1】:

    可能有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) {}
        }
    }
    

    【讨论】:

    • Zend_Mail_Message::getParts 不存在。我的回答中的第二种方法呢?
    • Zend_Mail 直接从 Zend_Mime_Message 扩展而来,它确实有 getParts() 所以 Zend_Mail 继承它。我刚刚测试了那个方法,它奏效了。在上面的示例中,$msg 必须是 Zend_Mail 对象。我不确定$mail-&gt;getMessage 在做什么,但如果$mail 是你的Zend_Mail 对象,你可以跳过它。如果邮件很大或有很大的附件,获取邮件的原始正文可能不是最好的主意。看看您是否可以使上述方法起作用。如果不给我有关变量的更多信息,或者我可以在不同的上下文中发布示例。
    • 我使用了它,但出现了一个异常,就像 exception 'Zend_Mail_Exception' with message 'no Header with Name disposition or disposition found' 一样,我的 $msg 对象也是 Zend_Mail_Storage_Imap,我应该这样做吗?
    • @RohanKumar Zend_Mail_storage 没有从 Zend_MailZend_Mail_Message 扩展,因此它们的功能不同。如果你调用Zend_Mail_Storage_Abstract::getMessage(),你会得到一个Zend_Mail_Message 对象,你可以调用getPart()。完整的标头名称称为Content-Disposition,而不仅仅是disposition,因此这可能就是您收到异常的原因。此标头也可能没有任何部分,因此您可能需要以一种或另一种方式处理该异常。
    • @drew010 Zend_Mail_Storage_Abstract 是一个abstarct class 所以它不能直接调用我试过了,它给出了像Fatal error: Cannot call abstract method Zend_Mail_Storage_Abstract::getMessage()..这样的错误
    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多