2026-10-14 22:28:48 -05:00
|
|
|
"""Descarga y filtrado de adjuntos de un correo."""
|
|
|
|
|
|
|
|
|
|
import os
|
2026-10-14 22:42:37 -05:00
|
|
|
import logging
|
2026-10-14 22:28:48 -05:00
|
|
|
|
|
|
|
|
import outlook_utilities
|
|
|
|
|
from pipeline_utils import log, ruta_carpeta
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
def descargar_adjuntos(email: dict, email_addr: str, token: str, download_folder: str) -> list[str] | None:
|
|
|
|
|
"""
|
|
|
|
|
Descarga todos los adjuntos del correo usando Microsoft Graph.
|
|
|
|
|
|
|
|
|
|
Almacena la lista de nombres de archivo en ``email["adjuntos"]``.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Lista de nombres de archivo descargados, o None si no hay adjuntos
|
|
|
|
|
o hubo un error.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
Si el correo tiene ``factura.xml`` y ``guia.pdf``::
|
|
|
|
|
|
|
|
|
|
adjuntos = descargar_adjuntos(email, email_addr, token, download_folder)
|
|
|
|
|
# → ["factura.xml", "guia.pdf"]
|
|
|
|
|
# email["adjuntos"] = ["factura.xml", "guia.pdf"]
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
adjuntos = outlook_utilities.download_attachments(
|
|
|
|
|
email_addr, email["id"], token, download_folder
|
|
|
|
|
)
|
|
|
|
|
if adjuntos:
|
|
|
|
|
email["adjuntos"] = adjuntos
|
|
|
|
|
return adjuntos
|
|
|
|
|
return None
|
|
|
|
|
except Exception as ex:
|
2026-10-14 22:42:37 -05:00
|
|
|
log(f"❌ Error descargando adjuntos: {ex}", severity=logging.ERROR)
|
2026-10-14 22:28:48 -05:00
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ============================================================================
|
|
|
|
|
def filtrar_y_limpiar(email: dict, download_folder: str) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
Filtra los adjuntos conservando solo archivos PDF y XML.
|
|
|
|
|
|
|
|
|
|
- Los archivos que no son PDF ni XML se eliminan del disco.
|
|
|
|
|
- Si no queda ningún PDF/XML válido, se eliminan todos los archivos
|
|
|
|
|
descargados y se retorna False.
|
|
|
|
|
- Actualiza ``email["adjuntos"]`` con la lista filtrada.
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
True si hay al menos un PDF o XML, False si no queda ninguno.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
Adjuntos originales: ``[img.png, factura.xml, guia.pdf]``::
|
|
|
|
|
|
|
|
|
|
ok = filtrar_y_limpiar(email, download_folder)
|
|
|
|
|
# → img.png eliminado
|
|
|
|
|
# → ok = True
|
|
|
|
|
# → email["adjuntos"] = ["factura.xml", "guia.pdf"]
|
|
|
|
|
"""
|
|
|
|
|
todos = email.get("adjuntos", [])
|
|
|
|
|
validos = [a for a in todos if a.lower().endswith((".pdf", ".xml"))]
|
|
|
|
|
no_validos = [a for a in todos if a not in validos]
|
|
|
|
|
|
|
|
|
|
carpeta = ruta_carpeta(download_folder)
|
|
|
|
|
|
|
|
|
|
if not validos:
|
|
|
|
|
for a in todos:
|
|
|
|
|
ruta = os.path.join(carpeta, a)
|
|
|
|
|
if os.path.exists(ruta):
|
|
|
|
|
os.remove(ruta)
|
|
|
|
|
log("🗑️ Correo sin PDF/XML válidos, adjuntos eliminados")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
for a in no_validos:
|
|
|
|
|
ruta = os.path.join(carpeta, a)
|
|
|
|
|
if os.path.exists(ruta):
|
|
|
|
|
os.remove(ruta)
|
|
|
|
|
|
|
|
|
|
email["adjuntos"] = validos
|
|
|
|
|
return True
|