2015-07-04 1 views
0

Я использую imaplib2 библиотеку для поиска последних 10 сообщений с такой командой:Как получить последние 10 сообщений с сервера IMAP?

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

Но чтобы получить last_uid мне нужно EXEC каждой команды времени, как это:

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

получить последний UID.

Являются ли какие-либо способы:

  1. получить последний UID без select() команды выборки 10 последних сообщений
  2. без последнего UID. Возможно, существуют такие критерии поиска, как «LAST» или «-10:»?

Я не могу выполнить команду вроде этого client.search(None, 'ALL'), так как сервер IMAP имеет более 50 тыс. Сообщений.

+1

Возможный дубликат [Получение последних сообщений электронной почты с использованием IMAP и Python] (http://stackoverflow.com/questions/5632713/getting-n-most-recent-emails-using-imap-and-python) – Joe

+0

@ Джо, это не дубликат. Я не могу выполнить критерии «ВСЕ». Спасибо за этот момент, теперь отредактировал вопрос. – p2mbot

+1

@Joe: если бы было только одно значение «последнего», это было бы дубликат. * sigh * – arnt

ответ

2

Вы можете получить последний UID, используя команду STATUS (UIDNEXT). Тем не менее, вы должны выбрать почтовый ящик для извлечения сообщений, а когда вы выдаете SELECT, вы получите сообщение об обратном, которое возвращает select Python imaplib.

Так все, что вам нужно:

(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

Для любых будущих путешественников, которые ищут ответ на этот вопрос, я придумал код из подсказки @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 электронными письмами.

 Смежные вопросы

  • Нет связанных вопросов^_^