How to get 'Message-ID' using imaplib
Asked Answered
Q

4

11

I try to get an unique id that's not change during operation. I think UID is not good. So I think 'Message-ID' is the right thing, But I don't know how to get it. I know just imap.fetch(uid, 'XXXX'), Anyone has a solution?.

Quotient answered 23/9, 2010 at 5:35 Comment(3)
Doesn't message ID change during operation as well?Prescript
@ Manoj Govindan : No, Message-Id will not be change during any operation.Prairial
It does change between sessions - UID stays the same - am I right?Infer
D
11

From IMAP documentation itself:

IMAP4 message numbers change as the mailbox changes; in particular, after an EXPUNGE command performs deletions the remaining messages are renumbered. So it is highly advisable to use UIDs instead, with the UID command.

Discussion at SO : About IMAP UID with imaplib

IMAP4.fetch(message_set, 'UID')

Fetch is the best way to get the UID of the message

And to get message ID you could do some thing like this, Although not all messages may have a message id.

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
Dumas answered 23/9, 2010 at 5:45 Comment(7)
@pyfunc: But the accepted answer to the question you linked to states that Note: UID is changed but the Message-Id will not be changed during any operation on that mail).Prescript
Yeah, The IMAP lib documentation contradicts that discussionDumas
The UID won't change, but the question linked to talks about moving a message to another mailbox. After the move, the UID will be different -- it's really a new message in a different location.Dextral
@Dumas : Can u plz show me any mail which has no Message-Id ?Prairial
@pyfunc: It is not good to execute Fetch command inside the loop , it will reduce the speed. u just fetch the header of all mails in 1 go.Prairial
@pyfunc: I think its great that how you get message-id, but I don't think UID will not change when do operation just like 'move to other mailbox' . Anyway Thank you all :)Quotient
@Prairial Using Message-Id is not unproblematic. The RFC requires each message to have a Message-Id, but spammers (and PHP programmers, which seems to be more or less indistinguishable from the first group in practice) don't read the RFCs. If the Message-Id is not generated properly when the message is sent, it is likely to be generated en route, but this is a precarious assumption. Also, there was historically a problem with a particular mail server (cough Microsoft cough) which did not manage to generate unique Message-id:s. In the context of a single IMAP mailbox, definitely use UID.Lunalunacy
P
7

You can try this python code to fetch the header information of all the mails.

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')
Prairial answered 23/9, 2010 at 9:50 Comment(0)
M
5

There is much easier method for this...

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!

Monasticism answered 21/4, 2014 at 3:34 Comment(0)
L
3
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]
Lengel answered 24/9, 2015 at 14:49 Comment(2)
It would be helpful if you added some explanation to your post. In programming for any language or system, the logic behind it is the most important, and the actual code is secondary to the logic - understanding the logic helps people learn how to write this code themselves later, and tweak it to fit their needs.Tiffie
Where is imapconnection defined? Is this an imaplib.IMAP4_SSL object?Kaufman

© 2022 - 2024 — McMap. All rights reserved.