Задать вопрос
@gideon99

Ошибка при запуске скрипта. «ERROR: service.PERM_DENIED (permission denied: only admins can delete from dumpster)»?

Пытаюсь запустить скрипт для очистки почты до определённой даты
#!/bin/bash
export LC_ALL='ru_RU.UTF-8'     #
#
DOMAIN_NAME="terra-minora.ru"      #
BFRDATE="01/01/2021/"           #
EMAIL=/tmp/email.list           #
MESID=/tmp/mesid.list           #
MESID2=/tmp/mesid2.list         #
FLDNM=/tmp/folder.list          #
FLOG=/tmp/process.log           #
#####################################  #####################################
/opt/zimbra/bin/zmprov -l gaa $DOMAIN_NAME | sort > $EMAIL  #
#
#
#
for i in $(cat $EMAIL); #
  do
      echo "Clean email - $i before $BFRDATE" >> $FLOG #
      /opt/zimbra/bin/zmmailbox -z -m $i getallfolders |grep -i mess |sed -e "s/^\s\s*//" |sed -e "s/\s\s*/ /g"| cut -d" " -f5,6,7,8,9 > $FLDNM # 
      cat $FLDNM |while read f; #
          do
              echo "Clean $i folder $f" >> $FLOG #
              /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 # 
              tail $MESID -n +5 > $MESID2 #
              ##
              for a in $(cat $MESID2) #
                  do
                      if [[ $a =~ [-]{1} ]] #
                          then
                              MESSAGEID=${a#-} #
                              /opt/zimbra/bin/zmmailbox -z -m $i deleteMessage $MESSAGEID >> $FLOG #
                          else
                              /opt/zimbra/bin/zmmailbox -z -m $i deleteConversation $a >> $FLOG #
                          fi
                  done
              /opt/zimbra/bin/zmmailbox -z -m $i emptyDumpster #
              rm -f $MESID2 #
          done
  done


получаю ошибку "ERROR: service.PERM_DENIED (permission denied: only admins can delete from dumpster)"
права выдал скрипту
chown -R zimbra:zimbra /opt/zimbra/backup/scripts
chmod +x /opt/zimbra/backup/scripts
запускал через учётку zimbra(su zimbra)
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
@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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы