【问题标题】:imaplib/gmail how to download full message (all parts) while not marking read [duplicate]imaplib/gmail 如何在不标记为已读的情况下下载完整消息(所有部分)[重复]
【发布时间】:2012-06-15 00:47:06
【问题描述】:

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

【问题讨论】:

    标签: python gmail imaplib


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您只需要标头,但仍希望将消息标记为未读(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')
      

      【讨论】:

      • 虽然这可能在有限的环境中有效,但通常的方法是使用只读或窥视。在并发访问是必需功能的协议中,任何非原子的东西都有明显的问题。这不应该是公认的答案。
      【解决方案3】:

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

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

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

      这可以满足我的所有需求。它不会将消息标记为已读 (Seen),而是检索消息的所有部分。

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

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

      但这也产生了错误???

      【讨论】:

      • 这样做的结果是,标题与正文没有分开,无论如何我有点喜欢。整个标题与正文一起显示。
      【解决方案4】:

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

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

      一路上我在RFC 1730 manual.找到了很多资料

      【讨论】:

      • 我收回它,这仍然将消息标记为已读,这令人惊讶,因为我仍在使用body.peek[]
      • 1730 早已过时。 RFC3501 等同于 BODY.PEEK[]
      猜你喜欢
      • 2014-10-26
      • 2013-03-13
      • 1970-01-01
      • 2016-07-25
      • 2021-08-31
      • 2013-01-20
      • 2018-05-18
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多