提高python中IMAP批量消息删除的速度

目标是使用imaplib删除大量电子邮件.电子邮件文件夹每月收到大约300,000条新邮件.只应删除超过1个月的邮件.如果执行此脚本,它将删除旧消息,但删除需要花费大量时间,而且迭代操作简单无效.这需要几个小时.

通过尝试通过多处理来提高速度会产生错误.

您有什么建议可以提高删除大量邮件的速度?

import sys
import datetime
from imaplib import IMAP4

# get the date a month from the current
monthbefore = (datetime.date.today() - datetime.timedelta(365/12)).strftime("%d-%b-%Y")

m = IMAP4('mail.domain.com')
m.login('user@domain.com', 'password')

# shows how many messages in selected folder
print m.select('Folder')
typ, data = m.select('Folder')

# find old messages
typ, data = m.search(None, '(BEFORE %s)' % (monthbefore))

# delete them
print "Will be removed:\t", data[0].split()[-1],"messages"
for num in data[0].split():
  m.store(num, '+FLAGS', '\\Deleted')
  sys.stderr.write('\rRemoving message:\t %s' % num)

# now expunge marked for deletion messages, close connection and exit
print "\nGet ready for expunge"
m.expunge()
print "Expunged! Quiting."
m.close()
m.logout()

更新:重新编写代码的一部分,这是一个快1000倍的工作变量(我的服务器支持store命令一次超过1000条消息):

    def chunks(l, n):
        # yields successive n-sized chunks from l.
        for i in xrange(0, len(l), n):
            yield l[i:i+n]

    mcount = data[0].split()[-1]
    print "Will be removed", mcount, "messages"
    for i in list(chunks(data[0].split(), 1000)):
        m.store(",".join(i), '+FLAGS', '\\Deleted')
        sys.stderr.write('\rdone {0:.2f}%'.format((int(i[-1])/int(mcount)*100)))

最佳答案 我认为这里的主要问题是你为每条消息调用STORE.每次到服务器的往返都需要时间,当你进行大量的删除时,这确实会增加.

为了避免所有这些调用STORE尝试使用多个消息ID调用它.您可以传递单独列出的逗号(例如“1,2,3,4”),消息ID范围(例如“1:10”)或两者的组合(例如“1,2,5,1:10”) “).请注意,大多数服务器似乎对每次调用允许的消息ID数量有限制,因此您可能仍需要将ID分块(例如200条消息)并多次调用STORE.这仍然比每个消息调用STORE快得多.

有关进一步参考,请参阅RFC 3501的STORE Command部分.它显示了一个采用一系列消息ID的STORE命令的示例.

点赞