Zimbra – borrar multiples mensajes de correo a partir del Subject usando zmmailbox
Usar zmmailbox para buscar y borrar un mensaje de correo es bastante útil en especial cuando son varias cuentas de correo afectadas y hacerlo vía web resulta bastante moroso.
Este script ayuda a realizar una búsqueda del mensaje de correo de una cuenta (o varias) a partir del «subject», una vez detectado, se recupera el Id del mensaje para luego ser eliminado.
Nota:
Este script es una mejora al aporte de King0070 que se encuentra en el wiki de Zimbra.
Procedimiento
En el servidor de correo, crea un archivo en /root
(o en /opt
) con el nombre delmsg-zcs.sh
y pega el siguiente contenido:
(También puedes descargarlo de este enlace, se debe descomprimir.)
#!/bin/bash # Script que borra mensajes de correo a partir del subject utilizando zmmailbox # ---www.lastlogin.org--- # Como parámetros se necesita la cuenta y la cadena del subject # Por defecto dry=0 para evitar que el script se ejecute y borre mensajes sin previa revision dry=0 # Por defecto solo se mostrará como resultado un mensaje que coincidan con la cadena de busqueda (de fecha mas reciente) cant=1 #Numero de mensajes encontrados num_msg=0 if [ $# -ne 2 ] then echo "Uso: delmsg-zcs.sh cuenta \"subject\"" exit 0 fi # Validando la cuenta (/opt/zimbra/bin/zmprov ga $1 > /dev/null) 2> /dev/null if [ $? -ne 0 ] then echo "$cuenta No es una cuenta valida" exit 0 fi # Por defecto el comando siguiente busca el mensaje de acuerdo a la cadena solicitada, si no existe envia # a la salida standard una linea indicando el numero (en este caso 0) de mensajes encontrados. echo "Buscando los mensajes de la cuenta $1" /opt/zimbra/bin/zmmailbox -z -m $1 s -l $cant -t message "subject:($2)" echo "Almacenando el Id de los mensajes encontrados en un archivo temporal" /opt/zimbra/bin/zmmailbox -z -m $1 s -l $cant -t message "subject:($2)"|awk '{ if (NR!=1) {print}}' | grep -v -e Id -e "-" -e "^$" | awk '{ print $2 }' > /tmp/id_msg num_msg=`cat /tmp/id_msg|wc -l` if [ $num_msg -eq 0 ] then echo "No se encontro ningun mensaje con la cadena de Subject descrita" exit 0 fi echo "Procediendo a realizar el borrado de $num_msg mensaje(s) de la cuenta $1" if [ $dry -eq 0 ] then echo "---MODO DRY---" echo /opt/zimbra/bin/zmmailbox -z -m $1 dm $msg echo "----CAMBIA LA VARIABLE dry DE 0 a 1 PARA SALIR DE ESTE MODO----" exit 0 else for msg in `cat /tmp/id_msg` do echo "Mensaje $msg borrado" /opt/zimbra/bin/zmmailbox -z -m $1 dm $msg done fi
cambia los permisos de ejecución
[root@correo ~]# chmod u+x delmsg-zcs.sh
Estamos listos para usarlo:
[root@correo ~]# ./delmsg-zcs.sh Uso: delmsg-zcs.sh cuenta "subject"
Consideraciones:
- Para un correcto uso, se recomienda que la cadena de Subject sea exactamente igual al del mensaje que queremos borrar.
[root@correo ~]# ./delmsg-zcs.sh mikeyl@lastlogin.org "Dell Technologies Global Partner Kickoff is LIVE" Buscando los mensajes de la cuenta mikeyl@lastlogin.org num: 1, more: false Id Type From Subject Date ---- ---- -------------------- -------------------------------------------------- -------------- 1. 1561 mess Dell Dell Technologies Global Partner Kickoff is LIVE 02/06/20 16:07 Almacenando el Id de los mensajes encontrados en un archivo temporal Procediendo a realizar el borrado de 1 mensaje(s) de la cuenta myucra@redcetus.com ---MODO DRY--- /opt/zimbra/bin/zmmailbox -z -m mikeyl@lastlogin.org dm ----CAMBIA LA VARIABLE dry DE 0 a 1 PARA SALIR DE ESTE MODO----
- El script tiene una variable llamada dry con valor 0, para evitar ejecute el borrado antes de estar seguro de hacerlo, se debe cambiar a 1 para que funcione (línea 6 del script).
- Existe además, la variable cant con valor 1 (línea 8), que indica la cantidad de mensajes que coincidan con la cadena que se busca, se puede modificar al valor que se desee (1000 es el valor más alto).
El script es muy útil cuando se requiere borrar mensajes que se repiten en varias cuentas de correo. Para que cumpla esta función podemos utilizar un bucle con que recorra el listado de las cuentas de correo y dentro colocar el script que tenemos.
[root@correo ~]# for i in `/opt/zimbra/bin/zmprov -l gaa` > do > ./delmsg-zcs.sh $i "Dell Technologies Global Partner Kickoff is LIVE" > done
El truco:
Para que el comando zmmailbox cumpla su proposito y filtrar lo que se requiere (el id del mensaje), se debe añadir tuberías y unirlo con el comando grep (para quitar los mensajes Id Type From Subject incluyendo los «—–«), una vez hecho esto usamos awk para obtener el segundo campo (sí, el id) y llevarlo a un archivo (línea 29).
Una vez obtenido el id, procedemos a usar la opción dm que tiene zmmailbox (línea 51).
Usa la ayuda de zmmailbox para saber las opciones adicionales que tiene.
[zimbra@correo ~]$ zmmailbox help search search(s) [opts] {query} -p/--previous previous page of search results -s/--sort <arg> sort order TODO -c/--current current page of search results -t/--types <arg> list of types to search for (message,conversation,contact,appointment,document,task,wiki) -v/--verbose verbose output -l/--limit <arg> max number of results to return (1-1000, default=25) --dumpster search in dumpster -n/--next next page of search results searchConv(sc) [opts] {conv-id} {query} -p/--previous previous page of search results -s/--sort <arg> sort order TODO -c/--current current page of search results -t/--types <arg> list of types to search for (message,conversation,contact,appointment,document,task,wiki) -v/--verbose verbose output -l/--limit <arg> max number of results to return (1-1000, default=25) -n/--next next page of search results
Este script es para fines demostrativos, usalo bajo tú riesgo, cualquier feedback es bienvenido.