2013-06-17 2 views
1

J'utilise Zend_Mail_Storage_Pop3 pour récupérer des mails d'un serveur de messagerie donné. Maintenant, le problème est que le cadre fournit un moyen d'aller chercher tous les mails depuis le stockage (Zend_Mail_Storage_Pop3::getMessages()) mais cela peut évidemment être écrasant quand on parle de quelques milliers de mails dans une boîte. Ainsi, la question, comment puis-je récupérer certains et pas tous les mails dans une boîte (plus comme l'instruction SQL LIMIT), donc je pourrais probablement paginer le "resultset".Obtention de certains mails et non de tous à l'aide de Zend_Mail_Storage

Merci.

Répondre

1

Une telle fonctionnalité n'est pas disponible. Cependant, tous les messages ont un numéro commençant par 1. Si vous lisez simplement des courriels, vous pouvez mettre en mémoire cache le dernier numéro de message ouvert et, la prochaine fois, commencer à récupérer des courriels à partir de ce numéro (mis en cache). Une autre solution consiste à mettre en cache tous les messages ouverts (read more) mais l'astuce consiste à invalider le cache dans ce cas.

rapide Exemple:

$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

En fait, je découvert que le message de 'id' est référencé en série en fonction de leur position dans les mails actuellement récupérés. Ainsi, vous pouvez parcourir, par exemple, les 20 premiers mails et utiliser 'Zend_Mail_Storage_Abstract :: getMessage ($ id)' pour récupérer les mails un à la fois. Et c'est à peu près à quel point ça se rapproche. – burntblark

+0

@burntblark J'ai ajouté un exemple –

+0

Merci pour ça. Son plus clair maintenant ... – burntblark

0

je pourrais être un peu en retard, mais avec les classes de pagination de Zend_Mail_Storage est simple. Ils implémentent tous des interfaces d'itérateur et peuvent être combinés avec un LimitIterator pour la pagination. Le seul gotcha est qu'ils commencent avec 1 au lieu de 0, parce que c'est ce que font toutes les interfaces de messagerie.

Alors c'est ce que vous faites:

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

Intéressant. Je vais essayer ça. Merci. – burntblark

Questions connexes