How to Properly Flush and Reset Postfix Mail Queue on Ubuntu Servers


2 views

When dealing with misconfigured mail servers, you might encounter situations where Postfix accumulates thousands of undelivered messages in its queue. This commonly happens when:

  • A script generates excessive notification emails
  • SMTP relay credentials get throttled (especially with Office 365)
  • DNS or network issues prevent delivery

Many admins first attempt to manually delete files from /var/spool/postfix directories:

sudo rm /var/spool/postfix/active/*
sudo rm /var/spool/postfix/incoming/*

This doesn't work because:

  • Postfix maintains an internal database of queued messages
  • The queue manager will rebuild missing files
  • You risk corrupting the queue structure

Postfix provides built-in tools for queue management:

Viewing the Queue

postqueue -p
# or alternative syntax:
mailq

Flushing All Queued Messages

sudo postsuper -d ALL
# For deferred messages only:
sudo postsuper -d ALL deferred

Alternative Deletion Methods

# Delete by queue ID:
sudo postsuper -d A1B2C3D4E5

# Delete all deferred messages older than 5 days:
find /var/spool/postfix/deferred -type f -mtime +5 -exec rm -f {} \;
postsuper -d ALL deferred

After clearing the queue, implement these safeguards:

# Configure message rate limiting in main.cf:
sudo nano /etc/postfix/main.cf
# Add these lines:
anvil_rate_time_unit = 60s
smtpd_client_message_rate_limit = 100

For Office 365 specifically:

# In master.cf:
smtp.office365.com:587 relay:Password123@=

Set up monitoring with these commands:

# Count messages in queue:
postqueue -p | grep -c '^[0-9A-F]'

# Check queue disk usage:
du -sh /var/spool/postfix

When dealing with mail server issues, particularly with Postfix on Ubuntu, one common challenge is managing the mail queue after a malfunction. Recently, I encountered a situation where a misconfigured script flooded our Office 365 relay with thousands of notification emails, causing throttling issues.

Initially, I tried manually deleting files from /var/spool/postfix directories:

sudo rm -rf /var/spool/postfix/active/*
sudo rm -rf /var/spool/postfix/incoming/*

However, postqueue -p still showed messages in the queue because Postfix maintains its own internal tracking of messages.

The correct way to manage Postfix queues involves using dedicated commands rather than direct filesystem manipulation:

# View current queue
sudo postqueue -p

# Flush deferred messages (attempt delivery now)
sudo postqueue -f

# Delete ALL messages in queue (use with caution)
sudo postsuper -d ALL

# Alternative: delete only deferred messages
sudo postsuper -d ALL deferred

For a complete reset when dealing with a flooded queue:

# Stop Postfix service
sudo systemctl stop postfix

# Purge all queued messages
sudo postsuper -d ALL

# Optional: clean up corrupted queue files
sudo postfix -c /etc/postfix check

# Restart Postfix
sudo systemctl start postfix

To avoid similar issues:

# Implement rate limiting in main.cf
sudo nano /etc/postfix/main.cf

Add these configuration lines:

default_process_limit = 100
smtpd_client_connection_rate_limit = 30
anvil_rate_time_unit = 60s

For ongoing monitoring, consider these commands:

# Count messages in queue
sudo mailq | wc -l

# View queue summary
sudo qshape

Setting up a cron job to alert when queue size exceeds thresholds can prevent future incidents.