提高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命令的示例.
标签:python,iteration,imaplib 来源: https://codeday.me/bug/20190729/1571175.html