Question

Je suis en train d'écrire une application cliente qui va chercher des e-mails à partir d'un serveur IMAP, puis les stocke dans une base de données. Le problème est qu'une fois que j'ai vérifié le courrier, la prochaine fois que je veux seulement télécharger le courrier qui est arrivé depuis. Donc, si j'avais vérifié le serveur pour le courrier il y a deux heures, je veux seulement aller chercher le courrier qui est arrivé au cours des deux dernières heures.

Je pourrais utiliser la recherche avec depuis la date, mais il n'y a pas de support pour heure et la date pourrait être facilement usurpée.

J'ai essayé aussi le drapeau RECENT, mais cela ne semble pas fonctionner avec gmail (en rubis, il montre à chaque fois nul).

Était-ce utile?

La solution

Vous voulez utiliser le UniqueId (UID) pour les messages. C'est précisément pourquoi il a été créé.

Vous voulez garder une trace de la dernière UID demandé, puis, de demander tous les nouveaux messages que vous utilisez le message set « [UID]: * »., Où [UID] est la valeur UID réelle

Par exemple, permet de dire que le dernier message feteched avait un identifiant unique de « 123456 ». Vous chercher

123456: *

Ensuite, jeter le premier message de retour.

sont UIDs « censés » être stable entre les sessions, et ne changera jamais, et toujours augmenter en valeur. Le hic, pour vérifier, est de vérifier la UIDVALIDITY lorsque vous sélectionnez le dossier. Si le numéro de UIDVALIDITY n'a pas changé, les UIDs restent valides entre les sessions.

Voici les parties pertinentes de la RFC:

2.3.1.1. Identifiant unique (UID) attribut de message

Une valeur de 32 bits attribué à chaque message, qui, lorsqu'il est utilisé avec le    La valeur de validité d'identificateur unique (voir ci-dessous) forme une valeur de 64 bits    DÉCONSEILLÉS se référer à tout autre message dans la boîte aux lettres ou tout    boîte aux lettres ultérieure avec le même nom pour toujours. identificateurs uniques    sont affectés de façon strictement croissant dans la boîte aux lettres; comme chacun    message est ajouté à la boîte aux lettres, il est associé à un UID supérieur à la    message (s) qui ont été précédemment ajoutés. Contrairement à la séquence de messages    numéros, identificateurs uniques ne sont pas nécessairement contiguës.

L'identifiant unique d'un message NE DOIT PAS changer au cours de la    session, et ne doit pas changer entre les sessions. Tout changement de    identificateurs uniques entre les sessions DOIVENT être détectables à l'aide du    mécanisme UIDVALIDITY discuté ci-dessous. Persistants identificateurs uniques    sont nécessaires pour un client de resynchroniser son état d'un précédent    session avec le serveur (par exemple, l'accès déconnecté ou déconnecté    clients); ceci est discuté plus loin dans [IMAP-DISC].

Remarque: La prochaine valeur d'identifiant unique est destiné à         fournir un moyen pour un client pour déterminer si un         les messages ont été livrés à la boîte aux lettres depuis le         temps précédent le vérifier cette valeur.

Voici le lien avec plus d'informations:

http://www.faqs.org/rfcs/rfc3501.html

Qu'est-ce que je ferais, est aussi garder une trace du INTERNALDATE des messages téléchargés. De cette façon, si vous perdez la synchronisation UID, vous pouvez au moins itérer les messages, et trouver le dernier que vous avez téléchargé, basé sur la INTERNALDATE du message.

Autres conseils

Il y a un drapeau imap appelé « vu ». La plupart des clients marqueraient un message vu lors de l'affichage du message, de sorte que vous voudriez itérer sur les messages sur le serveur qui n'ont pas ce jeu de drapeau.

Voici un extrait de code qui devrait vous donner la bonne idée. Le bit opératoire est bien sûr

imap.search(["NOT", "SEEN"]).each do bla.bla.bla

Si vous êtes-vous capable de filtrer le courrier entrant dans un dossier IMAP spécifique sur le côté serveur, votre application peut lire les nouveaux messages dans ce dossier, puis les déplacer dans le dossier standard INBOX après il est fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top