Exim Remove All messages From the Mail Queue

by on November 19, 2008 · 30 comments· LAST UPDATED November 19, 2008

in , ,

Question: I'm using Exim mail server under CentOS Linux. How do I remove all messages from the Exim mail queue using a shell prompt?

Answer: Exim is a mail transfer agent (MTA) used on Unix-like operating systems. It aims to be a general and flexible mailer with extensive facilities for checking incoming e-mail.

To print a list of the messages in the queue, enter:

# exim -bp

To remove a message from the queue, enter:

# exim -Mrm {message-id}

To remove all messages from the queue, enter:

# exim -bp | awk '/^ *[0-9]+[mhd]/{print "exim -Mrm " $3}' | bash
Dallas Marlow, suggested following clean command:
# exim -bp | exiqgrep -i | xargs exim -Mrm

Further readings:

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 30 comments… read them below or add one }

1 Oldzhay November 19, 2008 at 12:22 pm

Hello,
the most secure thing (and the most ugly one) you can do is delete all files from EXIM input folder (/var/spool/exim/input). The folder that uses exim to keep the mail queue .

EXIM creates 2 files for email – 1 for the headers part and another for the message body. Erasing everything from this folder must erase the queue.

EXIM names the files with the msg_id an put -H or -D part on the end of filename – H for headers an -D for body file

-rw-r-----  1 exim exim 17961 nov 19 12:12 1L2kyk-0007gm-0v-D
-rw-r-----  1 exim exim  1172 nov 19 12:12 1L2kyk-0007gm-0v-H

The solution of Vivek is good, but for less traffic, otherwise if you manage lots of emails I recommend you to rm the files.

One of my cases:
[root@mta1 ~]# exim -bpc
O/p:

213376

… and i afraid i cannot use this solution.

Regards
Ol.
Bulgaria

Reply

2 Oldzhay November 19, 2008 at 12:32 pm

Another solution is put this router in the EXIM configure and run some queue runners – exim -qff&

If you place the router in first place he will delete all messages older than X seconds. 1800 = 30 min.

router_mailxpire:

 driver = redirect
 condition = ${if >= {$message_age}{1800}}
 data = /dev/null
 file_transport = address_file
 no_more

… you are welcome :)

Cheers

Reply

3 nixCraft November 19, 2008 at 12:41 pm

Oldzhay,

Thanks for sharing your solution!

Reply

4 Dallas Marlow November 19, 2008 at 1:04 pm

this is a much cleaner/safer way to do the same thing (using the tools provided by all modern exim installations)

exim -bp | exiqgrep -i | xargs exim -Mrm

exim -bp # this prints the contents of the mail queue
exiqgrep # extracts the id from each mail
xargs exim -Mrm # removes the mail

exiqgrep is pretty flexible (for instance if you wanted to only extract the frozen email id’s used exiqgrep -iz ), exipick is an extension of exiqgrep that can help a bit too.

Reply

5 nixCraft November 19, 2008 at 1:08 pm

Dallas,

The faq has been updated with your command. Thanks for sharing with us!

Reply

6 akbar January 10, 2009 at 3:08 am

Have you been remove about 1200821 queue ?
it wont work with “exim -bp | exiqgrep -i | xargs exim -Mrm” ( I tried to wait until 24hours, it get my swap until 0 free)
so it must use script to remove the queue, in my case:
-list all directory in ‘input’ folder:
cd /var/spool/exim/input ; ls >> /tmp/folder
-create a script name “removeall”
echo “for b in `ls` ; do rm -f $b ; done” >> /tmp/removeall ; chmod 700 /tmp/removeall
- go to input folder and exec command
for a in `cat /tmp/folder` ; do cd $a ; /tmp/removeall ; cd .. ; done

and it work great :)

Reply

7 adib ramezany October 21, 2013 at 4:46 pm

fastest solution to remove all emails in exim queue (less than 5sec) :
do these commands :

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

.
.
.
enjoy it !!

Reply

8 Doeke November 15, 2013 at 12:29 pm

You just saved my life! thanks!

Reply

9 Melvin February 5, 2014 at 2:49 am

Kudos!

Reply

10 Gabriel M February 4, 2009 at 2:09 am

Thanks Oldzhay for you router to delete messages older than x seconds, I will definately test & apply in my setup.

Reply

11 Houssam Ballout June 7, 2009 at 12:13 pm

Well, I remove all the messages in the queue but still am not able to send any mail :(

Reply

12 Oldzhay June 8, 2009 at 8:42 am

“Well, I remove all the messages in the queue but still am not able to send any mail”
…this is another problem. Can you post some log here pls, and we can look for a solution

Reply

13 Tyler August 15, 2009 at 7:52 am

akbar:

Your function can be simplified as:
for dir in /var/spool/exim/input/*; do cd $dir; ls | xargs rm -f; done

Of course, if your intention is to simply remove all files (not directories) underneath /var/spool/exim/input, that process can be simplified as follows:

find /var/spool/exim/input -type f -exec rm -f {} +

Of course, this assumes that there are no files below input that shouldn’t be deleted.

Reply

14 loser February 17, 2014 at 7:32 pm

hahaha how bout leave the programming to the real men. Take your pathetic code somewhere else.

Reply

15 Prashant Naik August 29, 2009 at 2:42 pm

To check the no. of mails in the queue use the command
exim -bpc

To check the list of pending mails use
exim -bp

To deliver the mails use
exim -qf -d

If working on a Server then check the load on it (using the command w ) and if the load is not high (less than 1.o) then you could also set 1 or 2 mail runners (do not set more than 2 as the load on the server may increase) using the command
exim -qf &

Reply

16 J. Ruiz April 7, 2010 at 1:57 pm

Hello,

About the Dallas Marlow comment:

It’s possible to do it without the “exim -bp” command.

The command “exiqgrep -i | xargs exim -Mrm” does exactly the same, because exiqgrep looks up the queue by itself.

Regards,

J. Ruiz

Reply

17 bony October 7, 2010 at 3:48 am

i want to remove 4000 messages

Reply

18 Reikor April 22, 2011 at 7:03 am

I client of my have been hacked and they sent about 40 millions of mails.
I have all of them in the input folder, i cant ls, du or nothing, this is a sh*t.
Anyone have some script that do this really fast ? i dont want to wait 1 month for clean up.

Reply

19 rossixx May 23, 2011 at 11:07 am

here is a good solution:

exim -bpru|awk {‘print $3′}|xargs exim -Mrm

Reply

20 Luis Santana August 25, 2011 at 11:36 pm

Another command which can be used for this is the following

exim -bp |awk {‘print $3′} |xargs exim -Mrm

Reply

21 Eric Gillette October 22, 2011 at 12:28 am

Tyler,

Thanks for your post — I saw what Akbar was trying to accomplish, but was wondering if there was a simpler way to do, and then I read down further to your post.

I had a client who had over 300,000 messages in the Exim Queue after his server was compromised by a PHP script and using exiqgrep didn’t seem to work (since I imagine exiqgrep doesn’t expect to encounter that many messages in Exim’s queue in the first place).

I created a shell command out of your command there, and ran it, and voila — everything is back to normal.

In addition, I think it may be of note to mention that configserver.com makes two applications that are free for WHM called CMM (Mail Manager) and CMQ (Mail Queue Manager) which help with these kinds of issues, but of course if you have a massive queue (300,000 messages for example) they won’t really help much, since they also use Exim’s built-in toolset to run the commands.

Thanks again Tyler! =0)

Reply

22 Thiwanka November 24, 2011 at 1:34 pm

Thanks Tyler. It works.!

Reply

23 swapz February 15, 2012 at 3:42 pm

Hi all,

Not working for me :(
I am new to linux

and while executing

for dir in /var/spool/exim/input/*; do cd $dir; ls | xargs rm -f; done

and

find /var/spool/exim/input -type f -exec rm -f {} +

It’s showing read only file system can not removed…

plz let me know what I am missing …

Thanks to all…. :)

Reply

24 Mahbubur July 10, 2012 at 8:41 pm

This works as well which is much simplier:

exiqgrep -i | xargs exim -Mrm

Example:

# exim -bp
9h 2.2K 1SoYFB-00082u-Lk *** frozen ***
root@host
9h 2.2K 1SoYFB-00082z-OB *** frozen ***
root@host
9h 2.2K 1SoYFB-000834-Qv *** frozen ***
root@host
9h 53K 1SoYFB-000839-TW *** frozen ***
root@host

# exiqgrep -i | xargs exim -Mrm
Message 1SoYFB-000834-Qv has been removed
Message 1SoYFB-00082u-Lk has been removed
Message 1SoYFB-000839-TW has been removed
Message 1SoYFB-00082z-OB has been removed

Reply

25 Karthik July 9, 2013 at 9:19 pm

Can any one help me to use this exim mail queue delete command in cronjob

exim -bp | awk ‘/^ *[0-9]+[mhd]/{print “exim -Mrm ” $3}’ | bash

exim -bp | exiqgrep -i | xargs exim -Mrm

either of these commands in cron job

I run a cpanel server.

Reply

26 Drew July 26, 2013 at 1:08 am

Can you use just:
exiqgrep -i | xargs exim -Mrm

To remove all emails from the queue? Is exim -bp needed?

Reply

27 Poorya December 17, 2013 at 7:26 am

Hello
Can you guys guide me to how write a cronjob to remove any email in queue which was in the queue for more than 1 hour.
I’m not sure if I should to put the script in the crontab or rounter field in exim configuration ?

Reply

28 Amir February 1, 2014 at 5:01 pm

Hi I am a newbie here. I have got more than 400K emails in queue. Can anyone help me to delete them at once.

Thanks!

Reply

29 Poorya February 5, 2014 at 6:11 am

Amir
Login to your server as root from ssh and run the bellow command and wait for queue to get empty :

exim -bp | awk ‘/^ *[0-9]+[mhd]/{print “exim -Mrm ” $3}’ | bash

Reply

30 Amir February 17, 2014 at 8:11 pm

Thanks man, but this is the same mentioned in the article. However I tried but it is a huge queue.
More than 1600000 emails are in queue. Is there any other way to delete the folder or something similar.

Reply

Leave a Comment

Tagged as: , , , , , , , , , , , , , , , , , , , ,

Previous Faq:

Next Faq: