Есть удаленно работающий почтовый сервер Zimbra 8.6.0_GA_1153 на 1000 пользователей и 4 Тб дискового пространства для почты. 90% этого пространства занято. ОС — Ubuntu. Необходимо: архивировать почту старше 1 года и удалить эти письма из почтовых ящиков.
Вот мой кривой костыль вариант на основе постов CentOS: Zimbra — переносим почтовые ящики с сервера на сервер
и Zimbra: удаление случайных или ненужных писем
Первым делом останавливаем наш старый почтовый сервер
zimbra # zmcontrol stop
При помощи команды из под пользователя zimbra # выгрузим список всех e-mail адресов в файл, zimbra # zmprov gqu mail | awk '{print $1}' > /tmp/mailbox.txt
затем при помощи скрипта, что бы не бекапить каждый ящик в ручную, заархивируем все письма, старше 400 дней. В первой части команды извлекаем их, затем grep выбирает только старые письма и передает их на архивирование.
#!/bin/bash filename='mailbox.txt' filelines=`cat $filename` for line in $filelines ; do /opt/zimbra/bin/zmmailbox -z -m $line getRestURL «//?fmt=tgz» > /tmp/$line.tgz done
Уверен, что удаление этих писем после архивирования можно выполнить простым способом. Именно в этом прошу подсказки. В настоящее время планирую решать это по информации из хабрахабра так:
#!/bin/bash
DOMAIN_NAME=«corp.org» # Тут домен EMAIL=/tmp/email.list # Это список всем ящиков MESID=/tmp/mesid.list # это ID писем для удаления DELTEXT='вечеринка' # Слово в теме письма или сама тема письма
IFS=$'\n' # Переменная отвечающая за разделитель поля
before=«$(date +%s)» # Время запуска скрипта t=0 # Переменная, для подсчета удаленных писем
/opt/zimbra/bin/zmprov -l gaa $DOMAIN_NAME | sort > $EMAIL # Собираем список ящиков
# Ну и циклом их перебираем
for i in $(cat $EMAIL); do echo $i # Тут мы получаем список всех папок, отсеим папки которые расшаренные, так как они и так будут пройдены и исключаем папки, которые не почтовые - это Портфель, и Контакты и прочие, не mess
/opt/zimbra/bin/zmmailbox -z -m $i gaf | grep mess | cut -d"/" -f 2- | grep -v «@corp.org» > /tmp/messfolder.list # Теперь циклом проходим по списку и получаем название папки, затем всталяем в запрос и получаем id сообщения для удаления. И так проделываем с каждой папкой.
for p in $(cat /tmp/messfolder.list); do echo $p # Тут все просто: до первого grep мы выводим сообщения из ящика, grep фильтрует по дате, второй grep по теме, затем sed'ы убирают лишние пробелы и cut вырезает остаток и получаем чистый, фильтрованный номер сообщения. /opt/zimbra/bin/zmmailbox -z -m $i s -l 300 in:«\»$p"\" | grep `date -d '-5 day' +%m/%d/%y` | grep «$DELTEXT» | sed -e «s/^\s\s*//» | sed -e «s/\s\s*/ /g» | cut -d" " -f2 > $MESID
# Выводим номер сообщения и считаем кол-во сообщений. cat $MESID count=`grep " $MESID -c` let t=$t+$count
for a in $(cat $MESID | grep ^- | sed s/-//g ) do /opt/zimbra/bin/zmmailbox -z -m $i deleteMessage $a done
for a in $(cat $MESID | sed /-/d) do /opt/zimbra/bin/zmmailbox -z -m $i deleteConversation $a done echo -n > $MESID RES=$? if [ «$RES» == «0» ]; then echo "[Ok]"; else echo "[Err]"; fi
done
echo «Найдено писем: »$t
done
after=«$(date +%s)» elapsed=«$(expr $after - $before)» hours=$(($elapsed / 3600)) elapsed=$(($elapsed - $hours * 3600)) minutes=$(($elapsed / 60)) seconds=$(($elapsed - $minutes * 60)) echo «Скрипт выполнялся: $hours часов $minutes минут $seconds секунд» echo «Всего удалено: »$t" писем"