"""Marca un mensaje IMAP como borrado (\\Deleted) por UID y opcionalmente expurga. Funcion IMPURA: anade la bandera del sistema `\\Deleted` al mensaje identificado por su UID en el mailbox seleccionado de una conexion `imaplib.IMAP4_SSL` ya autenticada y, si `expunge=True`, ejecuta EXPUNGE para materializar el borrado de todos los mensajes marcados \\Deleted del mailbox. OJO Gmail: marcar \\Deleted NO borra el mensaje, solo le quita la etiqueta de la carpeta actual; para un borrado real en Gmail hay que MOVER a "[Gmail]/Trash" (ver imap_move_message). Esta funcion es el borrado IMAP estandar, util en servidores no-Gmail (Dovecot, etc.) donde \\Deleted + EXPUNGE si borra. Nunca lanza: devuelve un dict con `status` ("ok"/"error"). No abre la conexion ni resuelve credenciales: el caller pasa `conn` ya conectado, autenticado y con `conn.select("")` hecho. """ def imap_delete_message(conn, uid: int, expunge: bool = True) -> dict: """Marca como borrado el mensaje `uid` y opcionalmente expurga el mailbox. Ejecuta ``conn.uid("STORE", str(uid), "+FLAGS", "(\\Deleted)")`` y, si ``expunge=True``, ``conn.expunge()``. La operacion es por UID, no por numero de secuencia. Args: conn: objeto ``imaplib.IMAP4_SSL`` (o ``IMAP4``) YA conectado, autenticado y con un mailbox seleccionado (``conn.select(...)``). uid: UID del mensaje dentro del mailbox seleccionado. Estable mientras no cambie la UIDVALIDITY del mailbox. expunge: ``True`` (default) ejecuta EXPUNGE tras marcar \\Deleted, lo que elimina del mailbox TODOS los mensajes marcados \\Deleted (no solo este). ``False`` deja el mensaje solo marcado \\Deleted, sin expurgar: el borrado se materializa en un EXPUNGE posterior o al cerrar el mailbox. Returns: dict. En exito: ``{"status": "ok", "uid": uid, "expunged": expunge}``. En fallo (sin lanzar): ``{"status": "error", "error": str}``. Tambien error si el STORE responde algo distinto de ``OK``. """ try: typ, data = conn.uid("STORE", str(uid), "+FLAGS", "(\\Deleted)") if typ != "OK": return { "status": "error", "error": f"imap_delete_message: STORE \\Deleted devolvio {typ!r}: {data!r}", } if expunge: conn.expunge() return {"status": "ok", "uid": uid, "expunged": expunge} except Exception as e: # noqa: BLE001 return {"status": "error", "error": str(e)} if __name__ == "__main__": print("imap_delete_message: importable. Uso real requiere un conn IMAP autenticado.")