【问题标题】:How do I fetch emails leaving them read/unread in Python? [duplicate]如何在 Python 中获取已读/未读的电子邮件? [复制]
【发布时间】:2016-03-12 22:09:09
【问题描述】:

我有一个小工具,因为我的电子邮件客户端不支持 gmail 实现的 IMAP 推送扩展。典型用法是这样的:

live-email -n 10

其中显示了前 10 个的 id 和 subject。

所以一些示例输出可能是:

1242: Hello!
1241: Your email
1240: Re: 
...

代码(针对这个问题进行了简化)如下:

#!/usr/bin/env python3

from imaplib import IMAP4_SSL
from netrc import netrc
from email import message_from_bytes
from argparse import ArgumentParser

parser = ArgumentParser(description='Check email')
parser.add_argument('-n', '--count', dest='count', action='store',
                   default=1, type=int,
                   help='How many messages to show')

args = parser.parse_args()

conn = IMAP4_SSL('imap.gmail.com')
auth = netrc().hosts['imap.gmail.com']

conn.login(auth[0], auth[2])
conn.select()

typ, data = conn.search(None, 'ALL')
i = 0
for num in reversed(data[0].split()):
    i += 1
    typ, data = conn.fetch(num, '(RFC822)')
    email = message_from_bytes(data[0][1])
    print("%i: %s" % (int(num), email.get('subject')))
    if i == args.count:
        break

conn.close()
conn.logout()

以上工作。问题是获取每封电子邮件的行为将其标记为已读。我想不理会电子邮件的状态。如果我对 IMAP 有更多了解,我怀疑我会知道如何执行此操作,但我不知道该协议。有什么想法吗?

【问题讨论】:

    标签: python email python-3.x imap


    【解决方案1】:

    不出所料,阅读RFC 2060 给了我答案。解决方案是使用(BODY.PEEK[]) 而不是(RFC822)。所以完整的答案是:

    #!/usr/bin/env python3
    
    from imaplib import IMAP4_SSL
    from netrc import netrc
    from email import message_from_bytes
    from argparse import ArgumentParser
    
    parser = ArgumentParser(description='Check email')
    parser.add_argument('-n', '--count', dest='count', action='store',
                       default=1, type=int,
                       help='How many messages to show')
    
    args = parser.parse_args()
    
    conn = IMAP4_SSL('imap.gmail.com')
    auth = netrc().hosts['imap.gmail.com']
    
    conn.login(auth[0], auth[2])
    conn.select()
    
    typ, data = conn.search(None, 'ALL')
    i = 0
    for num in reversed(data[0].split()):
        i += 1
        typ, data = conn.fetch(num, '(BODY.PEEK[])')
        email = message_from_bytes(data[0][1])
        print("%i: %s" % (int(num), email.get('subject')))
        if i == args.count:
            break
    
    conn.close()
    conn.logout()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2014-04-19
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多