Debugging Sendmail Email Delivery Issues: How to Locate and Analyze Mail Logs


2 views

When troubleshooting email delivery issues with Sendmail, the first step is finding the relevant log files. Here are the most common locations across different Unix-like systems:

# For most Linux distributions (using syslog):
/var/log/maillog
/var/log/mail.log
/var/log/mail.err

# For BSD systems:
/var/log/maillog

# Systemd-based systems (journalctl):
journalctl -u sendmail -f

If default logs don't provide enough detail, increase Sendmail's logging level by editing /etc/mail/sendmail.cf:

# Modify the LogLevel parameter (0-15, higher means more verbose)
O LogLevel=12

# Alternative method for newer versions using mc files:
define(`confLOG_LEVEL', `12')dnl

After changing the configuration, restart Sendmail:

# System V style:
/etc/init.d/sendmail restart

# Systemd style:
systemctl restart sendmail

Here's how to extract useful information from Sendmail logs:

# View recent mail delivery attempts:
grep "to=" /var/log/maillog | tail -50

# Check for deferred messages:
grep "deferred" /var/log/maillog

# Find rejected connections:
grep "reject=" /var/log/maillog

# Monitor real-time mail activity:
tail -f /var/log/maillog | grep -E 'to=|from='

These patterns in logs indicate specific problems:

# Connection refused (network/firewall issue)
Apr 10 15:23:01 server sendmail[1234]: NOQUEUE: connect to example.com[192.0.2.1]: Connection refused

# Authentication failure
Apr 10 15:24:05 server sendmail[5678]: AUTH=server, relay=client.example.com, authfail

# DNS lookup failure
Apr 10 15:25:12 server sendmail[9012]: host map: lookup (example.com): DNS lookup error

For complex mail server environments, consider these tools:

# Use swatch for real-time monitoring:
swatch --config-file=/etc/swatch.conf --tail-file=/var/log/maillog

# Process logs with logstash:
input {
  file {
    path => "/var/log/maillog"
    start_position => "beginning"
  }
}
filter {
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:process}$$%{NUMBER:pid}$$: %{GREEDYDATA:message}" }
  }
}

When troubleshooting email delivery problems with sendmail, the first step is to examine the logs. On most Linux systems, sendmail logs are typically found in:

/var/log/maillog
/var/log/mail.log
/var/log/mail.err

To monitor sendmail activity as it happens, use tail with the -f flag:

tail -f /var/log/maillog

Here are some typical log patterns you might encounter:

# Successful delivery
Apr 10 14:23:01 server1 sendmail[1234]: xA12345: to=user@domain.com, ctladdr=user (1000/1000), delay=00:00:05, xdelay=00:00:03, mailer=esmtp, pri=32123, relay=mail.domain.com. [1.2.3.4], dsn=2.0.0, stat=Sent (OK id=1a2b3c-000000-00)

# Failed delivery
Apr 10 14:25:01 server1 sendmail[5678]: xB67890: to=nonexistent@domain.com, ctladdr=user (1000/1000), delay=00:00:10, xdelay=00:00:08, mailer=esmtp, pri=42123, relay=mail.domain.com. [1.2.3.4], dsn=5.1.1, stat=User unknown

If default logs aren't detailed enough, edit sendmail.mc to increase log level:

# Add to sendmail.mc before rebuilding
define(`confLOG_LEVEL', `15')dnl

Then rebuild and restart sendmail:

make -C /etc/mail
service sendmail restart

Extract specific information from logs using grep patterns:

# Find all failed deliveries
grep "stat=User unknown" /var/log/maillog

# Check for specific message IDs
grep "xA12345" /var/log/maillog

For regular monitoring, create a script to parse logs:

#!/bin/bash
LOG_FILE="/var/log/maillog"
FAILED=$(grep -c "stat=User unknown" $LOG_FILE)
DEFERRED=$(grep -c "stat=Deferred" $LOG_FILE)

echo "Email delivery report:"
echo "Failed: $FAILED"
echo "Deferred: $DEFERRED"