From 937c4d6260bcc35c2a64ece0ce0ebbafa0789104 Mon Sep 17 00:00:00 2001 From: George Date: Mon, 1 Jun 2026 18:05:44 -0500 Subject: [PATCH] se termina la descarga de los adjuntos y solo se deja los mails con adjuntos pdf y xml --- database_utilities.py | 1 - email_utilities.py | 51 +++++++++++++++++++++++++++--------------- emails.db | Bin 12288 -> 12288 bytes main.py | 47 ++++++++++++++++++++++++++++---------- 4 files changed, 68 insertions(+), 31 deletions(-) diff --git a/database_utilities.py b/database_utilities.py index 14180e7..7d10c44 100644 --- a/database_utilities.py +++ b/database_utilities.py @@ -107,5 +107,4 @@ def delete_email_by_id(email_id): conn.close() return rows_affected > 0 - ######################################################## \ No newline at end of file diff --git a/email_utilities.py b/email_utilities.py index 96a64e2..a05fafa 100644 --- a/email_utilities.py +++ b/email_utilities.py @@ -28,26 +28,41 @@ def quitar_correos_ya_registrados_en_base_de_datos(emails): ######################################################## def descomprimir_adjuntos(emails, ruta): """ - Esta funcion recibe la lista de emails y por cada no recorre sus adjuntos - si encuentra un adjunto .zip lo descomprime en la ruta especificada - y actualiza la lista de archivos agregar estos nuevos documentos al lsitado de adjuntos del email + Busca adjuntos ZIP, los descomprime y agrega los archivos + extraídos a la lista de adjuntos del correo. """ - archivos_finales = [] - for archivo in archivos: - ruta_archivo = os.path.join(ruta, archivo) - if archivo.lower().endswith('.zip') and os.path.exists(ruta_archivo): - try: - with zipfile.ZipFile(ruta_archivo, 'r') as zip_ref: - nombres_extraidos = zip_ref.namelist() - zip_ref.extractall(ruta) - archivos_finales.extend(nombres_extraidos) - except Exception as e: - print(f" ⚠️ Error descomprimiendo {archivo}: {e}") - archivos_finales.append(archivo) - else: - archivos_finales.append(archivo) - return archivos_finales + try: + for email in emails: + nuevos_adjuntos = [] + for adjunto in list(email["adjuntos"]): + if not adjunto.lower().endswith(".zip"): + continue + ruta_zip = os.path.join(ruta, adjunto) + if not os.path.exists(ruta_zip): + print(f"⚠️ No existe: {ruta_zip}") + continue + try: + with zipfile.ZipFile(ruta_zip, "r") as zip_ref: + nombres_extraidos = [ + nombre + for nombre in zip_ref.namelist() + if not nombre.endswith("/") + ] + zip_ref.extractall(ruta) + nuevos_adjuntos.extend(nombres_extraidos) + print( + f"📦 {adjunto}: {len(nombres_extraidos)} archivos extraídos" + ) + + except Exception as e: + print(f"⚠️ Error descomprimiendo {adjunto}: {e}") + email["adjuntos"].extend(nuevos_adjuntos) + return emails + except Exception as ex: + print(f"❌ Error general: {ex}") + return emails + ######################################################## def filtrar_archivos_validos(archivos): diff --git a/emails.db b/emails.db index 3d4dd0895b9beea892b86bda4d4654ffe71047fe..08eaea7b9c53a6650aa236a4b16cfc1b2d32f5a9 100644 GIT binary patch literal 12288 zcmeI0?@!u57{?1LQ>SRMEXHI@&de8EHcTm2g~ZH)CqpSJ)Tz87M_Z-XAKDfbmc77b zulBd>#r_6g?%y!`8}@S7q6{O>WUrd|JmDzUyW{Trd7itbPiZ@^xhguaY=gKc!Avrt z5VL|1!!Ti5257ml5dATDQ=wO{{*Z;4xzlgs6Tg{o^oogIP5gXl0JH-EAOHk_01yBI zKmZ5;0U!VbfB+EqUjl6<^kiy!I`rk0ORBo68bs5b&UZLd#Dav8B&72gb?%|pqo~I; z1xa{MLR-b0C=~b62Ht;ntHXgR*NETe_I*b+71i$7(5Ti`+3nL(BTj|5E|F^}SCDWP z7jOTiKUGCh9humNojJQpdGj_LnR-7RVl+DKxpSh^_xcKHxRzh9bhK6CovZg=KkV@w zrzJ8v%Sh#vB?&s@}{)DfKM}LtnqPaw=)Ebf^c7ZFU%(!*bAi!_+L~4eJ>iUrh1ysrkkBry*Z( zX(Wh(t-pf#Sb_>(@&t1WcLlFrekVw5n2JVpq^L+I=!15ssix}H3}RYNKlQCaU;TFA z+`V+T7ti&o=aQbgxkQRj-c?`HjD}8R+d?&~iD*|}bJIdG6lW1JW@h?{KO6AHZv@Wu zJm0jvEpZ*|e2n9-T_5NFCB8sp%`#~K#CjO?Q|^R)<(a^_{Zy{5O1;Y2B=um5=TmIr zuJSci*IG#NLcbI8B2jGh-mU&QO JVgLd-7XVaA5@P@W diff --git a/main.py b/main.py index cda4404..24dc9ac 100644 --- a/main.py +++ b/main.py @@ -42,7 +42,7 @@ def descargar_correos(outlook_token, fecha_inicio, fecha_fin): ######################################################## def descargar_adjuntos_de_correos(outlook_token, emails, ruta_descarga): try: - + emails_con_adjuntos = [] for email in emails: # Guardar lista original para el log adjuntos = outlook_utilities.download_attachments( @@ -51,15 +51,31 @@ def descargar_adjuntos_de_correos(outlook_token, emails, ruta_descarga): outlook_token, ruta_descarga) if adjuntos: - email['adjuntos'] = adjuntos + email['adjuntos'] = adjuntos + emails_con_adjuntos.append(email) - return emails + return emails_con_adjuntos except Exception as ex: print(f" ❌ Error procesando {email['id'][:10]}: {ex}") return [] +######################################################## +def dejar_mail_si_tiene_adjunto_pdf_o_xml(emails): + """ + Recorre los adjuntos de cada email y elimina los que no tengan extensión pdf o xml + actualiza la lista de adjuntos del correo + si el mail no tiene pdf ni xml también se elimina + """ + emails_con_pdf_o_xml = [] + for email in emails: + adjuntos_validos = [adjunto for adjunto in email['adjuntos'] if adjunto.lower().endswith(('.pdf', '.xml'))] + if adjuntos_validos: + email['adjuntos'] = adjuntos_validos + emails_con_pdf_o_xml.append(email) + return emails_con_pdf_o_xml + ######################################################## def main(): @@ -83,27 +99,34 @@ def main(): # se verifica si estos correos ya estan en la base de datos # si ya esta registrado, se quita del listado # si no esta se inserta en la base de datos - emails = email_utilities.quitar_correos_ya_registrados_en_base_de_datos(emails) - # descargar todos los adjuntos de cada mail - + # descargar adjuntos de cada correo y agregar + emails = descargar_adjuntos_de_correos(outlook_token, emails, CONFIG.client.ruta_descarga) + # with open("correos_con_adjuntos.json", "w", encoding="utf-8") as f: + # json.dump(emails, f, ensure_ascii=False, indent=4) # si el correo tiene archivos zip, se descomprimen y se agregan a # la lista de archivos adjuntos + emails = email_utilities.descomprimir_adjuntos(emails, CONFIG.client.ruta_descarga) + + # se eliminan mails que no tengan adjunto pdf o xml + # también se eliminar los adjuntos no que sean xml y pdf + emails = dejar_mail_si_tiene_adjunto_pdf_o_xml(emails) - - # se evalua los adjuntos del correo: - # 1. se quita de la lista el correo si no tiene adjunto - # 2. se quita de la lista el correo si no tiene for e in emails: print(f"\n📬 [{e['fecha']}] {e['subject'][:80]}...") - archivos_adjuntos = descargar_adjunto_de_correo(outlook_token, e['id'], CONFIG.client.ruta_descarga) - + + #adjuntos originales + print(f" ├── 📂 Adjuntos originales:") + for idx, a in enumerate(e['adjuntos']): + prefijo = " │ └── " if idx == len(e['adjuntos'])-1 else " │ ├── " + print(f"{prefijo}{a}") + ######################################################## if __name__ == "__main__":