5

我无意中将收件箱中的所有消息都标记为已阅读此 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 的手册,但没有提到“peek”这个词。我的问题是,如何在不将消息标记为已读的情况下获取消息的所有部分?谢谢。

4

4 回答 4

3

您也可以在只读模式下打开邮箱。选择(文件夹,只读=真)

于 2014-04-03T16:45:38.077 回答
2

我想如果你继续尝试足够多的组合,你会找到答案:

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

一路上,我在RFC 1730 手册中找到了很多信息。

于 2012-06-12T18:06:35.843 回答
2

我想我是在自言自语,只是以一种正式的方式。:)

我想我这次真的找到了答案:

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

这完成了我正在寻找的一切。它不会将消息标记为已读 (Seen),而是检索消息的所有部分。

查看 RFC 1730 手册,这似乎应该有效:

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

但这也产生了错误???

于 2012-06-12T18:57:01.903 回答
1

如果您只需要标头,但仍希望将消息标记为未读(UNSEEN),则需要两个命令获取然后存储:

# 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')
于 2012-06-28T06:21:31.907 回答