【问题标题】:Getting some and not all mails using Zend_Mail_Storage使用 Zend_Mail_Storage 获取部分而非全部邮件
【发布时间】:2013-06-13 13:44:56
【问题描述】:

我使用Zend_Mail_Storage_Pop3 从给定的邮件服务器获取邮件。现在,问题是该框架提供了一种从存储中获取所有邮件的方法 (Zend_Mail_Storage_Pop3::getMessages()),但是当谈论一个盒子里有几千封邮件时,这显然会让人不知所措。因此,问题是,我如何在一个框中获取一些而不是所有邮件(更像是 SQL LIMIT 语句),以便我可以对“结果集”进行分页。

谢谢。

【问题讨论】:

    标签: php zend-framework pop3 mail-server zend-mail


    【解决方案1】:

    我可能有点晚了,但是 Zend_Mail_Storage 类的分页是直截了当的。它们都实现了迭代器接口,并且可以与LimitIterator 组合以进行分页。唯一的问题是它们以 1 而不是 0 开头,因为这是所有邮件接口所做的。

    这就是你要做的:

    $mail = new Zend_Mail_Storage_Pop3(/* ... */); 
    foreach (new LimitIterator($mail, 1 + $offset, $limit + $offset) as $message) {
        // ...
    }
    

    【讨论】:

    • 有趣。我会试试这个。谢谢。
    【解决方案2】:

    此类功能不可用。但是,所有邮件都有一个以 1 开头的编号。如果您只是在阅读电子邮件,那么您可以缓存上次打开的邮件编号,下次从这个(缓存的)编号开始检索邮件。另一种解决方案是缓存所有打开的消息 (read more),但诀窍是在这种情况下如何使缓存无效。

    快速示例:

    $mail = new Zend_Mail_Storage_Imap(array('host'     => 'localhost',
                                             'user'     => 'root',
                                             'password' => '******'));
    
    $cachedId = (apc_exists('email_id') ? apc_fetch('email_id') + 1 : 1);
    
    for ($id = $cachedId ; $id <= $mail->countMessages() ; $id++) {
        echo sprintf('%d, %s <br/>', $id, $mail->getMessage($id)->subject);
    }
    
    apc_store('email_id', $mail->countMessages());
    

    【讨论】:

    • 我实际上发现message id 是根据它们在当前获取的邮件中的位置连续引用的。因此,您可以遍历前 20 封邮件并使用 Zend_Mail_Storage_Abstract::getMessage($id) 一次获取一封邮件。这就是它的接近程度。
    • @burntblark 我添加了一个示例
    • 文档中的缓存链接适用于 mbox 和 maildir,旨在避免解析时间和文件访问。与pop3或imap无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多