使用IMAP和Python获取最近n封邮件
我想从一个邮箱的收件箱中获取最近的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-ASCII
或 UTF-8
,其他的字符集不一定被IMAP服务器支持。
2. 搜索条件也是必须的。ALL
是一个有效的命令,但还有很多其他的命令。想了解更多,可以查看http://www.networksorcery.com/enp/rfc/rfc3501.txt
IMAP的世界非常复杂,祝你好运!