目標は、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)))