Delivery Temporarily Suspended - Unknown Mail Transport Error Postfix Upd
Troubleshooting Postfix: "Delivery Temporarily Suspended: Unknown Mail Transport Error"
If you are managing a Postfix mail server, encountering the error message "delivery temporarily suspended: unknown mail transport error" in your mail logs (usually /var/log/mail.log or /var/log/maillog) can be frustrating. This error is generic, meaning Postfix knows something went wrong during the handoff to a transport agent, but it hasn't categorized the specific failure yet. 1. Understand the Root Cause
This error typically occurs when Postfix attempts to hand an email over to a specific transport (like smtp, lmtp, dovecot, or pipe) and that transport fails or is misconfigured. Because the transport didn't provide a clear "permanent failure" code, Postfix defers the mail and suspends delivery to that destination to prevent a loop or resource exhaustion. 2. Check the Specific Log Context
The "unknown mail transport error" is usually preceded by a more descriptive line in your logs. Search your log file for the specific Queue ID associated with the error: grep "QUEUE_ID" /var/log/mail.log Use code with caution.
Look for lines containing fatal, panic, or error immediately before the suspension notice. Common culprits include: Permissions issues on a socket (e.g., Dovecot LMTP).
A service that isn't running (e.g., Amavis, SpamAssassin, or Dovecot). Syntax errors in master.cf. 3. Common Solutions A. Dovecot LMTP Permissions
If you use Dovecot for local delivery, Postfix often communicates via a socket. If Postfix doesn't have permission to write to that socket, you'll see this error.The Fix: Check your Dovecot configuration (usually /etc/dovecot/conf.d/10-master.conf). Ensure the postfix user has access:
unix_listener /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix Use code with caution. B. Service Crashes
If you are routing mail through a content filter (like Amavis) or a custom script in master.cf, ensure that service is actually active.The Fix: systemctl status amavisd # or systemctl status dovecot Use code with caution.
If the service is down, Postfix "unknown transport" is simply telling you there's no one at the other end of the pipe. C. Chroot Issues
In many default installations (like Debian/Ubuntu), Postfix components run in a "chroot" jail. If you've recently updated your system or moved a socket location, the component inside the jail may no longer be able to "see" the transport.The Fix: Open /etc/postfix/master.cf and try setting the chroot column to n for the service experiencing the error, then restart Postfix. D. Disk Space and Quotas
If the partition containing /var/spool/postfix is full, or if the destination mailbox has a filesystem quota issue, the transport agent might crash or return an unexpected exit code.The Fix: Check disk space with df -h. 4. Clearing the "Suspended" Status To (add v flag and increase verbosity): dovecot
Once you believe you have fixed the underlying issue, Postfix will eventually retry on its own. However, you can force it to try again immediately and clear the suspension status by flushing the queue: postqueue -f Use code with caution. Summary Checklist Identify the Queue ID from your logs.
Find the line above the error to see which specific service (lmtp, smtp, pipe) failed.
Verify the service is running and that its socket/port is accessible. Check permissions if using Unix sockets.
Restart Postfix after making changes to main.cf or master.cf.
By following these steps, you can move past the generic "unknown error" and restore reliable mail delivery to your server.
Do you have access to your mail logs right now to check for the specific error line preceding the suspension?
Deep Debugging: Enabling Verbose Postfix Logging
Sometimes the error remains stubborn. In that case, increase the verbosity of the transport in master.cf.
Example: Making the Dovecot transport verbose
Edit /etc/postfix/master.cf and modify the transport line from:
dovecot unix - n n - - pipe
To (add v flag and increase verbosity):
dovecot unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/libexec/dovecot/dovecot-lda -f $sender -d $user@$domain -o plugin/quota=maildir:User quota -d
Also, increase Postfix’s global verbosity: kills idle connections
sudo postconf -e "debug_peer_level = 3"
sudo postconf -e "debug_peer_list = domain.com"
sudo systemctl restart postfix
Then tail -f /var/log/mail.log while sending a test email. The additional output might reveal the actual error (e.g., "No space left on device", "Cannot open mailbox", "Permission denied").
Troubleshooting: "helpful feature regarding delivery temporarily suspended: unknown mail transport error" (Postfix)
This usually means Postfix attempted handoff to a transport (local delivery agent, external SMTP, or a pipeline like fetchmail/procmail/virtual) and that transport returned a non-specific/unknown error. Steps to find and fix it:
-
Check logs (primary debugging step)
- Inspect mail log for the failing message(s):
- Debian/Ubuntu: /var/log/mail.log
- RHEL/CentOS: /var/log/maillog
- Search for the exact Postfix queue ID and the full error lines:
- grep
/var/log/mail.log
- grep
- Note timestamps, queue ID, transport name, and any earlier errors.
- Inspect mail log for the failing message(s):
-
Identify the transport
- In the log you should see a line like:
- "status=deferred (unknown mail transport error for ...)"
- Look for the transport name before the error (e.g., local, smtp, smtp:[relay.example], pipe, delivery).
- If not obvious, check master.cf and transport maps:
- /etc/postfix/master.cf — which services are defined (local, virtual, relay, pipe).
- /etc/postfix/transport and any transport_maps configured in main.cf.
- In the log you should see a line like:
-
Common causes and fixes
- External relay/network errors:
- Cause: DNS failure, connection refused, TLS handshake issues, remote server rejecting.
- Fix: Verify DNS, test connectivity: telnet/openssl s_client to destination host/port, check firewall, check SASL/TLS settings.
- Local delivery agent failures (pipe to procmail/dovecot-lda/maildrop):
- Cause: binary missing, permissions, incorrect command-line in master.cf, quota or mailbox backend down.
- Fix: Ensure the program exists and is executable; check master.cf command, mailbox permissions, and the user running the process. Test delivery command manually.
- Submission to content filter/antivirus (amavisd, milter):
- Cause: filter crashed or overloaded, socket unreachable.
- Fix: Ensure the filter service is running, sockets (unix/tcp) paths match master.cf or milter settings, restart filter.
- Virtual mailbox backend (dovecot-lda, dovecot-ldaps, mysql/ldap lookup):
- Cause: auth/lookup failure, DB down, incorrect queries.
- Fix: Check DB connectivity, review dovecot logs, test user lookups, verify SQL/LDAP credentials.
- Queue permission or disk space issues:
- Cause: full disk, wrong ownership on /var/spool/postfix.
- Fix: free disk space; ensure Postfix owns its queue directories and has proper permissions; run postfix check.
- External relay/network errors:
-
Reproduce and test delivery
- Use sendmail wrapper to generate a test message and watch logs:
- echo "Test" | sendmail -v user@example.com
- Use postqueue -p and postcat -q
to inspect queued message content. - Use postqueue -f to attempt flush after fixing.
- Use sendmail wrapper to generate a test message and watch logs:
-
Clear or retry queued messages
- To retry a specific queue ID:
- postqueue -i
- postqueue -i
- To requeue all:
- postsuper -r ALL
- To remove irrecoverable messages:
- postsuper -d
(or -d ALL deferred) — use carefully.
- postsuper -d
- To retry a specific queue ID:
-
If logs remain unclear, increase Postfix verbosity temporarily
- In /etc/postfix/main.cf enable:
- debug_peer_level = 2
- verbose = yes
- Or set specific service logging in master.cf (add -v flags where supported).
- Restart postfix and reproduce, then revert verbose logging.
- In /etc/postfix/main.cf enable:
-
Useful commands
- tail -f /var/log/mail.log
- postconf -n
- postfix reload
- postfix stop/start
- postqueue -p
- postsuper -d
- postcat -q
If you share the exact log lines (queue ID and surrounding entries) and your master.cf transport for that delivery, I can give a targeted fix.
Fix 2: Harden Database Connection Parameters
Edit your mysql_*.cf or pgsql_*.cf files. Add these parameters to prevent stale connections: or hits a timeout
# For MySQL
connect_timeout = 5
timeout = 2
option = 3 # MYSQL_OPT_RECONNECT
How to Diagnose the Real Problem
Don’t just restart Postfix—you’ll lose the evidence. Follow this forensic process:
Step 1: Check the Full Mail Log
Grep for the specific message ID:
grep [message-id] /var/log/mail.log
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.
Step 2: Test the Transport Manually
Find the destination domain from the log, then use smtp-source:
smtp-source -v -p 25 example.com
A hang or immediate close points to a network or firewall issue.
Step 3: Validate Your Transport Map
Run:
postmap -q example.com /etc/postfix/transport
If it returns a garbage transport name (like “error:”) or nothing at all, your map is corrupt.
1. Corrupted or Overloaded Database Connections (Most Common)
If you use MySQL, PostgreSQL, or SQLite for virtual domains, users, or aliases, a broken connection is the #1 culprit. postfix/upd acts as a proxy between the main Postfix process and your database.
Symptoms:
- The error appears only during high traffic.
- Restarting Postfix fixes it temporarily.
- Your database logs show
max_connections errors or timeout warnings.
Why it happens: The upd process holds a persistent connection to the DB. If the DB restarts, kills idle connections, or hits a timeout, the upd process continues using a dead socket. When a delivery attempt occurs, the transport fails silently.