仅显示imaplib中的特定数量的电子邮件

时间:2016-08-12 15:49:17

标签: python email count imaplib

我在下面的代码工作得很好,但我在测试电子邮件中测试它,它只有大约5封电子邮件。 在我的实际电子邮件帐户中,我的收件箱中至少有4k封电子邮件。

我有没有办法显示一定数量的电子邮件。例如,仅显示前20个最近的电子邮件?然后在说完单击按钮后会显示接下来的20封电子邮件......

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


email_address = "email@company.net"
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,我可以执行类似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

但是当我这样做时,我没有得到任何输出。

关于我如何解决这个问题的任何想法? 谢谢

1 个答案:

答案 0 :(得分: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]我有另一个问题,但我会在另一个帖子上询问。但到目前为止,我有一半的需要,所以我会在这里发布我的解决方案。