2010-09-23 3 views
4

J'essaie d'obtenir un identifiant unique qui ne change pas pendant le fonctionnement. Je pense que l'UID n'est pas bon. Donc, je pense que "Message-ID" est la bonne chose, mais je ne sais pas comment l'obtenir. Je sais juste imap.fetch (uid, 'XXXX'), N'importe qui a une solution ?.Comment obtenir un 'Message-ID' en utilisant imaplib

+0

L'ID de message ne change-t-il pas également pendant le fonctionnement? –

+0

@ Manoj Govindan: Non, Message-Id ne sera pas modifié pendant une opération. – Avadhesh

+0

Cela change entre les sessions - l'UID reste le même - ai-je raison? – mrmnmly

Répondre

6

De la documentation IMAP lui-même:

numéros de message IMAP4 changent à mesure que les changements de boîte aux lettres; en particulier, après qu'une commande EXPUNGE effectue des suppressions, les messages restants sont renumérotés. Il est donc fortement conseillé d'utiliser les UID à la place, avec la commande UID.

Discussion au SO: About IMAP UID with imaplib

IMAP4.fetch(message_set, 'UID') 

Fetch est la meilleure façon d'obtenir l'UID du message

Et pour obtenir l'ID de message que vous pourriez faire quelque chose comme ça, mais pas tous les messages peuvent avoir un identifiant de message.

server.select(imap_folder) 
# List all messages 
typ, data = server.search(None, 'ALL') 
# iterate through messages 
for num in data[0].split(): 
    typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (MESSAGE-ID)])') 
    # parse data to get message id 
+1

@pyfunc: Mais la réponse acceptée à la question que vous avez liée aux états que 'Note: UID est changé, mais le Message-Id ne sera pas changé au cours de toute opération sur ce courrier électronique'. –

+0

Ouais, la documentation lib IMAP contredit cette discussion – pyfunc

+1

L'UID ne changera pas, mais la question liée à parle de déplacer un message vers une autre boîte aux lettres. Après le déménagement, l'UID sera différent - c'est vraiment un nouveau message dans un endroit différent. –

4

Vous pouvez essayer ce code python pour récupérer les informations d'en-tête de tous les messages.

import imaplib 
import email 

obj = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
obj.login('username', 'password') 
obj.select('folder_name') 
resp,data = obj.uid('FETCH', '1:*' , '(RFC822.HEADER)') 
messages = [data[i][1].strip() + "\r\nSize:" + data[i][0].split()[4] + "\r\nUID:" + data[i][0].split()[2] for i in xrange(0, len(data), 2)] 
for msg in messages: 
    msg_str = email.message_from_string(msg) 
    message_id = msg_str.get('Message-ID') 
1

Il est beaucoup plus facile méthode pour cette ...

typ, data = obj.fetch(num, '(BODY[HEADER.FIELDS (MESSAGE-ID)])') 
msg_str = email.message_from_string(data[0][1]) 
message_id = msg_str.get('Message-ID') 
print message_id 

Hope this helps!

1
result, data = imapconnection.uid('search', None, "ALL") # search and return uids instead 
latest_email_uid = data[0].split()[-1] 
result, data = imapconnection.uid('fetch', latest_email_uid, '(RFC822)') 
raw_email = data[0][1] 
+2

Il serait utile que vous ajoutiez quelques explications à votre message. En programmation pour n'importe quel langage ou système, la * logique * derrière est la plus importante, et le * code * est secondaire à la logique - comprendre la logique aide les gens à apprendre à écrire ce code plus tard, et à le modifier leurs besoins. – CodeMouse92

Questions connexes