• Diagnosticar el «no envío» de mails en Debian

    Puede ocurrir que un servidor Debian deje de enviar correos de un día para otro y no tengamos claro dónde está el problema. En estos casos conviene diagnosticar el fallo con orden, porque el problema puede estar en Postfix, en la cola de correo, en DNS, en la resolución del destinatario, en el relay SMTP, en el firewall o incluso en bloqueos del proveedor.

    Vamos a revisar los puntos básicos para diagnosticar por qué Debian no está enviando mails correctamente.

    Lo primero que debemos comprobar es si Postfix está instalado y funcionando. Para ver el estado del servicio podemos ejecutar:

    service postfix status
    

    También podemos usar systemctl:

    systemctl status postfix
    

    Si Postfix está parado, intentamos arrancarlo:

    systemctl start postfix
    

    Y si queremos que arranque automáticamente con el sistema:

    systemctl enable postfix
    

    Si el servicio no arranca, debemos revisar directamente el error que devuelve systemd:

    journalctl -u postfix --no-pager -n 100
    

    El siguiente paso es comprobar si hay correos atascados en la cola. Para eso usamos:

    mailq
    

    También podemos usar:

    postqueue -p
    

    Si la cola está vacía, Postfix no tiene correos pendientes de enviar. En ese caso el problema puede estar antes de Postfix, por ejemplo en la aplicación que debería generar el correo.

    Si vemos correos en la cola, debemos leer el motivo por el que no se han entregado. Normalmente Postfix muestra un mensaje de error junto a cada correo en cola. Ahí podemos encontrar pistas como problemas de DNS, conexión rechazada, autenticación fallida, dominio inexistente o bloqueo del servidor remoto.

    Para forzar el intento de envío de los correos pendientes podemos ejecutar:

    postqueue -f
    

    También podemos usar:

    sendmail -q
    

    Después de forzar la cola, debemos volver a mirar los logs para ver qué ha pasado realmente.

    En Debian, los logs de correo suelen estar en:

    /var/log/mail.log
    

    Podemos revisarlos en tiempo real mientras forzamos el envío:

    tail -f /var/log/mail.log
    

    En otra terminal podemos lanzar:

    postqueue -f
    

    De esta forma veremos inmediatamente si Postfix intenta entregar los mensajes, si el servidor remoto rechaza la conexión o si hay algún error de configuración.

    Si queremos buscar errores concretos en el log, podemos usar:

    grep -i "error" /var/log/mail.log
    grep -i "warning" /var/log/mail.log
    grep -i "deferred" /var/log/mail.log
    grep -i "reject" /var/log/mail.log
    grep -i "authentication failed" /var/log/mail.log
    

    Si no tenemos herramientas básicas para enviar correos de prueba desde consola, instalamos mailutils:

    apt-get update
    apt-get -y install mailutils
    

    Después podemos enviar un correo de prueba:

    echo "Prueba de envio desde Debian" | mail -s "Prueba Postfix" usuario@dominio.com
    

    Mientras enviamos la prueba, revisamos el log:

    tail -f /var/log/mail.log
    

    Si el correo aparece en la cola pero no sale, el problema está en la entrega. Si ni siquiera aparece en el log, el problema probablemente está en la herramienta, aplicación o script que intenta enviar el correo.

    También conviene comprobar la configuración principal de Postfix:

    postconf -n
    

    Este comando muestra la configuración activa de Postfix, omitiendo los valores por defecto. Nos interesa revisar especialmente parámetros como:

    myhostname
    mydestination
    relayhost
    inet_interfaces
    inet_protocols
    smtp_sasl_auth_enable
    smtp_sasl_password_maps
    smtp_tls_security_level
    

    Si usamos un servidor SMTP externo como relay, debemos revisar el parámetro relayhost:

    postconf relayhost
    

    Si el relay requiere autenticación, debemos comprobar que Postfix tenga configuradas las credenciales SMTP. Normalmente estarán en un archivo como:

    /etc/postfix/sasl_passwd
    

    Después de modificar ese archivo, debemos regenerar el mapa correspondiente:

    postmap /etc/postfix/sasl_passwd
    systemctl reload postfix
    

    Un fallo muy habitual es que el archivo de credenciales exista, pero no se haya ejecutado postmap después de modificarlo. En ese caso Postfix seguirá usando la versión anterior del mapa.

    También debemos comprobar los permisos de los archivos de credenciales, porque no deberían ser legibles por cualquier usuario del sistema:

    chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
    chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
    

    Si el error apunta a DNS, debemos comprobar que el servidor pueda resolver dominios externos:

    getent hosts gmail.com
    getent hosts debian.org
    

    También podemos comprobar los registros MX del dominio destinatario instalando dnsutils:

    apt-get -y install dnsutils
    dig MX dominio.com
    

    Si no hay resolución DNS, Postfix no podrá saber a qué servidor debe entregar el correo.

    Otro punto importante es comprobar si el servidor puede abrir conexiones salientes al puerto SMTP correspondiente. Para entrega directa se usa normalmente el puerto 25. Para relay autenticado se usan normalmente los puertos 587 o 465.

    apt-get -y install netcat-openbsd
    nc -vz servidor.smtp.com 587
    nc -vz servidor.smtp.com 465
    nc -vz gmail-smtp-in.l.google.com 25
    

    Si la conexión al puerto 25 falla, puede que el proveedor del servidor esté bloqueando el tráfico SMTP saliente. Esto es habitual en VPS, servidores cloud y conexiones residenciales. En ese caso, lo normal es usar un relay SMTP autenticado por el puerto 587.

    Si Postfix intenta enviar por IPv6 y la conectividad IPv6 del servidor no funciona bien, podemos encontrarnos con entregas fallidas o retardos. Para probarlo, podemos revisar el valor de inet_protocols:

    postconf inet_protocols
    

    Si necesitamos forzar IPv4, podemos configurar:

    postconf -e "inet_protocols = ipv4"
    systemctl restart postfix
    

    También debemos comprobar si los correos están siendo generados localmente pero acabando en buzones locales del sistema. Para eso podemos revisar:

    ls -lah /var/mail
    ls -lah /var/spool/mail
    

    La existencia o no de usuarios en estos directorios no determina si Debian puede enviar correo al exterior. Estos directorios se usan para almacenar correo local de usuarios del sistema. Pueden ser útiles para diagnosticar entregas locales, pero no son una condición necesaria para enviar mails externos.

    Si queremos ver qué correos locales ha recibido root, podemos usar:

    mail
    

    O revisar directamente el buzón:

    less /var/mail/root
    

    Si una aplicación intenta enviar correo pero no llega nada a Postfix, debemos comprobar qué comando utiliza. Muchas aplicaciones llaman a sendmail directamente. En Debian, Postfix proporciona una interfaz compatible con sendmail, así que podemos comprobar si existe:

    which sendmail
    ls -l /usr/sbin/sendmail
    

    Si no existe, probablemente Postfix no está instalado correctamente o no hay ningún MTA instalado en el sistema.

    Para revisar la cola con más detalle, podemos ver un mensaje concreto usando su ID de cola. Primero listamos la cola:

    mailq
    

    Después inspeccionamos un mensaje concreto:

    postcat -q ID_DEL_MENSAJE
    

    Esto nos permite ver cabeceras, destinatario, remitente y parte del contenido del mensaje en cola.

    Si queremos eliminar un mensaje concreto de la cola:

    postsuper -d ID_DEL_MENSAJE
    

    Si queremos borrar todos los mensajes diferidos, debemos tener cuidado, pero podemos hacerlo con:

    postsuper -d ALL deferred
    

    Antes de borrar una cola completa conviene revisar el motivo real del atasco. Si borramos sin mirar, perdemos información útil para diagnosticar el problema.

    Una secuencia práctica para diagnosticar el fallo sería esta:

    systemctl status postfix
    mailq
    tail -f /var/log/mail.log
    postqueue -f
    

    Y para enviar una prueba desde consola:

    echo "Prueba de envio desde Debian" | mail -s "Prueba Postfix" usuario@dominio.com
    

    Si el correo no sale, el log normalmente nos dirá dónde está el problema: servicio parado, autenticación fallida, DNS roto, relay inaccesible, puerto bloqueado, certificado TLS problemático, destinatario rechazado o servidor remoto denegando la entrega.

    Lo importante es no diagnosticar a ciegas. Primero comprobamos Postfix, después la cola, después los logs, después la conectividad y finalmente la configuración del relay o de la entrega directa.

    Euskal Hack Congress

    Los comentarios están cerrados.