Messages are frozen when the mail server has determined it cannot do anything to deliver the message. (they can also be manually frozen).
Exim has option to set how long frozen messages are kept on the system.
On a Debian/Ubuntu based install the /etc/exim4/conf.d/main/02_exim4-config_options file has the option timeout_frozen_after = 7d. Which means messages frozen for 7 days will get expunged.
Frozen messages really shouldn't be a problem on most systems. They are often just spam messages that can't get properly delivered.
If you have to deal with freezed mails from the exim mail server, unlike postfix, where there is no "freeze" scheme but the messages just stuck in the queue and you might want to simply ask the mail server to resend failed to deliver messages once again through a simple:
# postqueue -f
With exim to ask the server to resend the freeze-d states messages there is another aproach:
It is for this reason that I am writing this post to share how you can ask the exim to resend the "frozen" messages, as on exim there is no so much straight forward way.
To find out what letters are stored in the exim queue run
# exim -bp
To unfreeze the messages a simple while loop can be written, which lists all frozen state messages and unfreezes these letters one by one in a cycle:
# exim -bp | grep -i frozen | awk '{print $3}' | while read LINE; do exim -Mt $LINE; done
Another approach to unfreeze the frozen multitude of messages which should be a bit quicker if you have to do it for a very large amount of frozen states mails is to use xargs command:
# mailq | grep frozen | awk '{print $3}' | xargs exim -v -M
Since we on exim topic in this article, for starters with Exim, here is few other useful exim queue commands, that might be beneficial if you have to deal with EXIM SMTP.
Attempting to send a mail with a specified ID
# /usr/sbin/exim -M email-id
Forcefully run another queue to execute
# /usr/sbin/exim -qf
We see the logs related to letter
# /usr/sbin/exim -Mvl messageID
To see the body of the letter
# /usr/sbin/exim -Mvb messageID
To see the beginning (header) of the letter only
# /usr/sbin/exim -Mvh messageID
Deletes the mail without sending any error messages
# /usr/sbin/exim -Mrm messageID
Shows the number of letters in the queue
# /usr/sbin/exim -bpr | grep "<" | wc -l
Shows the number of frozen mails in the queue
# /usr/sbin/exim -bpr | grep frozen | wc -l
Deletes all frozen letters
# /usr/sbin/exim -bpr | grep frozen | awk {'print $3'} | xargs exim -Mrm
To remove a message from the Exim queue
# exim -Mrm {message-id}
Remove all messages from the Exim queue
# exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash
Another way to do it:
# exim -bp | exiqgrep -i | xargs exim -Mrm
Fastest solution to delete all emails in exim queue (for less than 5 seconds) is
# cd /var/spool
# mv exim exim.old
# mkdir -p exim/input
# mkdir -p exim/msglog
# mkdir -p exim/db
# chown -R mail:mail exim
# /sbin/service exim restart
or if you have AV / AntiSpam integrated to mail server:
# cd /var/spool
# mv exim exim.old
# mkdir -p exim/db
# mkdir -p exim/input
# mkdir -p exim/msglog
# mkdir -p exim/scan
# chown -R mail:mail exim
# /sbin/service exim restart
Deletes the entire exim queue
# /usr/sbin/exim -qff