Используй ключ -A
/opt/zimbra/bin/zmmailbox -z -m $i -A emptyDumpster #
Но еще лучше удалять не по одному письму, а партиями. Кроме того, в папке может быть больше 999 писем, и не забываем про квоту.
#!/bin/bash
export LC_ALL='ru_RU.UTF-8' #для возможности работы с русскими наименованиями папок в почте
#Разного рода переменные
DOMAIN_NAME="domain.name" # домен для очистки
BFRDATE="01/01/2021/" # дата ДО которой надо очистить почту
EMAIL=/tmp/email.list # список email адресов, существующих в Zimbra
MESID=/tmp/mesid.list # список ID сообщений, которые мы хотим удалить
MESID2=/tmp/mesid2.list # comma-separated message ID list
MESID3=/tmp/mesid3.list # comma-separated conversation ID list
FLDNM=/tmp/folder.list # список дерева папок пользователя в которых хранятся сообщения
FLOG=/tmp/process.log # логирование процесса очистки
##################################### ТЕЛО СКРИПТА #####################################
/opt/zimbra/bin/zmprov -l gaa $DOMAIN_NAME | sort > $EMAIL # выгружаем почту с Zimbra сортируем и записываем в фаил
#теперь находим письма, которые были получены ДО определенной даты
#именно их мы хотим удалить
#и узнаём их ID
for i in $(cat $EMAIL); # берем список всех email
do
echo "Clean email - $i before $BFRDATE" >> $FLOG #пишем в лог почтовый ящик и дату до которой очищаем
QUOTA=$( /opt/zimbra/bin/zmprov -l ga $i zimbraMailQuota |grep Quota |sed -e "s/^\s\s*//" |sed -e "s/\s\s*/ /g" | cut -d" " -f2 ) #считываем квоту пользователя
let NEWQUOTA=$QUOTA+$QUOTA #вычисляем новую квоту
echo "Set quota to $NEWQUOTA (was $QUOTA)" >> $FLOG #пишем в лог новый и старый размер ящика
/opt/zimbra/bin/zmprov -l ma $i zimbraMailQuota $NEWQUOTA #временно удваиваем квоту ящика
/opt/zimbra/bin/zmmailbox -z -m $i getallfolders |grep -i "mess\|LostN" |sed -e "s/^\s\s*//" |sed -e "s/\s\s*/ /g"| cut -d" " -f5,6,7,8,9 > $FLDNM # получаем все папки пользователя
cat $FLDNM |while read f; # берем полученный список папок и в каждой ищем ID сообщений для удаления, пока подходящие письма не закончатся
do
echo "Clean $i folder $f" >> $FLOG # пишем в лог какую папку сейчас очищаем
while true; do
/opt/zimbra/bin/zmmailbox -z -m $i search -l 999 "in:\"$f\" (before:$BFRDATE)" |sed -e "s/^\s\s*//" |sed -e "s/\s\s*/ /g" | cut -d" " -f2 > $MESID # ищем в папке нужные ID сообщений для удаления
# у Zimbra есть сообщения и есть разговоры и удаляются они по разному, у сообщений перед ID стоит знак "-", у разговоров его нет.
tail $MESID -n +5 | grep - | cut -c2- |awk '{print}' ORS=',' >$MESID2 # Получаем список ID сообщений, разделенных запятыми
tail $MESID -n +5 | grep -v '-' |awk '{print}' ORS=',' >$MESID3 # Получаем список ID разговоров
if [ -s $MESID2 ]
then #удаляем сообщения
echo "deleteMessage $(<$MESID2)" >> $FLOG # пишем в лог удаляемые сообщения
/opt/zimbra/bin/zmmailbox -z -m $i deleteMessage $(<$MESID2) >> $FLOG # удаляем сообщение, пишем в лог, в случае удачного удаления в лог ничего не запишется, в случае неудачного запись внесется в лог.
fi
if [ -s $MESID3 ] && ! [ "," == "$(<$MESID3)" ]
then #удаляем разговоры
echo "deleteConversation $(<$MESID3)" >> $FLOG # пишем в лог удаляемые разговоры
/opt/zimbra/bin/zmmailbox -z -m $i deleteConversation $(<$MESID3) >> $FLOG # аналогично только удаляем полностью разговор
fi
[[ -s $MESID2 ]] || [[ -s $MESID3 ]] || break; # если оба списка пустые - выходим
done
done
/opt/zimbra/bin/zmmailbox -z -m $i -A emptyDumpster #очистка корзины
/opt/zimbra/bin/zmprov -l ma $i zimbraMailQuota $QUOTA #возвращаем квоту ящика
done