gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:21:27 25 4
gpt4 key购买 nike

目标是使用 imaplib 删除一堆电子邮件。电子邮件文件夹每月接收大约 30 万封新邮件。仅应删除超过 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 倍的工作变体(我的服务器支持一次存储超过 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 分块为 block (比如 200 条消息)并多次调用 STORE。这仍然比每条消息调用 STORE 快得多。

如需进一步引用,请参阅 STORE Command RFC 3501 的部分。它显示了一个采用一系列消息 ID 的 STORE 命令的示例。

关于python - 在 python 中提高 IMAP 批量消息删除的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12556649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com