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 3d4dd08..08eaea7 100644 Binary files a/emails.db and b/emails.db differ 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__":