RFC 9051: IMAP4rev2
Por Qué Existe
IMAP4rev1 (RFC 3501, publicado en 2003) fue la base del correo multidispositivo durante casi dos décadas. Pero acumuló docenas de RFC de extensiones, casos límite ambiguos y características que cada servidor del mundo real implementó de manera diferente. RFC 9051 — IMAP4rev2 — es una revisión limpia que:
- Integra extensiones esenciales. Características como CONDSTORE (almacenamiento condicional), NAMESPACE, ESEARCH, LIST-EXTENDED, LITERAL- y MOVE ahora son parte del protocolo base en lugar de complementos opcionales.
-
Elimina características obsoletas. La antigua bandera
\Recentdesapareció. También lo hacen los comportamientos ambiguos en torno al acceso simultáneo a buzones. - Aclara la semántica de sincronización. Reglas precisas para UIDVALIDITY, MODSEQ y seguimiento de cambios hacen posible construir clientes confiables con capacidad sin conexión.
Si estás construyendo un nuevo cliente de correo o integración, apunta a IMAP4rev2. Si el servidor solo admite IMAP4rev1, el conjunto de comandos es casi idéntico — simplemente negocia las extensiones individualmente.
Cómo Funciona
Conexión y Autenticación
IMAP usa el puerto 143 (STARTTLS) o el puerto 993 (TLS implícito, recomendado). Después de conectarse, el cliente se autentica:
-- Conectar al puerto 993 (IMAPS) -- * OK [CAPABILITY IMAP4rev2 AUTH=PLAIN] servidor listo a1 LOGIN alice@example.com s3cretP@ss a1 OK [CAPABILITY IMAP4rev2 MOVE CONDSTORE] Sesión iniciada
Cada comando de cliente tiene el prefijo de una etiqueta (como a1). El servidor responde con la misma etiqueta, permitiendo comandos canalizados. Las respuestas sin etiqueta (con prefijo *) llevan datos como conteos de mensajes y listas de capacidades.
Seleccionar un Buzón
a2 SELECT INBOX * 42 EXISTS ← 42 mensajes en INBOX * OK [UIDVALIDITY 1609459200] ← época UID; si cambia, resincroniza * OK [UIDNEXT 1053] ← siguiente UID a asignar * OK [HIGHESTMODSEQ 7834] ← para sincronización incremental (CONDSTORE) * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) a2 OK [READ-WRITE] SELECT completado
Obtener Mensajes
-- Obtener envolvente y banderas para los mensajes 1:5 -- a3 FETCH 1:5 (FLAGS ENVELOPE) * 1 FETCH (FLAGS (\Seen) ENVELOPE ("Wed, 12 Mar 2025 ..." ...)) * 2 FETCH (FLAGS () ENVELOPE (...)) ... a3 OK FETCH completado -- Obtener cuerpo completo del mensaje UID 1050 -- a4 UID FETCH 1050 (BODY[]) * 41 FETCH (UID 1050 BODY[] {4523} (mensaje RFC 5322 completo...) ) a4 OK UID FETCH completado
Búsqueda del Lado del Servidor
a5 SEARCH UNSEEN FROM "bob@example.com" SINCE 1-Mar-2025 * SEARCH 38 41 42 a5 OK SEARCH completado
Detalles Técnicos Clave
UIDs y Números de Secuencia
Cada mensaje tiene dos identificadores: un número de secuencia (su posición en el buzón, que cambia cuando se eliminan mensajes) y un UID (un número asignado permanentemente que solo aumenta). Los clientes robustos siempre usan UIDs mediante UID FETCH, UID SEARCH, etc. El valor UIDVALIDITY le dice al cliente si sus UIDs en caché siguen siendo válidos; si cambia, el cliente debe resincronizarse desde cero.
Banderas
IMAP4rev2 define estas banderas del sistema:
| Bandera | Significado |
|---|---|
\Seen |
El mensaje ha sido leído |
\Answered |
Se ha respondido al mensaje |
\Flagged |
Marcado como importante / destacado |
\Deleted |
Marcado para eliminación (removido en EXPUNGE) |
\Draft |
El mensaje es un borrador |
La bandera \Recent de IMAP4rev1 se elimina en rev2. Los servidores también pueden admitir palabras clave personalizadas (por ejemplo, $Forwarded, $Junk).
CONDSTORE y QRESYNC
CONDSTORE asigna un valor MODSEQ a cada cambio de bandera. Un cliente que conoce el último MODSEQ que vio puede preguntar: "¿qué cambió desde MODSEQ 7834?" y obtener solo los cambios. QRESYNC (Quick Resynchronization) extiende esto para manejar mensajes expulsados eficientemente. Juntos, hacen que IMAP sea viable en redes móviles donde la resincronización completa es demasiado costosa.
Comando MOVE
En IMAP4rev1, mover un mensaje requería COPY + STORE \Deleted + EXPUNGE — tres comandos con condiciones de carrera. IMAP4rev2 incluye MOVE como una operación atómica nativa:
a6 UID MOVE 1050 "Archive" * OK [COPYUID 1609459200 1050 287] * 41 EXPUNGE a6 OK MOVE completado
Errores Comunes
- Usar números de secuencia para referencias persistentes. Los números de secuencia cambian cuando se eliminan mensajes. Siempre usa UIDs para cualquier cosa que guardes en caché o referencias entre sesiones.
- Ignorar cambios en UIDVALIDITY. Si UIDVALIDITY cambia entre sesiones, todos tus UIDs en caché no son válidos. Debes descartar tu caché local y resincronizar.
-
Hacer encuestas en lugar de usar IDLE. El comando
IDLEpermite al servidor enviar notificaciones de nuevos mensajes. Las encuestas cada 30 segundos desperdician ancho de banda y batería. Usa IDLE para actualizaciones en tiempo real. -
Obtener BODY[] cuando necesitas BODY.PEEK[].
FETCH BODY[]establece implícitamente la bandera\Seen. UsaBODY.PEEK[]para leer sin marcar como leído. - No admitir CONDSTORE. Sin CONDSTORE, cada reconexión requiere una resincronización completa del buzón. Los clientes IMAP modernos siempre deben negociar CONDSTORE.
- Ejecutar IMAP en el puerto 143 sin TLS. Usa el puerto 993 con TLS implícito según RFC 8314.
Impacto en la Entregabilidad
- IMAP es un protocolo de recuperación, no de envío. Como POP3, no afecta directamente la entregabilidad saliente. Determina cómo experimentan los destinatarios el correo que envías.
- Señales de compromiso basadas en banderas. Los principales proveedores (Gmail, Outlook) observan cambios de banderas IMAP — marcar mensajes como \Seen, mover a carpetas, destacar — como señales de compromiso. El compromiso positivo puede mejorar tu reputación de remitente con el tiempo.
- Interacción con carpeta de correo no deseado. Cuando un destinatario mueve tu mensaje fuera de Correo No Deseado mediante IMAP, el proveedor a menudo trata esto como una señal de "no es correo no deseado". Por el contrario, los movimientos IMAP a Correo No Deseado cuentan en tu contra.
- Procesamiento del buzón de devoluciones. IMAP es mejor que POP3 para el procesamiento de devoluciones porque puedes SEARCH para mensajes DSN del lado del servidor, procesarlos y MOVE a un archivo — todo sin descargar todos los mensajes.