El Internet Message Access Protocol mantiene los buzones de correo sincronizados entre múltiples dispositivos, permitiendo que cada cambio (lectura, eliminación, banderas) se refleje inmediatamente en el servidor y en el resto de clientes conectados.
IMAP delega el almacenamiento principal al servidor y ofrece acceso selectivo al contenido, lo cual resulta ideal para usuarios que alternan entre computadoras, teléfonos y aplicaciones web.
IMAP mantiene la sesión abierta y permite que el servidor notifique eventos nuevos gracias a extensiones como IDLE. De esta forma los clientes pueden mostrar correos entrantes sin necesidad de consultas periódicas costosas, reduciendo el consumo de ancho de banda y de batería en dispositivos móviles.
El modelo sin estado de POP3 se reemplaza por uno persistente: el servidor conserva la versión canónica del buzón mientras cada cliente sincroniza solo lo que necesita.
IMAP organiza la información en carpetas (Inbox, Enviados, Archivados, etc.) y banderas (Seen, Answered, Flagged, Draft). Las operaciones más comunes incluyen:
SELECT o EXAMINE cargan los metadatos necesarios para operar.SEARCH utiliza filtros por remitente, fecha o banderas sin descargar el contenido completo.STORE agrega o quita indicadores como \Seen o \Flagged.COPY y UID MOVE reubican mensajes entre carpetas conservando identificadores.Gracias a los identificadores únicos (UID), los clientes identifican cambios incrementales y evitan duplicados incluso cuando la sesión se interrumpe.
IMAP usa conexiones persistentes sobre TCP, con dos puertos estandarizados:
| Puerto | Modo | Notas |
|---|---|---|
| 143/TCP | IMAP sin cifrar + STARTTLS opcional. | Recomendado solo en redes internas; se debe forzar STARTTLS antes de autenticar. |
| 993/TCP | IMAPS con TLS implícito. | Preferido en Internet y servicios de terceros. |
Los certificados válidos y el soporte de TLS moderno (1.2 o 1.3) son imprescindibles para proteger credenciales y contenido sensible.
La sintaxis IMAP incluye un tag para cada comando, lo que facilita correlacionar respuestas asíncronas. Entre los comandos básicos se destacan:
Las respuestas pueden ser OK, NO o BAD y a menudo incluyen datos intermedios (*) con resultados parciales antes de cierre del comando.
Utilizando openssl s_client es posible verificar el servicio en el puerto 993/TCP:
openssl s_client -connect imap.ejemplo.com:993
a1 LOGIN laboratorio ClaveSecreta!
a2 LIST "" "*"
* LIST (\HasNoChildren) "/" "INBOX"
* LIST (\HasChildren) "/" "Proyectos"
a2 OK LIST completed
a3 SELECT INBOX
* 12 EXISTS
* 2 RECENT
a3 OK [READ-WRITE] SELECT completed
a4 FETCH 12 BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)]
* 12 FETCH (BODY[HEADER.FIELDS (SUBJECT FROM)] {58}
Subject: Informe semanal
From: direccion@empresa.com
)
a4 OK FETCH completed
a5 LOGOUT
* BYE imap.ejemplo.com logging out
a5 OK LOGOUT completed
El ejercicio confirma autenticación, disponibilidad de carpetas y recuperación parcial de datos sin descargar todo el mensaje.
Podemos combinar Test-NetConnection con una conexión TCP y SslStream para validar certificados y enviar comandos básicos:
Test-NetConnection -ComputerName imap.ejemplo.com -Port 993
$client = New-Object System.Net.Sockets.TcpClient("imap.ejemplo.com", 993)
$ssl = New-Object System.Net.Security.SslStream($client.GetStream(), $false,
({ $true }))
$ssl.AuthenticateAsClient("imap.ejemplo.com")
$writer = New-Object System.IO.StreamWriter($ssl)
$reader = New-Object System.IO.StreamReader($ssl)
$writer.WriteLine("a1 CAPABILITY")
$writer.Flush()
Write-Output ($reader.ReadLine())
$client.Close()
El código verifica la apertura del puerto, establece TLS e imprime la respuesta al comando CAPABILITY, lo que ayuda a confirmar si el servidor soporta IDLE, STARTTLS, OAuth u otras extensiones.
La biblioteca imaplib de Python permite scriptar tareas como la descarga de encabezados o la clasificación automática de correos:
import imaplib
host = "imap.ejemplo.com"
usuario = "laboratorio"
clave = "ClaveSecreta!"
with imaplib.IMAP4_SSL(host) as imap:
imap.login(usuario, clave)
imap.select("INBOX")
estado, ids = imap.search(None, "UNSEEN")
for num in ids[0].split():
estado, datos = imap.fetch(num, "(BODY.PEEK[HEADER.FIELDS (SUBJECT FROM)])")
print(datos[0][1].decode().strip())
imap.logout()
Las consultas por banderas aprovechan el trabajo del servidor, por lo que la automatización es eficiente incluso con buzones grandes.
Para ofrecer IMAP confiable se recomienda habilitar TLS obligatorio, limitar conexiones por usuario, activar IDLE solo donde sea necesario, aplicar cuotas de almacenamiento y monitorear las carpetas especiales (Spam, Papelera) para evitar crecimiento descontrolado. También conviene combinarlo con autenticación moderna (OAuth 2.0 o certificados de cliente) y registrar eventos para auditorías.
Gracias a estas estrategias, IMAP se mantiene como el protocolo preferido para sincronizar correos en escenarios corporativos y personales donde se requiere acceso simultáneo desde cualquier dispositivo.