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

梦想与她 提交于 2019-12-07 07:33:52

问题


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.


回答1:


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




回答2:


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.




回答3:


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???




回答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')


来源:https://stackoverflow.com/questions/10991533/imaplib-gmail-how-to-download-full-message-all-parts-while-not-marking-read

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!