使用 IMAP 和 Python 获取最近的 n 封电子邮件

新手上路,请多包涵

我希望使用 IMAP 从电子邮件帐户收件箱返回 n(最有可能是 10)封最近的电子邮件。

到目前为止,我拼凑了:

 import imaplib
from email.parser import HeaderParser

M = imaplib.IMAP4_SSL('my.server')
user = 'username'
password = 'password'
M.login(user, password)
M.search(None, 'ALL')
for i in range (1,10):
    data = M.fetch(i, '(BODY[HEADER])')
    header_data = data[1][0][1]
    parser = HeaderParser()
    msg = parser.parsestr(header_data)
    print msg['subject']

这可以很好地返回电子邮件标头,但它似乎是它收到的电子邮件的半随机集合,而不是最近的 10 封。

如果有帮助,我正在连接到 Exchange 2010 服务器。也欢迎其他方法,考虑到我只想阅读电子邮件而不发送任何电子邮件,IMAP 似乎是最合适的。

原文由 mrmagooey 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 961
2 个回答

排序命令可用,但不保证 IMAP 服务器支持它。例如,Gmail 不支持 SORT 命令。

要尝试排序命令,您将替换:

M.search(None, 'ALL')

M.sort(search_critera, 'UTF-8', 'ALL')

然后 search_criteria 将是一个类似这样的字符串:

 search_criteria = 'DATE' #Ascending, most recent email last
search_criteria = 'REVERSE DATE' #Descending, most recent email first

search_criteria = '[REVERSE] sort-key' #format for sorting

根据 RFC5256 ,这些是有效的 sort-key 的:

"ARRIVAL" / "CC" / "DATE" / "FROM" / "SIZE" / "SUBJECT" / "TO"

笔记:

1. charset 是必需的,尝试 US-ASCIIUTF-8 所有其他的都不需要IMAP服务器支持

2. 搜索条件也是必需的。 ALL 命令是有效的,但有很多。在 http://www.networksorcery.com/enp/rfc/rfc3501.txt 查看更多

IMAP 的世界是疯狂的。祝你好运

原文由 rfadams 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是获取 emailFrom、emailSubject、emailDate、emailContent 等的代码。

 import imaplib, email, os
user = "your@email.com"
password = "pass"
imap_url = "imap.gmail.com"
connection = imaplib.IMAP4_SSL(imap_url)
connection.login(user, password)
result, data = connection.uid('search', None, "ALL")
if result == 'OK':
    for num in data[0].split():
        result, data = connection.uid('fetch', num, '(RFC822)')
        if result == 'OK':
            email_message = email.message_from_bytes(data[0][1])
            print('From:' + email_message['From'])
            print('To:' + email_message['To'])
            print('Date:' + email_message['Date'])
            print('Subject:' + str(email_message['Subject']))
            print('Content:' + str(email_message.get_payload()[0]))
connection.close()
connection.logout()

原文由 tshubham7 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题