""" Script para procesar correos específicos por ID desde un archivo JSON. No modifica el código existente del pipeline. """ import sys import os import json import argparse import requests from datetime import datetime, timedelta from dotenv import load_dotenv import database_utilities import logger_utilities from pipeline import _procesar_un_correo, step_authenticate # ============================================================================ # OBTENER CORREO POR ID # ============================================================================ def get_email_by_id(user_email: str, token: str, message_id: str) -> dict | None: """Obtiene un correo desde Microsoft Graph por su ID de mensaje.""" url = f"https://graph.microsoft.com/v1.0/users/{user_email}/messages/{message_id}" headers = {"Authorization": f"Bearer {token}"} resp = requests.get(url, headers=headers, verify=False) if resp.status_code != 200: print(f" ❌ Error al obtener mensaje {message_id}: HTTP {resp.status_code}") return None msg = resp.json() utc_str = msg.get("receivedDateTime", "") dt_utc = datetime.fromisoformat(utc_str.replace("Z", "+00:00")) dt_local = dt_utc - timedelta(hours=5) from_obj = msg.get("from", {}) sender = from_obj.get("emailAddress", {}).get("address", "Desconocido") return { "id": msg.get("id"), "fecha": dt_local.strftime("%Y-%m-%d %H:%M:%S"), "sender": sender, "subject": msg.get("subject", ""), "has_attach": msg.get("hasAttachments"), } # ============================================================================ # PIPELINE PARA IDS # ============================================================================ def run_pipeline_for_ids(ids: list[str]) -> None: load_dotenv(dotenv_path=".env.dev") email_addr = os.getenv("EMAIL", "") download_folder = os.getenv("DOWNLOAD_FOLDER", "adjuntos") output_folder = os.getenv("OUTPUT_FOLDER", "resultado") if not email_addr: print("❌ EMAIL no configurado en .env.dev") return database_utilities.init_db() token = step_authenticate() if not token: return for msg_id in ids: email = get_email_by_id(email_addr, token, msg_id.strip()) if not email: continue _procesar_un_correo(email, token, email_addr, download_folder, output_folder) # ============================================================================ # MAIN # ============================================================================ if __name__ == "__main__": parser = argparse.ArgumentParser( description="Procesar correos específicos por set de IDs desde tests/ids_prueba.json" ) parser.add_argument( "--set", "-s", required=True, help="Nombre del set en tests/ids_prueba.json" ) args = parser.parse_args() json_path = os.path.join(os.path.dirname(__file__), "test", "ids_prueba.json") if not os.path.exists(json_path): print(f"❌ No se encuentra {json_path}") sys.exit(1) with open(json_path) as f: sets = json.load(f) if args.set not in sets: print(f"❌ Set '{args.set}' no encontrado. Disponibles: {', '.join(sets.keys())}") sys.exit(1) ids = sets[args.set]["ids"] descripcion = sets[args.set].get("descripcion", "") print(f"\n📋 Set: {args.set} — {descripcion}") print(f" IDs a procesar: {len(ids)}") log_path = logger_utilities.setup_logger() logger_utilities.limpiar_logs_antiguos(dias=30) inicio = datetime.now() print("\n" + "=" * 60) print(f"🚀 INICIO DE EJECUCIÓN: {inicio.strftime('%Y-%m-%d %H:%M:%S')}") print(f"📄 Log guardado en: {log_path}") print("=" * 60) run_pipeline_for_ids(ids) fin = datetime.now() duracion = fin - inicio print("\n" + "=" * 60) print(f"🏁 FIN DE EJECUCIÓN: {fin.strftime('%Y-%m-%d %H:%M:%S')}") print(f"⏱️ Duración total: {str(duracion).split('.')[0]}") print("=" * 60)