我无意中将我的收件箱中的所有邮件标记为使用此python语句读取:
status, data = conn.uid('fetch', fetch_uids, '(RFC822)')
但是我能够通过以下一组陈述来浏览消息的所有部分:
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()
输出:
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
我发现如果我改用这句话:
status, data = conn.uid('fetch', fetch_uids, '(RFC822.HEADER BODY.PEEK[1])')
我不会将所有消息都标记为已读。但是,我也不会得到消息的所有部分:
Content-Type: multipart/mixed
Main Content: multipart
Sub Content: mixed
我试过阅读imaplib here的手册,但没有提到“peek”这个词。我的问题是,如何在不将我的消息标记为已读的情况下获取消息的所有部分?感谢。
答案 0 :(得分:3)
您也可以以只读模式打开邮箱。 select(folder,readonly = True)
答案 1 :(得分:2)
我想我只是以正式的方式与自己说话。 :)
我想我这次真的找到了答案:
status, data = conn.uid('fetch', fetch_ids, '(BODY.PEEK[])')
这可以满足我所寻找的一切。它不会将消息标记为已读(已查看),而是检索消息的所有部分。
查看RFC 1730手册,看起来这应该有效:
status, data = conn.uid('fetch', fetch_ids, '(RFC822.PEEK BODY)')
但这也产生了错误???
答案 2 :(得分:1)
我想如果你继续尝试足够的组合,你会找到答案:
status, data = conn.uid('fetch', fetch_ids, '(RFC822 BODY.PEEK[])')
在此过程中,我在RFC 1730 manual.
中找到了大量信息答案 3 :(得分:1)
如果您只想要标题,但仍希望将邮件标记为未读(UNSEEN),则需要两个命令fetch然后存储:
# 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')