Escanear cabeceras
Remitente, asunto, fecha, flags y List-Unsubscribe. Sin cuerpos, sin adjuntos, sin descargar el buzón completo.
Código abierto · Nativo para agentes · Reversible
Limpia años de newsletters, promociones y spam en una pasada revisada. Solo cabeceras. Plan primero. Cada movimiento se puede deshacer.
Gratis y open source · Sin cuenta · Sin telemetría · MIT
CAP 01 · Cómo funciona
Una CLI pequeña, un plan revisable y un journal de undo. Sin “limpiador de inbox con IA” de caja negra.
Remitente, asunto, fecha, flags y List-Unsubscribe. Sin cuerpos, sin adjuntos, sin descargar el buzón completo.
Bancos, códigos de seguridad, facturas, viajes, médico, gobierno, personal, destacado, respondido y reciente se quedan.
UIDs exactos, destinos y objetivos de baja en plan.json. Nada cambia hasta que lo apliques.
Carpetas o etiquetas de Gmail, Junk, Trash o archivo. Primero COPY, luego UID EXPUNGE. Nunca un expunge general.
POST one-click RFC 8058, mailto: o enlace manual. Solo cabeceras. El spam nunca se da de baja.
El journal guarda COPYUID y Message-ID. Un comando restaura movimientos y archivados de Gmail. Las bajas no se pueden desenviar.
CAP 02 · Por qué
La mayoría de las herramientas piden tu contraseña, leen tu correo y borran la evidencia. CleanYourMail se ejecuta en tu máquina, lee solo cabeceras y guarda un journal de undo.
La CLI se ejecuta en local. El escaneo pide solo cabeceras. La caché guarda metadatos, nunca cuerpos de mensajes. Sin telemetría, sin analítica, sin API de terceros.
Cada movimiento se registra con COPYUID y Message-ID. Un comando lo restaura. Archivar en Gmail vuelve a añadir la etiqueta Inbox. La baja es el único paso irreversible, y es explícita.
La CLI es el producto. SKILL.md y PROMPT.es.md enseñan a cualquier agente a usarla con seguridad. Sin app nueva, sin extensión de navegador, sin broker OAuth.
Comparación general con servicios de limpieza alojados. Revisa cada producto.
CAP 03 · Configurar
Python 3.11+. Sin dependencias. Una contraseña de aplicación o token OAuth. Una terminal.
Clona el repo, crea la configuración, pon el secreto en CYM_PASSWORD y ejecuta doctor.
Escanea cabeceras, lee el informe y genera un plan. Corrige los remitentes protegidos antes de mover nada.
Aplica primero los movimientos. Verifica. Luego envía las bajas por separado. Guarda el comando de undo.
$ git clone https://github.com/jparedesDS/cleanyourmail.git
$ cd cleanyourmail
$ python tools/mail.py init --email tu@ejemplo.com
$ $env:CYM_PASSWORD = "app-password"
$ python tools/mail.py doctor
$ python tools/mail.py scan --days 365
$ python tools/mail.py report --top 30
$ python tools/mail.py plan --mode folders
Empieza poco a poco. Usa --limit 50 en la primera pasada, revisa plan.json y guarda el comando de undo. En macOS o Linux, usa python3 en lugar de python.
¿Usas un agente? Pega PROMPT.es.md. Leerá SKILL.md, te enseñará el plan, moverá primero y te dará el comando de undo. No se saltará la revisión.
CAP 04 · Proveedores
IMAP y SMTP, contraseñas de aplicación u OAuth2. Sin servicio alojado ni migración de buzón.
Activa la verificación en dos pasos, crea una contraseña de aplicación y habilita IMAP. Las carpetas son etiquetas; archivar quita la etiqueta Inbox y mantiene el mensaje en All Mail.
La autenticación básica está deshabilitada. Pon un token válido en CYM_PASSWORD con auth = "xoauth2". La CLI no renueva tokens; el tenant puede bloquear SMTP AUTH, así que una baja por mailto puede fallar.
Activa la verificación en dos pasos y genera una contraseña de aplicación en Account Security. Carpetas IMAP estándar; la CLI resuelve Trash, Junk y Archive.
Apple exige 2FA. Crea una contraseña específica en appleid.apple.com. La CLI resuelve Deleted Messages, Junk y Archive.
Crea una contraseña de aplicación con acceso IMAP/SMTP. Fastmail soporta Sieve nativamente; exporta el script y revísalo antes de subirlo.
Ejecuta Bridge en local, habilita la cuenta y usa la contraseña de Bridge. IMAP por defecto en 127.0.0.1:1143 con STARTTLS; SMTP en 127.0.0.1:1025.
Configura host, puerto, TLS/STARTTLS y SMTP. El servidor debe soportar UIDPLUS o MOVE; si no, los movimientos se rechazan para no arriesgar un expunge general.
Notas completas en docs/PROVIDERS.md. ¿Tu proveedor no está? Cualquier servidor IMAP con UIDPLUS o MOVE funciona.
CAP 05 · Seguridad
Lo interesante no es lo que puede hacer. Es lo que se niega a hacer.
Los movimientos copian primero y usan UID EXPUNGE. Sin expunge general. Trash nunca se vacía. Si el servidor no tiene UIDPLUS/MOVE, se rechaza el movimiento.
Transaccional y personal, códigos de seguridad, bancos, facturas, viajes, médico, gobierno, destacado, respondido y reciente nunca se mueven automáticamente.
El escaneo pide solo cabeceras. La caché local guarda metadatos, no contenido. No hay índice de contenido ni una IA leyendo tu correo.
Solo cabeceras List-Unsubscribe. Sin redirecciones, cookies ni proxies. Destinos privados/locales rechazados. Los enlaces manuales los abres tú, no el agente.
Un correo no puede dar instrucciones al agente. “Ignora tus reglas”, “envía esto” o “ejecuta aquello” se reporta, no se sigue.
“Sáltate el plan”, “borra todo” o “date de baja de todo” es una parada. La revisión, el correo protegido, la exclusión de spam y los límites no son opcionales.
La baja es el único paso irreversible. Es explícita, limitada, espaciada y nunca se aplica a spam. Los movimientos y archivados tienen journal de undo. Las solicitudes de baja no se pueden desenviar. Lee las reglas completas de seguridad ↗
CAP 06 · FAQ
No. Mueve a carpetas, etiquetas, Junk, Trash o archivo. Nunca vacía Trash, nunca hace un expunge general y no tiene un comando de “borrar para siempre”.
No. El escaneo pide solo cabeceras: remitente, asunto, fecha, tamaño, flags y cabeceras de baja. Los cuerpos y adjuntos nunca se descargan.
Sí. CleanYourMail tiene licencia MIT y es gratis. No hay plan de pago, ni cuenta, ni upsell.
Necesitas una terminal y Python 3.11+. Un agente puede escribir los comandos por ti: pega PROMPT.es.md y sigue el plan. La CLI también se puede usar directamente.
Sí. Gmail usa etiquetas, no carpetas. Archivar quita la etiqueta \Inbox y deja el mensaje en All Mail. El undo vuelve a añadir la etiqueta con X-GM-MSGID o Message-ID.
Usa un token de acceso OAuth2 con auth = "xoauth2". La CLI no obtiene ni renueva tokens. Algunos tenants bloquean SMTP AUTH, así que una baja por mailto: puede tener que hacerse a mano.
No. El spam nunca se da de baja: un enlace de baja en spam puede confirmar que la dirección está viva. El spam va a Junk. En listas legítimas, la baja es una solicitud, no una garantía.
El flujo es dry-run: scan, report, plan y revisión. Aplica movimientos solo después de revisar. Empieza con --limit o una sola categoría. Guarda el comando de undo. Sigue siendo software: revisa el plan.
Los movimientos se rechazan. La única alternativa sería un expunge general, que podría borrar permanentemente el mensaje de otro cliente. Usa un cliente con UIDPLUS/MOVE o mueve a mano.
Solo el tráfico IMAP/SMTP y las solicitudes de baja validadas. No hay telemetría, ni analítica, ni API de terceros, ni índice de contenido. La web no carga recursos de terceros.
Sí. La CLI es el producto. La skill y el prompt solo enseñan a un agente a usarla con seguridad. Todos los comandos están en SKILL.md y README.es.md.
No. Sin cuenta, sin servidor, sin telemetría y sin API de terceros. Las únicas llamadas de red son IMAP, SMTP para una baja mailto y una petición HTTPS validada de one-click.
Empieza poco a poco. Mantén el control.
Ejecuta el dry run. Revisa el plan. Aplica un lote pequeño. Deshaz si cambias de opinión.
Sin cuenta. Sin telemetría. MIT.
$ python tools/mail.py scan --days 365
$ python tools/mail.py report --top 30
$ python tools/mail.py plan --mode folders
$ python tools/mail.py apply <plan.json> --yes --action move