2016-08-12 2 views
0

Код, который у меня ниже, отлично работает, но я тестирую это на тестовом электронном письме, и у него есть только около 5 электронных писем. На моей фактической учетной записи электронной почты у меня есть по крайней мере 4k электронной почты на моем почтовом ящике.Показывать определенное количество писем в imaplib

Есть ли способ показать определенное количество писем. Например, показывать только первые 20 последних писем? А потом после этого сказать, когда нажимается кнопка будет показывать следующие 20 писем ...

import sys 
import imaplib 
import getpass 
import email 
import email.header 
import datetime 


email_address = "[email protected]" 
password = "123456" 

M = imaplib.IMAP4('mail.company.net') 
rows = [] 

try: 
    M.login(email_address, password) 
    print "LOGIN SUCCESS!" 
except imaplib.IMAP4.error: 
    print "LOGIN FAILED!!" 

rv, data = M.select("INBOX") 
rv, data = M.search(None, "ALL") 

for num in data[0].split(): 
    rv, data = M.fetch(num, '(RFC822)') 
    msg = email.message_from_string(data[0][1]) 

    subj = msg['Subject'] 
    to = msg['To'] 
    frm = msg['From'] 
    body = msg.get_payload() 

    print subj, " ", to, " ", frm, " ", body 

M.close() 
M.logout() 

Я сожалею, но я действительно с трудом пытаясь понять это. Самое последнее, я узнал, что я могу получить общее количество писем

num_msgs = int(data[0]) 
print 'You have a total of %d messages' % num_msgs 

И если id_list[-1] получить последнюю версию идентификатор электронной почты, я могу сделать что-то вроде id_list[-1] + 19 или что-то, чтобы он мог получить 20 самых последних по электронной почте?

Я бы очень признателен за помощь в достижении желаемого результата. Спасибо.

До сих пор я

ids = data[0] 
id_list = ids.split() 
latest_email_id = id_list[-1] #gets most recent email 

for i in latest_email_id: 
    if i > 21: 
     rv, data = M.fetch(num, '(RFC822)') 
     msgrecent = email.message_from_string(data[0][1]) 
     subjs = msgrecent['Subject'] 
     print "only print 20 most recent email" 
     print subjs 
    else: 
     print "none" 

Как я могу изменить это, чтобы получить выход мне нужно? Спасибо


Последнее обновление:

Я обновил код следующим:

ids = data[0] 
id_list = ids.split() 

for num in id_list[0:10]: 
    rv, data = M.fetch(num, '(RFC822)') 
    msg = email.message_from_string(data[0][1]) 

    subj = msg['Subject'] 
    to = msg['To'] 
    frm = msg['From'] 
    body = msg.get_payload() 

    print subj 

Воспроизводит в порядке возрастания

first 
second 
third 
fourth 
. 
. 
. 
. 
tenth 

поэтому я решил добавить -1 так что он будет сортировать по убыванию

ids = data[0] 
id_list = ids.split() 

for num in id_list[0:10:-1]: 
    rv, data = M.fetch(num, '(RFC822)') 
    msg = email.message_from_string(data[0][1]) 

    subj = msg['Subject'] 
    to = msg['To'] 
    frm = msg['From'] 
    body = msg.get_payload() 

    print subj 

но когда я сделал это, я не получил никакого выхода.

Любая идея о том, как я могу это исправить? Thank You

+0

Возможно, есть способ, вы что-то пробовали? – Julien

+0

, кроме поиска в google и повторного чтения библиотек imaplib, ничего еще – hocuspocus31

+0

Как насчет хранения списка uids где-то и только глядя на последние двадцать из них? – Max

ответ

0

Я только что понял, что у меня уже есть вывод, который я хочу, чтобы выводить только указанное количество писем.

ids = data[0] 
id_list = ids.split() 

for num in id_list[0:10]: 
    rv, data = M.fetch(num, '(RFC822)') 
    msg = email.message_from_string(data[0][1]) 

    subj = msg['Subject'] 
    to = msg['To'] 
    frm = msg['From'] 
    body = msg.get_payload() 

    print subj 

id_list[0:10]: в котором будет выводить первые 10 электронной почты в почтовом ящике. Если мне нужно вывести 20, его можно изменить на id_list[0:20] У меня есть еще одна проблема, но я попрошу об этом на другом посту. Но пока у меня есть половина того, что мне нужно, поэтому я опубликую свое решение здесь.