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.