Email No Enviando/Recibiendo: Análisis de Logs

Introducción

Los problemas de entrega de email pueden impactar severamente las operaciones comerciales, la comunicación y la satisfacción del cliente. Cuando los emails fallan al enviarse o recibirse, identificar la causa raíz rápidamente es crítico. A diferencia de los servicios web donde los errores son inmediatamente visibles, los problemas de email a menudo requieren análisis profundo de logs, transacciones SMTP y registros DNS para diagnosticar.

Esta guía completa enseña a los administradores de sistemas cómo solucionar problemas de email a través de procedimientos sistemáticos de análisis de logs y diagnóstico. Aprenderás a leer logs de servidores de correo, comprender códigos de error SMTP, rastrear rutas de entrega de email e identificar problemas comunes que afectan el flujo de correo tanto en escenarios de envío como de recepción.

Los sistemas de email involucran múltiples componentes: agentes de transferencia de correo (MTAs), registros DNS, mecanismos de autenticación y filtros de spam, haciendo que la solución de problemas sea compleja. Esta guía proporciona un enfoque estructurado para analizar estos componentes e identificar rápidamente dónde se interrumpe la entrega de email.

Comprensión del Flujo de Email

Proceso de Envío de Email

  1. El cliente envía: El cliente de email envía al servidor SMTP (puerto 587/465)
  2. Autenticación: El servidor verifica las credenciales del remitente
  3. Búsqueda DNS: Consulta registros MX para el dominio del destinatario
  4. Conexión: Se conecta al servidor de correo del destinatario (puerto 25)
  5. Handshake: Conversación SMTP entre servidores
  6. Entrega: Email transferido al servidor del destinatario
  7. Cola/Entrega: El servidor del destinatario encola o entrega al buzón

Proceso de Recepción de Email

  1. Conexión: El servidor remoto se conecta (puerto 25)
  2. Diálogo SMTP: Se intercambian comandos (HELO, MAIL FROM, RCPT TO)
  3. Verificación de spam: Validación de SPF, DKIM, DMARC
  4. Filtrado de contenido: Filtrado de antivirus y spam
  5. Entrega: Al buzón o reenviar a otro servidor

Problemas Comunes de Email

Problemas de Envío:

  • Fallos de autenticación SMTP
  • Acceso de relay denegado
  • Direcciones IP en lista negra
  • Problemas de DNS/registros MX
  • Errores de certificado TLS/SSL
  • Límites de tamaño de adjuntos excedidos

Problemas de Recepción:

  • Filtro de spam bloqueando correo legítimo
  • Cuota de disco excedida
  • Direcciones de destinatario inválidas
  • Demoras por greylisting
  • Fallos de búsqueda inversa DNS
  • Puerto 25 bloqueado por ISP

Diagnóstico Inicial de Email

Verificación Rápida del Estado de Email

# Check mail server is running
systemctl status postfix
systemctl status exim4
systemctl status sendmail

# Check listening ports
ss -tlnp | grep -E ":25|:587|:465"
netstat -tlnp | grep -E ":25|:587|:465"

# Check mail queue
mailq
postqueue -p    # Postfix
exim -bp        # Exim

# Check recent mail log
tail -100 /var/log/mail.log
tail -100 /var/log/maillog

# Test local mail delivery
echo "Test" | mail -s "Test" user@localhost

# Check DNS records
dig example.com MX +short
dig -x your-server-ip +short

Interpretación rápida:

# If no service listening on port 25
# THEN mail server not running

# If mailq shows many messages
# THEN delivery problems or queue backup

# If MX records missing/incorrect
# THEN receiving mail won't work

# If reverse DNS missing
# THEN mail may be rejected as spam

Paso 1: Análisis de Logs de Correo

Ubicaciones de Archivos de Log

# Common log file locations
tail -f /var/log/mail.log           # Debian/Ubuntu
tail -f /var/log/maillog            # CentOS/RHEL
tail -f /var/log/mail.info          # General info
tail -f /var/log/mail.err           # Errors only
tail -f /var/log/mail.warn          # Warnings

# Postfix logs
tail -f /var/log/postfix.log
journalctl -u postfix -f

# Exim logs
tail -f /var/log/exim4/mainlog
exim -bP log_file_path

Lectura de Logs de Postfix

Anatomía del log de Postfix:

Jan 11 10:30:45 mail postfix/smtp[12345]: 1A2B3C4D5E: to=<[email protected]>,
relay=mx.example.com[93.184.216.34]:25, delay=2.1, delays=0.01/0.01/1.5/0.6,
dsn=2.0.0, status=sent (250 2.0.0 OK)

Componentes clave:

  • Timestamp: Cuándo ocurrió el evento
  • Queue ID: 1A2B3C4D5E (identificador único de mensaje)
  • to: Dirección del destinatario
  • relay: Servidor de destino e IP
  • delay: Tiempo total de entrega
  • dsn: Código de Notificación de Estado de Entrega
  • status: sent (éxito), deferred (reintentar), bounced (fallido)

Patrones Comunes de Log de Postfix

# Find all bounced messages
grep "status=bounced" /var/log/mail.log

# Find deferred deliveries
grep "status=deferred" /var/log/mail.log | tail -50

# Find rejected messages
grep "reject:" /var/log/mail.log

# Search by queue ID
grep "1A2B3C4D5E" /var/log/mail.log

# Search by sender email
grep "from=<[email protected]>" /var/log/mail.log

# Search by recipient
grep "to=<[email protected]>" /var/log/mail.log

# Authentication failures
grep "authentication failed" /var/log/mail.log

# Connection attempts
grep "connect from" /var/log/mail.log

# SASL authentication
grep "sasl" /var/log/mail.log

# Relay denied
grep "Relay access denied" /var/log/mail.log

Análisis de Logs de Exim

# View main log
tail -100 /var/log/exim4/mainlog

# Search by message ID
exigrep "1A2B3C-4D5E6F-GH" /var/log/exim4/mainlog

# Show message headers
exim -Mvh message-id

# Show message body
exim -Mvb message-id

# List messages in queue
exim -bp

# View frozen messages
exim -bp | grep frozen

# Count messages by status
exim -bp | awk '{print $4}' | sort | uniq -c

# Find delivery attempts
grep "=>" /var/log/exim4/mainlog | tail -50

# Find failures
grep "==" /var/log/exim4/mainlog | tail -50

# Find rejects
grep "rejected" /var/log/exim4/mainlog | tail -50

Paso 2: Comprensión de Códigos de Error SMTP

Códigos de Respuesta SMTP Comunes

2xx - Éxito:

  • 250: Acción de correo solicitada okay, completada
  • 251: Usuario no local; se reenviará
  • 252: No se puede verificar usuario, pero se intentará entrega

4xx - Fallo Temporal (reintentar más tarde):

  • 421: Servicio no disponible, cerrando conexión
  • 450: Buzón no disponible (ocupado)
  • 451: Error local en el procesamiento
  • 452: Almacenamiento del sistema insuficiente
  • 454: TLS no disponible

5xx - Fallo Permanente:

  • 550: Buzón no disponible (no existe)
  • 551: Usuario no local
  • 552: Asignación de almacenamiento excedida
  • 553: Nombre de buzón no permitido
  • 554: Transacción fallida

Interpretación de Mensajes de Error

# Find specific error codes
grep "550 5.1.1" /var/log/mail.log    # User unknown
grep "550 5.7.1" /var/log/mail.log    # Relay denied
grep "554 5.7.1" /var/log/mail.log    # Rejected as spam
grep "451 4.7.1" /var/log/mail.log    # Greylisting
grep "452 4.2.2" /var/log/mail.log    # Mailbox full

# Common error patterns
grep -i "relay access denied" /var/log/mail.log
grep -i "user unknown" /var/log/mail.log
grep -i "quota exceeded" /var/log/mail.log
grep -i "rejected" /var/log/mail.log | grep -v "spam"

Script de Análisis de Códigos de Error

cat > /tmp/analyze-errors.sh << 'EOF'
#!/bin/bash

LOG="/var/log/mail.log"
echo "Email Error Analysis"
echo "===================="

echo -e "\nMost Common Errors:"
grep "status=bounced\|status=deferred" "$LOG" | \
    sed 's/.*dsn=\([^,]*\).*/\1/' | \
    sort | uniq -c | sort -rn | head -10

echo -e "\nRejection Reasons:"
grep "reject:" "$LOG" | \
    sed 's/.*reject: //' | \
    cut -d';' -f1 | \
    sort | uniq -c | sort -rn | head -10

echo -e "\nTop Bounced Recipients:"
grep "status=bounced" "$LOG" | \
    grep -o "to=<[^>]*>" | \
    sort | uniq -c | sort -rn | head -10
EOF

chmod +x /tmp/analyze-errors.sh
/tmp/analyze-errors.sh

Paso 3: Diagnóstico de Problemas de Envío

Prueba de Envío SMTP

# Test SMTP connection manually
telnet localhost 25
# or
openssl s_client -connect localhost:587 -starttls smtp

# In the SMTP session:
EHLO example.com
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
Subject: Test

This is a test message.
.
QUIT

# Test with swaks (Swiss Army Knife SMTP)
apt install swaks

# Basic test
swaks --to [email protected] --from [email protected]

# With authentication
swaks --to [email protected] \
      --from [email protected] \
      --auth-user username \
      --auth-password password \
      --server smtp.example.com:587 \
      --tls

# Test to specific server
swaks --to [email protected] --server smtp.gmail.com:587 --tls

Verificación de Cola de Correo

# Postfix queue
postqueue -p
mailq

# Count queued messages
postqueue -p | grep -c "^[A-F0-9]"

# View specific message
postcat -q queue-id

# Show message headers
postcat -qh queue-id

# Delete specific message
postsuper -d queue-id

# Delete all queued messages
postsuper -d ALL

# Flush queue (attempt delivery)
postqueue -f

# Hold queue
postsuper -h queue-id

# Release held message
postsuper -H queue-id

Análisis de Demoras de Entrega

# Find messages with long delays
grep "status=deferred" /var/log/mail.log | \
    awk -F'delay=' '{print $2}' | \
    cut -d',' -f1 | \
    sort -rn | \
    head -20

# Find slow connections
grep "smtp.*delay=" /var/log/mail.log | \
    awk '{for(i=1;i<=NF;i++) if($i~/delay=/) print $i}' | \
    cut -d'=' -f2 | \
    cut -d',' -f1 | \
    awk '$1 > 10 {print}' | \
    sort -rn

# Delays by destination
grep "status=sent\|status=deferred" /var/log/mail.log | \
    awk '{print $7, $NF}' | \
    grep "delay=" | \
    sed 's/.*relay=\([^[]*\).*delay=\([^,]*\).*/\1 \2/' | \
    sort | \
    awk '{sum[$1]+=$2; count[$1]++} END {for(i in sum) print i, sum[i]/count[i]}' | \
    sort -k2 -rn

Paso 4: Diagnóstico de Problemas de Recepción

Prueba de Recepción de Correo

# Send test email from external service
# Use mail-tester.com or mxtoolbox.com

# Check if port 25 is accessible
telnet your-server-ip 25

# Test from remote server
swaks --to [email protected] \
      --from [email protected] \
      --server your-server-ip

# Check MX records
dig your-domain.com MX +short

# Verify reverse DNS
dig -x your-server-ip +short

# Check if IP is blacklisted
host your-server-ip.zen.spamhaus.org
host your-server-ip.bl.spamcop.net

Análisis de Filtro de Spam

# SpamAssassin logs
tail -100 /var/log/mail.log | grep spamd

# Check spam scores
grep "X-Spam-Status" /var/mail/username

# SpamAssassin test
spamassassin -D < email-sample.eml

# Amavis logs
grep amavis /var/log/mail.log | tail -50

# Check rejected as spam
grep "Rejected by.*spam" /var/log/mail.log

# Spam statistics
grep -c "identified spam" /var/log/mail.log

Problemas de Greylisting

# Check for greylisting
grep "Greylisted" /var/log/mail.log

# Postgrey status
systemctl status postgrey

# Postgrey whitelist
cat /etc/postgrey/whitelist_clients

# Add to whitelist
echo "example.com" >> /etc/postgrey/whitelist_clients
systemctl reload postgrey

# Check greylisting delays
grep "Greylisted" /var/log/mail.log | \
    awk '{print $1, $2, $3, $NF}'

Paso 5: Problemas de DNS y Autenticación

Verificación de Registros DNS de Email

# MX records
dig your-domain.com MX +short

# SPF record
dig your-domain.com TXT +short | grep "v=spf1"
host -t TXT your-domain.com | grep spf

# DKIM record (replace selector)
dig default._domainkey.your-domain.com TXT +short

# DMARC record
dig _dmarc.your-domain.com TXT +short

# Reverse DNS
dig -x your-server-ip +short

# Verify DNS propagation
for ns in 8.8.8.8 1.1.1.1 208.67.222.222; do
    echo "DNS: $ns"
    dig @$ns your-domain.com MX +short
done

Validación de SPF/DKIM/DMARC

# Check SPF in logs
grep "SPF" /var/log/mail.log | tail -20

# DKIM verification
grep "DKIM" /var/log/mail.log | tail -20

# DMARC reports
grep "DMARC" /var/log/mail.log

# Test SPF manually
# Use mxtoolbox.com/spf.aspx

# Validate DKIM signature
opendkim-testkey -d your-domain.com -s default -vvv

Paso 6: Problemas de Listas Negras y Reputación

Verificación de Listas Negras de IP

# Check major blacklists
cat > /tmp/check-blacklist.sh << 'EOF'
#!/bin/bash

IP=$1
BLACKLISTS="
zen.spamhaus.org
bl.spamcop.net
dnsbl.sorbs.net
b.barracudacentral.org
bl.spameatingmonkey.net
psbl.surriel.com
"

echo "Checking $IP against blacklists..."
for bl in $BLACKLISTS; do
    REVERSED=$(echo $IP | awk -F. '{print $4"."$3"."$2"."$1}')
    if host ${REVERSED}.${bl} > /dev/null 2>&1; then
        echo "LISTED on $bl"
    else
        echo "OK on $bl"
    fi
done
EOF

chmod +x /tmp/check-blacklist.sh
/tmp/check-blacklist.sh your-server-ip

# Check blacklist in logs
grep "blocked using" /var/log/mail.log
grep "RBL" /var/log/mail.log

Reputación del Remitente

# Check rejection due to reputation
grep "450 4.7.1" /var/log/mail.log
grep "554 5.7.1" /var/log/mail.log

# Analyze rejection patterns
grep "reject:" /var/log/mail.log | \
    grep -o "reject: [^;]*" | \
    sort | uniq -c | sort -rn

Paso 7: Problemas de Rendimiento y Recursos

Rendimiento del Servidor de Correo

# Connection count
ss -tan | grep :25 | wc -l

# Queue size
postqueue -p | grep -c "^[A-F0-9]"

# Process resources
ps aux | grep -E "postfix|exim|dovecot" | \
    awk '{sum+=$4} END {print "Memory: " sum "%"}'

# Disk usage
df -h /var/mail
du -sh /var/spool/postfix/*

# I/O wait
iostat -x 1 3 | grep -A1 sda

Agotamiento de Recursos

# Check disk space
df -h /var

# Check inodes
df -i /var

# Large mailboxes
du -sh /var/mail/* | sort -rh | head -10

# Queue directory size
du -sh /var/spool/postfix/deferred

# Connection limits
grep "too many connections" /var/log/mail.log

# Memory issues
grep "Cannot allocate memory" /var/log/mail.log

Soluciones y Remediación

Correcciones Inmediatas

Liberar cola atascada:

postqueue -f
postsuper -r ALL

Limpiar mensajes rebotados:

postsuper -d ALL deferred
postsuper -d ALL bounce

Reiniciar servicios de correo:

systemctl restart postfix
systemctl restart dovecot

Aumentar límites de conexión:

# Edit /etc/postfix/main.cf
default_process_limit = 200
smtpd_client_connection_count_limit = 50

Mejoras de Configuración

Optimización de Postfix:

# /etc/postfix/main.cf
queue_run_delay = 300s
maximal_queue_lifetime = 5d
bounce_queue_lifetime = 5d
maximal_backoff_time = 4000s
minimal_backoff_time = 300s

Habilitar registro detallado:

# Postfix debug
postconf -e "debug_peer_list = example.com"
postconf -e "debug_peer_level = 2"
postfix reload

# Watch debug output
tail -f /var/log/mail.log

Monitoreo y Alertas

cat > /usr/local/bin/mail-monitor.sh << 'EOF'
#!/bin/bash

QUEUE_THRESHOLD=100
LOG_FILE="/var/log/mail-monitor.log"
ALERT_EMAIL="[email protected]"

# Check queue size
QUEUE_SIZE=$(postqueue -p | grep -c "^[A-F0-9]")

if [ $QUEUE_SIZE -gt $QUEUE_THRESHOLD ]; then
    echo "$(date): High queue: $QUEUE_SIZE messages" >> "$LOG_FILE"
    echo "Mail queue has $QUEUE_SIZE messages on $(hostname)" | \
        mail -s "Mail Queue Alert" "$ALERT_EMAIL"
fi

# Check for errors
ERRORS=$(grep -c "status=bounced" /var/log/mail.log)
if [ $ERRORS -gt 10 ]; then
    echo "$(date): High bounce rate: $ERRORS" >> "$LOG_FILE"
fi

# Check service
if ! systemctl is-active --quiet postfix; then
    echo "$(date): Postfix not running!" >> "$LOG_FILE"
    systemctl start postfix
fi
EOF

chmod +x /usr/local/bin/mail-monitor.sh
echo "*/15 * * * * /usr/local/bin/mail-monitor.sh" | crontab -

Conclusión

La solución de problemas de email requiere análisis sistemático de logs y comprensión del proceso de entrega de email. Puntos clave:

  1. Leer logs cuidadosamente: La mayoría de los problemas se revelan en los logs de correo
  2. Comprender códigos SMTP: Saber qué significan los códigos 4xx vs 5xx
  3. Verificar registros DNS: MX, SPF, DKIM, DMARC, rDNS todos críticos
  4. Monitorear colas: Las colas grandes indican problemas de entrega
  5. Probar exhaustivamente: Usar swaks y SMTP manual para pruebas
  6. Vigilar listas negras: La reputación de IP afecta la entregabilidad
  7. Implementar monitoreo: Capturar problemas antes de que los usuarios se quejen

La revisión regular de logs, configuración DNS adecuada y monitoreo proactivo aseguran entrega confiable de email. Domina estas técnicas de análisis de logs para diagnosticar y resolver rápidamente problemas de email cuando ocurran.