Задать вопрос
  • Ошибка при запуске скрипта. "ERROR: service.PERM_DENIED (permission denied: only admins can delete from dumpster)"?

    @Shura43
    Используй ключ -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
    Ответ написан
    Комментировать