我使用imaplib2库用这样的命令搜索最后10条消息:
imap_client.search(None, '{}:{}'.format(last_uid, last_uid - 9))
但要获得last_uid
,我每次都需要exec这样的命令:
imap_client.select("INBOX", readonly=True)
获取最后一个UID。
有没有办法:
select()
命令获取最后10条消息的情况下获取最后一个UID 我不能像这样client.search(None, 'ALL')
执行exec命令,因为IMAP服务器有超过50K的消息。
答案 0 :(得分:3)
您可以使用STATUS (UIDNEXT)
命令获取最后一个UID。但是,您必须选择邮箱才能检索邮件,当您发出SELECT时,您将收到一条消息计数,这是Python imaplib的select
返回的。
所以你需要的只是:
(status, response_text) = mailbox.select("inbox")
# response_text usually contains only one bytes element that denotes
# the message count in an ASCII string
message_count = int(response_text[0].decode("ascii"))
然后您可以通过message_count - 9
到message_count
的索引来获取邮件。
请注意,邮件的索引从一开始。
答案 1 :(得分:2)
对于寻求答案的未来旅行者,我想出了@arnt给出的提示代码。
svr = imaplib.IMAP4_SSL(server)
if svr.login(user=user, password=password):
print('User ' + user + ' logged in successfully.')
else:
print('Login for the user ' + user + " was denied. Please check your credentials.")
x = svr.select('inbox', readonly=True)
num = x[1][0].decode('utf-8')
#from here you can start a loop of how many mails you want, if 10, then num-9 to num
resp, lst = svr.fetch(num, '(RFC822)')
body = lst[0][1]
email_message = email.message_from_bytes(body)
对我而言,当我访问包含超过67000封电子邮件的电子邮件时,这非常方便。