如何从IMAP服务器获取最后10条消息?

时间:2015-07-04 08:21:08

标签: python imap imaplib

我使用imaplib2库用这样的命令搜索最后10条消息:

imap_client.search(None, '{}:{}'.format(last_uid, last_uid - 9))

但要获得last_uid,我每次都需要exec这样的命令:

imap_client.select("INBOX", readonly=True)

获取最后一个UID。

有没有办法:

  1. 在没有select()命令获取最后10条消息的情况下获取最后一个UID
  2. 没有最后一个UID。也许有任何搜索标准,如'最后'或'-10:'?
  3. 我不能像这样client.search(None, 'ALL')执行exec命令,因为IMAP服务器有超过50K的消息。

2 个答案:

答案 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 - 9message_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封电子邮件的电子邮件时,这非常方便。