2013-06-17 4 views
1

Я использую Zend_Mail_Storage_Pop3 для извлечения писем с заданного почтового сервера. Теперь проблема заключается в том, что структура обеспечивает способ получения всех писем из хранилища (Zend_Mail_Storage_Pop3::getMessages()), но это, очевидно, может быть ошеломляющим, когда речь идет о нескольких тысячах писем в коробке. Таким образом, вопрос, как получить некоторые, а не все письма в поле (больше похоже на инструкцию SQL LIMIT), поэтому я мог бы, вероятно, разбивать страницы «resultset».Получение некоторых и не всех писем с использованием Zend_Mail_Storage

Thank you.

ответ

1

Такая функциональность недоступна. Тем не менее, все сообщения имеют номер, начинающийся с 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()); 
+0

Я на самом деле обнаружил, что 'сообщение id' ссылается последовательно в соответствии с их положением в настоящее время принесенной почты. Таким образом, вы можете перебирать, скажем, первые 20 писем и использовать 'Zend_Mail_Storage_Abstract :: getMessage ($ id)' для получения почты по одному. И это о том, как близко он добирается. – burntblark

+0

@burntblark Я добавил пример –

+0

Спасибо за это. Теперь его яснее ... – burntblark

0

Я мог бы быть немного поздно, но с нумерацией страниц классов Zend_Mail_Storage прямо вперед. Все они реализуют интерфейсы итератора и могут быть объединены с LimitIterator для разбивки на страницы. Единственная проблема заключается в том, что они начинаются с 1 вместо 0, потому что это то, что делают все почтовые интерфейсы.

Так вот что вы делаете:

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

Интересно. Я бы попробовал это. Благодарю. – burntblark