¿Como borrar múltiples mensajes de correo a partir del subject en Zimbra?

0
3415

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 🙂