How to Permanently Delete Old Emails Using doveadm: A Complete Guide for System Administrators


6 views

Many organizations face the challenge of managing mailboxes containing extremely old messages (5+ years) that consume valuable storage space and may pose compliance risks. While email clients typically handle message deletion through a two-step process (marking then expunging), system administrators often need to perform bulk operations at the server level.

The doveadm expunge command you tried:

doveadm expunge -u testuser@sv.dev mailbox INBOX savedbefore 1-Jan-2011

didn't work because it only processes messages already marked for deletion. This explains why you saw no effect - the messages weren't flagged for removal first.

For permanent deletion, we need to:

# First mark messages for deletion
doveadm flags add -u testuser@sv.dev mailbox INBOX savedbefore 2011-01-01 \Deleted

# Then expunge them permanently
doveadm expunge -u testuser@sv.dev mailbox INBOX savedbefore 2011-01-01

For immediate, irreversible deletion without the two-step process:

doveadm move -u testuser@sv.dev mailbox INBOX savedbefore 2011-01-01 trash
doveadm expunge -u testuser@sv.dev mailbox trash

To clean old messages across all accounts:

for user in $(doveadm user '*'); do
  doveadm flags add -u $user mailbox INBOX savedbefore 2015-01-01 \Deleted
  doveadm expunge -u $user mailbox INBOX savedbefore 2015-01-01
done
  • Always test with a single user first
  • Consider creating backups before mass deletions
  • Verify your organization's email retention policies
  • Monitor storage reclamation - some filesystems don't immediately free space

Many organizations face storage and security issues when users retain extremely old emails (5+ years) in their mailboxes. While email clients typically mark messages for deletion before server-side expunging occurs, system administrators often need more direct control.

The command you tried:

doveadm expunge -u testuser@sv.dev mailbox INBOX savedbefore 1-Jan-2011

fails because expunge only removes messages already marked as deleted. We need a two-step approach for complete removal.

Here's the proper sequence to permanently delete old emails:

# First mark messages for deletion
doveadm flags add -u testuser@sv.dev mailbox INBOX '\Deleted' savedbefore 1-Jan-2011

# Then expunge them permanently
doveadm expunge -u testuser@sv.dev mailbox INBOX savedbefore 1-Jan-2011

For bulk operations across all users:

# Get all users
USERS=$(doveadm user '*')

# Process each user
for USER in $USERS; do
  doveadm flags add -u $USER mailbox INBOX '\Deleted' savedbefore 1-Jan-2011
  doveadm expunge -u $USER mailbox INBOX savedbefore 1-Jan-2011
done

For Dovecot 2.2.10+ versions, you can combine operations:

doveadm expunge -u testuser@sv.dev mailbox INBOX savedbefore 1-Jan-2011 flags '\Deleted'

1. Always test with -n (dry-run) first:

doveadm -n expunge -u testuser@sv.dev mailbox INBOX savedbefore 1-Jan-2011

2. For large mailboxes, consider performance impact and potentially run during off-hours

Verify deletions with search:

doveadm search -u testuser@sv.dev mailbox INBOX savedbefore 1-Jan-2011

Should return no results after successful deletion.