Files
fn_registry/python/functions/infra/imap_delete_message.py
T
egutierrez 763e06c127 feat(browser): auto-commit con 178 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-20 18:22:23 +02:00

58 lines
2.6 KiB
Python

"""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("<mailbox>")` 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.")