imaplib/gmail how to download full message (all parts) while not marking read [duplicate]

StackOverflow https://stackoverflow.com/questions/10991533

  •  13-06-2021
  •  | 
  •  

Question

I inadvertently marked all the messages in my inbox as read with this python statement:

status, data = conn.uid('fetch', fetch_uids, '(RFC822)')

But I was able to walk through all the parts of the message with the following set of statments:

email_message = email.message_from_string(data[0][1])
for part in email_message.walk():
  print '\n'
  print 'Content-Type:',part.get_content_type()
  print 'Main Content:',part.get_content_maintype()
  print 'Sub Content:',part.get_content_subtype()

The output:

Content-Type: multipart/mixed
Main Content: multipart
Sub Content: mixed


Content-Type: multipart/alternative
Main Content: multipart
Sub Content: alternative


Content-Type: text/plain
Main Content: text
Sub Content: plain


Content-Type: text/html
Main Content: text
Sub Content: html

I found that if I used this statement instead:

status, data = conn.uid('fetch', fetch_uids, '(RFC822.HEADER BODY.PEEK[1])')

that I wouldn't mark all of my messages read. However, I also wouldn't get all the parts of the message:

Content-Type: multipart/mixed
Main Content: multipart
Sub Content: mixed

I tried to read the manual for imaplib here, but the word "peek" is not mentioned. My question is, how do I get all the parts of the message while not marking my messages as read? Thanks.

Was it helpful?

Solution 4

If you want just the headers, but still want the message to be left marked unread (UNSEEN), it requires two commands fetch and then store:

# get uids of unseen messages
result, uids = conn.uid('search', None, '(UNSEEN)')

# convert these uids to a comma separated list
fetch_ids = ','.join(uids[0].split())

# first fetch the headers, this will mark them read (SEEN)
status, headers = conn.uid('fetch', fetch_ids, '(RFC822.HEADER)')

# now mark each message unread (UNSEEN)
status1, flags = conn.uid('store', fetch_ids,'-FLAGS','\\Seen')

OTHER TIPS

You can also open the mailbox in readonly mode. select(folder, readonly=True)

I guess if you just keep trying enough combinations, you'll find your answer:

status, data = conn.uid('fetch', fetch_ids, '(RFC822 BODY.PEEK[])')

Along the way I found a lot of information in the RFC 1730 manual.

I think I am talking to myself, just in a formal way. :)

I think I really found the answer this time:

status, data = conn.uid('fetch', fetch_ids, '(BODY.PEEK[])')

This does everything that I was looking for. It does not mark the message as read (Seen), and it retrieves all parts of the message.

Looking at the RFC 1730 manual it seemed like this should have worked:

status, data = conn.uid('fetch', fetch_ids, '(RFC822.PEEK BODY)')

but that produced an error as well???

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top