Deleting a message per subject via CLI on zimbra
The scenario:
You want to delete a message that has been accidentally sent to a bunch of zimbra users and you need to delete those message with out accessing the mailbox of those who received one by one on the web. So you might be ending doing it on a CLI mode.
Assuming that you able to open one of the message that you need to delete. If you view the full headers, you will find that it contain inside the header a msgid:
sample:
msgid:609947668.476624.1447370486564.JavaMail.zimbra@my.company.com
Assuming the the senders zimbra domain is my.company.company
the contents of the message ID is common to all that received the common message.
assuming that you have a list file at /tmp/userlists.txt containing
user1@my.company.com
user2@my.company.com
user3@my.company.com
user4@my.company.com
user5@my.company.com
I used this command to generate first the user with message ID for deletion. Make sure to run this under zimbra user.
for i in `cat /tmp/userlists.txt`; do echo $i,`zmmailbox -z -m $i s -t message -l 1 "msgid:609947668.476624.1447370486564.JavaMail.zimbra@my.company.com" |grep mess |awk '{print $2,$3,$4,$5}'`; done |tee -a /tmp/outputlist.txt
I pipe the output at /tmp/outputlist.txt
Sample output that will fill the file is below:
user1@my.company.com,57 mess Userx MYSPAM:
user2@my.company.com,1705 mess Userx MYSPAM:
user3@my.company.com,505 mess Userx MYSPAM:
user4@my.company.com,4705 mess Userx MYSPAM:
user5@my.company.com,9715 mess Userx MYSPAM:
The Numbers are the MSG ID
UserX is the sender
MYSPAM is the Subject.
I intended to do it to display the Sender and Subject so to double check that the message ID is the exact ID i need to delete.
The awk part is the one that will display the tab needed.
Now, I need to generate the email and the message ID.
cat /tmp/outputlist.txt |awk '{priont $1}' > /tmp/fordeletelist.txt
Outbut is now a csv.
user1@my.company.com,57
user2@my.company.com,1705
user3@my.company.com,505
user4@my.company.com,4705
user5@my.company.com,9715
Then use bash IFS for the little script.
while IFS=, read USER ID; do echo deleting message id $ID from $USER; zmmailbox -z -m $USER dm $ID; done < /tmp/fordeletelist.txt
It will search the user and the message ID which is the number on the file and will delete it. If you have a thousand to delete, it will be helpfull.
By the way, google and there are also scripts provided already, just modified it for my need.