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.