763e06c127
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
58 lines
2.6 KiB
Python
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.")
|