|
#!/usr/bin/env python3
# (c) 2017 Jesús Cea Avión - jcea@jcea.es
# This code is licensed under AGPLv3.
import sys, os, argparse
import time, locale
import datetime
import imapclient
imap = imapclient.IMAPClient('127.0.0.1', use_uid=True, timeout=60)
imap.login('X', 'X')
#busqueda = 'BODY.PEEK[HEADER.FIELDS (MESSSAGE-ID,DATE)]'
busqueda = 'BODY.PEEK[HEADER]'
b_busqueda = bytes(busqueda.replace('.PEEK', ''), 'utf-8')
folders = imap.list_folders()
for num, (_, _, folder) in enumerate(folders, 1):
print(f'Procesando la carpeta "{folder}" ({num}/{len(folders)}): ', end='')
sys.stdout.flush()
imap.select_folder(folder)
# XXX: El search es lento, parece que busca en todos los mensajes
# del buzón. Hacemos un primer filtro mirando la fecha del último
# mensaje del buzón, aunque podría no ser el más reciente si andamos
# copiando/moviendo/editando mensajes por ahí.
# https://stackoverflow.com/questions/19237407/i-want-to-get-last-message-uid-from-imap-inbox
cutpoint = datetime.datetime.now()-datetime.timedelta(days=7)
# "*" es el último mensaje.
last = imap.fetch('*', 'INTERNALDATE')
if last and (last.popitem()[1][b'INTERNALDATE'] > cutpoint):
# XXX: Deberíamos poder usar el "return (min)" de RFC4731, pero
# esta librería no lo soporta. De momento hago la petición y elijo
# el valor mínimo.
seq = imap.search(['since', cutpoint])
else:
seq = []
to_delete = []
num_msgs = 0
if seq:
start = min(seq)
reply = imap.fetch(f'{start}:*', busqueda)
already_seen = set()
for uid, values in reply.items():
num_msgs += 1
headers = values[b_busqueda]
if headers in already_seen:
to_delete.append(uid)
else:
already_seen.add(headers)
print(num_msgs, to_delete)
imap.add_flags(to_delete, r'\DELETED', silent=True)
imap.close_folder()
|