python imaplib只返回来自exchange 2013的一半消息

2024-06-16 11:41:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着找出问题所在。我不明白。在

问题:我一次只能从收件箱收到一半的邮件。当我再次运行时,它会收到另一半的消息,以此类推,直到没有剩下的消息。在

设置:我尝试在Debian7上使用Python2.7.3(我知道它很旧)来获取消息imaplib.fetch来自Exchange Server 2013。在

def fetch_mails():
    messages = []
    mailbox = IMAP4_SSL(host = mail_host, port = mail_port)
    mailbox.login(mail_user, mail_password)
    mailbox.select()
    mailcount = mailbox.search(None, 'ALL')[1][0]
    mailcount = sum(1 for num in mailcount.split())
    for i in xrange(1, mailcount+1):
        mailbox.select()
        status, data = mailbox.fetch(str(i), '(RFC822)')
        current = email.message_from_string(data[0][1])
        messages.append(current)
        mailbox.store(i, '+FLAGS', r'\Deleted')
    return messages

错误:“指定的消息集无效。”

有人知道为什么会这样吗?最后我可以处理所有的邮件,但不能一次处理。 提前感谢您的帮助!在


Tags: inhost消息fordataport邮件mail
1条回答
网友
1楼 · 发布于 2024-06-16 11:41:00

这里有两个问题,它们共同表现出这种行为:

  1. 您使用的是消息序列号。邮件从1到n连续编号,其中n是邮箱中的邮件数。每当删除消息时,所有序列号都会发生移动。在
  2. 您正在重新选择每封邮件之间的邮箱。这使服务器有机会删除已删除的消息,从而向下移动所有序列号。在

因此,代码下载消息1,将其标记为已删除,然后重新选择邮箱,允许服务器删除它,将消息2-N向下移动到messages 1-(N-1)。然后下载消息2(之前是第三条消息),然后重复。正因为如此,你只能下载其他邮件。在

有两种修复方法:

  1. 删除邮箱。选择()从你的循环。在
  2. 改用uid,即使在删除邮件时,uid也是稳定的。在

以下是两个更改后的代码:

def fetch_mails():
    messages = []
    mailbox = IMAP4_SSL(host = mail_host, port = mail_port)
    mailbox.login(mail_user, mail_password)
    mailbox.select()
    uids = mailbox.uid('SEARCH', 'ALL')[1][0].split()
    for uid in uids:
        status, data = mailbox.uid('FETCH', uid, '(RFC822)')
        current = email.message_from_string(data[0][1])
        messages.append(current)
        mailbox.uid('STORE', uid, '+FLAGS', r'\Deleted')
    return messages

我还没有测试代码,所以您可能需要做一些小的更改。在

相关问题 更多 >