Note: The command at the end ( smtp , pipe , etc.) depends on what upd is supposed to do.
Open /etc/postfix/transport and ensure your routes are formatted correctly:
In /etc/postfix/master.cf , look at the column labeled chroot (the 5th column). If it is set to y (yes) or - (default, which often defaults to yes on systems like Debian/Ubuntu), the service runs inside a restricted filesystem jail.
typically means Postfix is trying to use a delivery mechanism (transport) that is either misconfigured in or missing entirely from Note: The command at the end ( smtp , pipe , etc
dovecot unix - n n - - pipe flags=DRhu user=vmail argv=/usr/lib/dovecot/deliver -f $sender -d $recipient Use code with caution.
If you modify this file, restart Dovecot to apply changes: sudo systemctl restart dovecot . Flushing the Postfix Mail Queue
Open your transport source file (usually /etc/postfix/transport ). typically means Postfix is trying to use a
Look 10 lines above the "unknown mail transport error." The true error (e.g., “Name service error,” “Connection timed out,” or “TLS read error”) lives there.
If the error appeared after an update (the “upd” clue):
But sometimes, the error persists. The email ages in purgatory. The sysadmin runs postqueue -p and sees the same stubborn entries day after day. Eventually, a decision must be made: postsuper -d (deletion, a quiet death) or a forced flush with postqueue -f (one last desperate attempt). Look 10 lines above the "unknown mail transport error
Alternatively, you can try flushing just a single stuck message by using its Queue ID (found via the mailq command): postqueue -i QUEUE_ID Use code with caution.
Keep your /etc/postfix and /etc/dovecot directories version-controlled using Git. This allows you to run a quick git diff after a system update to see exactly what changed.
tail -n 100 /var/log/mail.log (or use journalctl -u postfix -n 100 ) CentOS/RHEL/Rocky Linux: tail -n 100 /var/log/maillog