import os import zipfile import database_utilities # ======================================================================== def filtrar_correos_nuevos(emails): """ Verifica cuáles correos son nuevos (no están en la BD), los guarda en la BD y retorna la lista completa de nuevos (con o sin adjuntos). Todos se registran en DB para no reprocesarlos en futuras ejecuciones. """ if not emails: return [] ids = [e['id'] for e in emails] existentes = database_utilities.get_existing_ids(ids) nuevos = [e for e in emails if e['id'] not in existentes] print(f"Correos nuevos detectados: {len(nuevos)}") if nuevos: print("Guardando nuevos correos en la base de datos...") database_utilities.save_emails(nuevos) return nuevos # ======================================================================== def descomprimir_adjuntos(archivos, ruta): """ Descomprime archivos .zip en la ruta especificada y actualiza la lista de archivos. Remueve el .zip original de la lista y añade los contenidos extraídos. """ 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 # ======================================================================== def filtrar_archivos_validos(archivos): """ Retorna una lista solo con archivos .pdf y .xml (ignora mayúsculas/minúsculas). """ extensiones_validas = ('.pdf', '.xml') return [a for a in archivos if a.lower().endswith(extensiones_validas)] # ======================================================================== def procesar_adjuntos_email(e, archivos, ruta_descarga): """ Descomprime y filtra los archivos de un correo. Retorna la lista de archivos válidos si existen, de lo contrario lista vacía. """ # 1. Descomprimir archivos ZIP si existen archivos_procesados = descomprimir_adjuntos(archivos, ruta_descarga) # 2. Filtrar solo PDF y XML archivos_validos = filtrar_archivos_validos(archivos_procesados) if archivos_validos: e['archivos'] = archivos_validos return archivos_validos return [] # ========================================================================