Cuando un servidor de correo falla, el síntoma ("no llegan los correos", "Outlook no conecta") rara vez apunta directamente a la causa. La forma más rápida de encontrarla es recorrer el camino del mensaje por orden: servicios, DNS, red, SMTP, autenticación, IMAP y, por último, la cola y los registros. En este tutorial aprenderás a probar cada una de esas piezas en un servidor con Postfix y Dovecot sobre Ubuntu 24.04, con comandos que muestran exactamente dónde se rompe la cadena y qué significa cada error habitual.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS, Postfix y Dovecot instalados, por ejemplo un VPS de CubePath, con el nombre
mail.your_domainresolviendo a su IP. - Un usuario no root con privilegios
sudo. - Una cuenta de correo en el servidor para las pruebas, en los ejemplos
user@your_domain. - Un segundo equipo fuera del servidor (tu ordenador u otro servidor) para las pruebas desde el exterior.
Instala las herramientas de diagnóstico en el servidor y, si puedes, también en el equipo externo:
sudo apt install swaks dnsutils netcat-openbsd
swaks envía mensajes por SMTP mostrando toda la conversación, dnsutils aporta dig y netcat-openbsd permite comprobar puertos.
Cómo viaja un mensaje
Tener el recorrido claro te dice qué probar según el síntoma:
- Envío desde un cliente: el cliente se autentica en Postfix por el puerto 587 (o 465). Postfix valida la contraseña contra Dovecot, pone el mensaje en la cola y lo entrega al servidor MX del destinatario por el puerto 25.
- Recepción: el servidor del remitente busca el registro MX de
your_domain, se conecta al puerto 25 de tu servidor y Postfix entrega el mensaje en el buzón, directamente o a través de Dovecot. - Lectura: el cliente se conecta a Dovecot por IMAP (puerto 993) y descarga los mensajes.
Si no se envía nada, céntrate en los pasos 3, 5 y 7. Si no se recibe, en los pasos 2, 4 y 7. Si el cliente no conecta, en los pasos 5 y 6.
Paso 1: Comprobar servicios, puertos y configuración
Empieza por lo básico: que los servicios estén en marcha y escuchando en los puertos esperados.
systemctl is-active postfix dovecot
active
active
Comprueba qué puertos están abiertos:
sudo ss -tlnp | grep -E ':(25|465|587|993)\s'
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=1203,fd=13))
LISTEN 0 100 0.0.0.0:587 0.0.0.0:* users:(("master",pid=1203,fd=17))
LISTEN 0 100 0.0.0.0:993 0.0.0.0:* users:(("dovecot",pid=987,fd=38))
master es el proceso principal de Postfix. Si falta el 587, el servicio submission no está activado en /etc/postfix/master.cf.
Valida la configuración de ambos servicios. postfix check no imprime nada si todo es correcto, y doveconf -n muestra la configuración efectiva de Dovecot o el error de sintaxis que impide cargarla:
sudo postfix check
sudo doveconf -n | head -n 20
Por último, confirma que el firewall permite los puertos:
sudo ufw status
Si faltan reglas, añádelas:
sudo ufw allow 25,587,993/tcp
Paso 2: Revisar los registros DNS
Un error de DNS impide recibir correo o hace que el enviado se rechace. Comprueba cada registro consultando a un resolvedor público, que es lo que ven los demás servidores:
dig +short MX your_domain @1.1.1.1
dig +short A mail.your_domain @1.1.1.1
dig +short -x your_server_ip @1.1.1.1
10 mail.your_domain.
203.0.113.10
mail.your_domain.
El MX debe apuntar a un nombre (no a una IP), ese nombre debe resolver a la IP del servidor y el PTR de la IP debe devolver el mismo nombre. Comprueba también los registros de autenticación. Sustituye mail por el selector DKIM que uses:
dig +short TXT your_domain @1.1.1.1
dig +short TXT mail._domainkey.your_domain @1.1.1.1
dig +short TXT _dmarc.your_domain @1.1.1.1
Debes ver un registro que empiece por v=spf1, uno con v=DKIM1; k=rsa; p=... y uno con v=DMARC1. Si alguno no aparece, el correo saliente tiene muchas posibilidades de acabar en spam o de ser rechazado.
Paso 3: Comprobar la salida por el puerto 25
Para entregar correo a otros dominios, el servidor necesita conectarse al puerto 25 de los servidores de destino. Muchos proveedores lo bloquean por defecto. Prueba una conexión al servidor de Gmail:
nc -vz -w 5 gmail-smtp-in.l.google.com 25
Connection to gmail-smtp-in.l.google.com (142.250.153.27) 25 port [tcp/smtp] succeeded!
Si el comando termina con timed out, la salida por el puerto 25 está bloqueada en la red, no en tu configuración. En CubePath, como en la mayoría de proveedores, el puerto 25 de salida está cerrado por defecto y se abre mediante una solicitud al soporte. Mientras tanto, Postfix dejará los mensajes en la cola con el estado deferred.
Paso 4: Probar la recepción desde el exterior
Desde el equipo externo, envía un mensaje a tu buzón conectando directamente con tu servidor, igual que haría cualquier servidor de correo de Internet:
swaks --to user@your_domain --server mail.your_domain --port 25
swaks muestra la conversación completa: -> son los comandos enviados y <- las respuestas del servidor. Las líneas importantes son el saludo inicial y la aceptación del mensaje:
<- 220 mail.your_domain ESMTP Postfix (Ubuntu)
...
<- 250 2.0.0 Ok: queued as 4F2A1C0B7E
Si la conexión no se establece, el problema está antes de Postfix: el firewall, el puerto 25 cerrado a la entrada o el registro A. Si el servidor responde con un código 4xx o 5xx, el texto de la respuesta explica el motivo; los más habituales están en el paso 8.
Notamuchas redes domésticas y de oficina bloquean el puerto 25 de salida. Si la prueba falla desde tu ordenador, repítela desde otro servidor antes de sacar conclusiones.
Paso 5: Probar el envío autenticado
Los clientes de correo envían por el puerto 587 con STARTTLS y usuario y contraseña. Reproduce exactamente eso desde el equipo externo; swaks te pedirá la contraseña:
swaks --to [email protected] --from user@your_domain --server mail.your_domain --port 587 --tls --auth LOGIN --auth-user user@your_domain
<- 220 2.0.0 Ready to start TLS
...
<- 235 2.7.0 Authentication successful
...
<- 250 2.0.0 Ok: queued as 7C3D9E0A21
Si falla la autenticación (535 5.7.8 Error: authentication failed), comprueba la contraseña directamente contra Dovecot en el servidor. Así sabrás si el problema está en las credenciales o en la conexión entre Postfix y Dovecot:
sudo doveadm auth test user@your_domain
Password:
passdb: user@your_domain auth succeeded
extra fields:
user=user@your_domain
Si doveadm acepta la contraseña pero swaks no, Postfix no está hablando con el socket de autenticación de Dovecot (revisa smtpd_sasl_type = dovecot y smtpd_sasl_path = private/auth con postconf smtpd_sasl_type smtpd_sasl_path).
Comprueba también el certificado que presenta el puerto 587 y su fecha de caducidad:
openssl s_client -starttls smtp -connect mail.your_domain:587 -servername mail.your_domain </dev/null 2>/dev/null | openssl x509 -noout -subject -enddate
subject=CN = mail.your_domain
notAfter=Dec 24 10:15:02 2026 GMT
Un certificado caducado o emitido para otro nombre hace que la mayoría de clientes se nieguen a enviar.
Paso 6: Probar el acceso IMAP
Conéctate a Dovecot por IMAP sobre TLS e inicia sesión a mano. Los comandos IMAP llevan una etiqueta delante (a, b, c):
openssl s_client -connect mail.your_domain:993 -servername mail.your_domain -quiet
Cuando veas * OK [CAPABILITY ...] Dovecot ready., escribe estos comandos uno a uno, sustituyendo la contraseña:
a LOGIN user@your_domain your_password
b SELECT INBOX
c LOGOUT
Las respuestas esperadas son a OK ... Logged in y, tras SELECT, el número de mensajes del buzón (* 12 EXISTS). Si LOGIN devuelve a NO [AUTHENTICATIONFAILED], vuelve a doveadm auth test del paso anterior. Si el mensaje de prueba del paso 4 no aparece en EXISTS, se ha quedado entre Postfix y Dovecot: revisa los registros del paso 8.
Paso 7: Inspeccionar la cola de correo
Los mensajes que Postfix no ha podido entregar se quedan en la cola y se reintentan durante cinco días por defecto. Muestra su contenido:
sudo postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
9B8E7F0D11 1432 Fri Sep 25 10:51:03 user@your_domain
(connect to gmail-smtp-in.l.google.com[142.250.153.27]:25: Connection timed out)
[email protected]
-- 2 Kbytes in 1 Request.
La línea entre paréntesis es el motivo del último intento fallido, y suele bastar para saber qué pasa. Estos son los comandos para trabajar con la cola; sustituye 9B8E7F0D11 por el identificador del mensaje:
| Comando | Acción |
|---|---|
sudo postcat -q 9B8E7F0D11 | Muestra el mensaje completo con sus cabeceras. |
sudo postqueue -i 9B8E7F0D11 | Reintenta la entrega de ese mensaje ahora. |
sudo postqueue -f | Reintenta todos los mensajes de la cola. |
sudo postsuper -d 9B8E7F0D11 | Elimina ese mensaje. |
sudo postsuper -d ALL deferred | Elimina todos los mensajes aplazados. |
Advertenciasi la cola tiene cientos o miles de mensajes que tú no has enviado, una cuenta o un formulario web está enviando spam desde tu servidor. Antes de vaciarla, averigua el origen con
postcaty cambia la contraseña afectada; si no, tu IP acabará en listas negras.
Paso 8: Leer los registros
En Ubuntu 24.04, Postfix y Dovecot escriben en /var/log/mail.log. Sigue el registro en directo mientras repites una prueba:
sudo tail -f /var/log/mail.log
Cada mensaje tiene un identificador de cola (como 4F2A1C0B7E en la salida de swaks). Buscarlo reúne todas las líneas de ese mensaje, desde que entra hasta que se entrega o se rechaza:
sudo grep 4F2A1C0B7E /var/log/mail.log
Para localizar rápidamente los problemas recientes, filtra por entregas fallidas y rechazos:
sudo grep -E "status=(deferred|bounced)|reject:" /var/log/mail.log | tail -n 20
Estos son los mensajes más frecuentes y lo que significan:
| Mensaje en el registro | Causa y solución |
|---|---|
connect to ...:25: Connection timed out | Salida por el puerto 25 bloqueada. Ver paso 3. |
Relay access denied | El cliente envía a un dominio externo sin autenticarse, o el dominio del destinatario no está configurado como local en Postfix. |
SASL LOGIN authentication failed | Usuario o contraseña incorrectos. Comprueba con doveadm auth test. |
SASL: Connect to private/auth failed: No such file or directory | Dovecot no ha creado el socket de autenticación para Postfix. Revisa el bloque unix_listener /var/spool/postfix/private/auth en /etc/dovecot/conf.d/10-master.conf. |
Host or domain name not found. Name service error | El dominio del destinatario no existe o el servidor no resuelve DNS. Prueba dig MX con ese dominio. |
said: 550-5.7.25 o 550-5.7.26 (Gmail) | Falta el PTR de la IP o el mensaje no pasa SPF/DKIM/DMARC. Ver paso 2. |
User unknown in local recipient table | La dirección no existe en el servidor. Crea el buzón o un alias. |
imap-login: Disconnected (auth failed | Un cliente IMAP falla al autenticarse. Varias líneas seguidas desde IPs desconocidas indican un ataque de fuerza bruta. |
Solución de problemas
Los mensajes salen pero no llegan a Gmail ni a Outlook: si el registro muestra status=sent con 250 del servidor de destino, tu servidor ha cumplido; el destinatario lo ha clasificado como spam. Revisa SPF, DKIM, DMARC y el PTR (paso 2) y comprueba si tu IP está en listas negras.
Un servidor externo dice que tu dominio no existe o no tiene servidor de correo: el MX no está publicado o apunta a un nombre sin registro A. Repite las consultas del paso 2 contra @1.1.1.1 y @8.8.8.8; si los resultados difieren, el cambio de DNS aún se está propagando.
El cliente de correo dice que el certificado no es válido: el certificado ha caducado o no incluye el nombre que el cliente tiene configurado como servidor. Comprueba el nombre y la fecha con el comando openssl del paso 5 y configura el cliente con mail.your_domain, no con la IP.
Postfix o Dovecot no arrancan tras un cambio: consulta el motivo con sudo journalctl -u dovecot -n 50 --no-pager o sudo journalctl -u postfix@- -n 50 --no-pager, y valida la configuración con postfix check y doveconf -n.
Conclusión
Has recorrido un servidor Postfix y Dovecot pieza a pieza: servicios y puertos, DNS, salida por el puerto 25, recepción desde el exterior, envío autenticado, IMAP, cola y registros. Siguiendo ese orden, cualquier fallo queda acotado a un único componente y el mensaje del registro suele indicar directamente la solución.
Como siguientes pasos puedes:
- Instalar Fail2ban con los filtros de Postfix y Dovecot para bloquear los ataques de fuerza bruta que aparecen en los registros.
- Configurar una alerta que te avise cuando la cola de Postfix supere un número de mensajes.
- Revisar periódicamente los informes DMARC de tu dominio para detectar problemas de autenticación antes que tus usuarios.
