On my Debian machines I run stunnel to create an secure connection to my e-mail provider’s SMTP gateway. Postfix sends mail through that TLS tunnel. Recently I stopped receiving e-mail from rss2email and I discovered tonight that the reason was that the tunnel has caved in on the machine which rss2email was running on. Unfortunately, some mail was permanently discarded from the postfix queue because it turns out that postfix will by default keep mail in the queue for a maximum of only 5 days. Since the connection to the gateway was down, postfix couldn’t return the mail to its sender (i.e. me).
Fortunately, I’m not smart enough to have any log rotation going on, so I could easily find the message that were lost:
grep "status=expired, returned to sender" /var/log/mail.log \
| awk '{print $6}' \
| while read id; do grep "$id" -m1 /var/log/mail.log; done
The first grep determines the queue id of the messages that were
expired, and then the second grep finds the first entry in the mail
log for that message, which provides the time the message was sent.
Replacing -m1
with -m4
gave me the message-id of the messages and
the intended recipient of the messages. This allowed me to restore
them from backups or bounce them from my sent mail folder for those
that I tried to send myself.
To prevent this from happening again, I’ve extended the maximum lifetime of messages in the queue from 5 days to 10:
postconf -e maximal_queue_lifetime=10d
I’ve incorporated a check for clogged mail queues on my machines into my weekly backup routine.