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

15 投票
6 回答
31138 浏览
提问于 2025-04-16 15:33

我想从一个邮箱的收件箱中获取最近的n封邮件(大概是10封),使用IMAP协议。

到目前为止,我拼凑了以下代码:

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看起来最合适,因为我只想读取邮件,而不是发送邮件。

6 个回答

3

这是用来获取发件人邮箱、邮件主题、邮件日期、邮件内容等信息的代码。

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()        
4
# get recent one email
from imap_tools import MailBox
with MailBox('imap.mail.com').login('test@mail.com', 'password', 'INBOX') as mailbox:
   for msg in mailbox.fetch(limit=1, reverse=True):
       print(msg.date_str, msg.subject)

这是一个链接,指向一个名为“imap_tools”的项目,存放在GitHub上。你可以通过这个链接访问它,了解更多关于这个项目的信息。

19

虽然有排序命令,但并不是所有的IMAP服务器都支持它。比如说,Gmail就不支持这个SORT命令。

如果你想尝试使用排序命令,可以把下面这行代码:
M.search(None, 'ALL')
替换成:
M.sort(search_criteria, '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. 字符集是必须的,可以尝试 US-ASCIIUTF-8,其他的字符集不一定被IMAP服务器支持。
2. 搜索条件也是必须的。ALL 是一个有效的命令,但还有很多其他的命令。想了解更多,可以查看http://www.networksorcery.com/enp/rfc/rfc3501.txt

IMAP的世界非常复杂,祝你好运!

撰写回答