El siguiente shell script nos permite buscar y borrar un correo NO deseado usando los comandos: zmmailbox y zmprov mediante CLI en Linux.
Resulta bastante útil y en especial cuando son varias las cuentas de correo electrónico que son afectadas y, hacerlo vía web resulta bastante engorroso.
El script obtiene primero una lista de las cuentas existentes en el servidor de correo electrónico usando el comando: (zmprov -l gaa [opcional <domain.com>]).
Una vez que se tenga la cuenta de correo electrónico, se usa el comando zmmailbox para buscar dentro de la cuenta de correo electrónico el mensaje que se desea eliminar filtrando el ID y asi poder eliminarlo. A continuación se anexa el shell-script.
#!/bin/bash # # borrar-mensajes-zimbra.sh: Shell Script para eliminar los mensajes de # correo electronico a partir del Subjetc # # Created by: LCC. Domingo Varela Y. # Date: 20:05:00 23/Jul/2021 # Modified: 21:13:40 27/Jul/2021 # Last Modified: 21:40:18 30/jul/2021 # Probe: True # # Settings Cero="0" MSG="Mail Delivery System" zimbraCMD='/opt/zimbra/bin/zmmailbox' Count=1 C=1 if [ `id -u` != "0" ]; then echo "This script must be run as root or sudo" exit 1 fi for a in `/opt/zimbra/bin/zmprov -l gaa midominio.com` do echo $zimbraCMD -z -m $a search "$MSG" |grep conv |awk {'print $2'} |sed 's/-//g' > /tmp/id-tmp.txt emailID=`$zimbraCMD -z -m $a search "$MSG" |grep conv |awk {'print $2'} |sed 's/-//g'| grep -E ^\-?[0-9]+$ | wc -l ` Num=`cat /tmp/id-tmp.txt | wc -l` if [ "$emailID" -gt $Cero ]; then echo "Found '$emailID' messages in '$a' for deleted... " for ID in `cat /tmp/id-tmp.txt | awk '{print $1}'` do #echo "$zimbraCMD -z -m $a dm $ID" $zimbraCMD -z -m $a dm $ID echo "'$Count'.- Message ID '$ID' Deleted in account '$a' No '$C'" #sleep 1 let C=C+1 done C=1 else echo "'$Count'.- Not found messages in account '$a'..." fi let Count=Count+1 done # ## #
Finalmente, si lo que desea es pasar como argumentos la cadena a eliminar dentro del correo electrónico para que éste sea eliminado, es necesario colocar el siguiente código justo debajo del primer if ..then .. fi. Y cambiar $MSG por $1
if [ $# -eq 0 ]
then
echo "Usage: $0 "\"String to remove between double quotes"\" "
exit 1
fi
$zimbraCMD -z -m $a search "$1" |grep conv |awk {'print $2'} |sed 's/-//g' > /tmp/id-tmp.txt emailID=`$zimbraCMD -z -m $a search "$1" |grep conv |awk {'print $2'} |sed 's/-//g'| grep -E ^\-?[0-9]+$ | wc -l `
Y el script se ejecutaría por ejemplo:
~]$ bash borrar-mensajes-zimbra.sh "cadena a eliminar"
En caso de que existieran muchas cuentas de correo electrónico es una buena idea usar comando nohup de la siguiente manera:
~]$ nohub bash borrar-mensajes-zimbra.sh "cadena a eliminar" &
ó
~]$ nohub ./borrar-mensajes-zimbra.sh "cadena a eliminar" &
Y si dispone de una serie de palabras que desea eliminar en las cuentas de correo electrónico, estas las deberán de estar en un archivo y usar cualquier ciclo for o while justo debajo del primer ciclo for y se tendría que cambiar una vez más de $1 a $MSG, comentando el siguiente código.
if [ $# -eq 0 ]
then
echo "Usage: $0 "\"String to remove between double quotes"\" "
exit 1
fi
Suerte 🙂