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
- El cliente envía: El cliente de email envía al servidor SMTP (puerto 587/465)
- Autenticación: El servidor verifica las credenciales del remitente
- Búsqueda DNS: Consulta registros MX para el dominio del destinatario
- Conexión: Se conecta al servidor de correo del destinatario (puerto 25)
- Handshake: Conversación SMTP entre servidores
- Entrega: Email transferido al servidor del destinatario
- Cola/Entrega: El servidor del destinatario encola o entrega al buzón
Proceso de Recepción de Email
- Conexión: El servidor remoto se conecta (puerto 25)
- Diálogo SMTP: Se intercambian comandos (HELO, MAIL FROM, RCPT TO)
- Verificación de spam: Validación de SPF, DKIM, DMARC
- Filtrado de contenido: Filtrado de antivirus y spam
- 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:
- Leer logs cuidadosamente: La mayoría de los problemas se revelan en los logs de correo
- Comprender códigos SMTP: Saber qué significan los códigos 4xx vs 5xx
- Verificar registros DNS: MX, SPF, DKIM, DMARC, rDNS todos críticos
- Monitorear colas: Las colas grandes indican problemas de entrega
- Probar exhaustivamente: Usar swaks y SMTP manual para pruebas
- Vigilar listas negras: La reputación de IP afecta la entregabilidad
- 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.


