如何获取在 Python 中留下 read/unread 的电子邮件?
How do I fetch emails leaving them read/unread in Python?
我有一个小工具,因为我的电子邮件客户端不支持由 gmail 实现的 IMAP 推送扩展。典型的用法是这样的:
live-email -n 10
其中显示前10个的id和主题
所以一些示例输出可能是:
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 了解更多,我想我会知道如何做到这一点,但可惜我不知道该协议。有什么想法吗?
毫不奇怪,通读 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()
我有一个小工具,因为我的电子邮件客户端不支持由 gmail 实现的 IMAP 推送扩展。典型的用法是这样的:
live-email -n 10
其中显示前10个的id和主题
所以一些示例输出可能是:
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 了解更多,我想我会知道如何做到这一点,但可惜我不知道该协议。有什么想法吗?
毫不奇怪,通读 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()