Удаление старой почты
Какие нужны параметры, для того чтобы почта удалялась как положенно.
Во-первых,
$ zmprov gs my_server_name | grep -i purge zimbraMailPurgeBatchSize: 10000 zimbraMailPurgeSleepInterval: 5m
Во-вторых,
$ zmprov gc my_COS | grep -i life zimbraMailMessageLifetime: 31d zimbraMailSpamLifetime: 1d zimbraMailTrashLifetime: 1d
Вот эти 5 параметров необходимых для удаления почты.
Большое внимание нужно уделить параметру.
zimbraMailPurgeSleepInterval: 5m
В веб морде этот параметр нужно установить в 2 местах.
1. Глобальные настройки.
"Время между последовательными очистками почтового ящика"
2. Сервера.
"Время между последовательными очистками почтового ящика"
Этот параметр означает следущее, что через каждые 5 минут будет удаляться почта. Сейчас поясню.
Например у вас есть 10 почтовых ящиков.
Первый ящик у вас будет очищаться в 13.00. Второй ящик у вас будет очищаться 13.05 третий в 13.10 и так далее. То есть за 50 минут у вас очистяться 10 ящиков. Не сложно посчтить за сколько очистяться ваши ящики если их у вас, например 10 000.
!!!При выставлении 1m у меня повис сервак. При выставлении 15 минут (слишком долговато), 5 минут как выяснилось моя комфортная зона!!!
В логах выглядит это следующим образом. (логи хронятся /opt/zimbra/log/mailbox.log )
cat /opt/zimbra/log/mailbox.log | grep -i purge ................... [MailboxPurge] [name=VASIA@MEGODOMEN.RU;mid=482;] purge - Purging messages. [MailboxPurge] [name=VASIA@MEGODOMEN.RU;mid=482;] mailop - Deleting items: 5348,5349,5350,5351. ...................
Скрипт удалять не буду. Потому что это неплохой кастыль. И пока я разбирался с самой проблемой скрипт трудился как часики. В дальнейшем я его переделаю, чтобы он отрабатывал если ящик заполнился на процентов так 80 или 90 (если например письма с большими вложениями). Но это будет потом, сейчас передомной стоит другая задача.
Дальше пост останется без изменений. Дабы История была интересней :).
### Старый пост ###
Была такая проблема, что Zimbra не удаляла старую почту (сроком 31 день). Почтовики понемногу заполнялись (сложная структура писем, очень много народу проверяют с одного ящика), и по мере заполнения мы их чистили ручками. Приятного мало. Да и не всегда об этом вспоминали. Вот, собственно, тут я и задумался. Крутил-вертел Zimbr'у, в общем, понял, что проще будет написать скрипт самому. Начал шерстить по интернету и наткнулся.
http://www.zimbra.com/forums/administrators/32614-solved-delete-mails-vi...
Cкрипт простой, но опять же не автоматический. А я планирую его завести в crontab и запускать где-нибудь в час ночи.
Не долго думая, я сваял свой. Как всегда, всё пытаюсь подробно комментировать.
#!/bin/bash #Разного рода переменные DOMAIN_NAME="megodomen.ru" # имя домена почты EMAIL=/tmp/email.list # список email адресов, существующих в Zimbra MESID=/tmp/mesid.list # список ID сообщений, которые мы хотим удалить ##################################### ТЕЛО СКРИПТА ##################################### /opt/zimbra/bin/zmprov -l gaa $DOMAIN_NAME | sort > $EMAIL # выгружаем почту с Zimbra сортируем и записываем в фаил #теперь находим письма, которые были получены 18 дней назад #именно их мы хотим удалить #и узнаём их ID cat $EMAIL for i in $(cat $EMAIL); do echo "$i" /opt/zimbra/bin/zmmailbox -z -m $i s -l 9999 in:Inbox | grep `date -d '-18 day' +%m/%d/%y`| sed -e "s/^\s\s*//" | sed -e "s/\s\s*/ /g" | cut -d" " -f2 > $MESID ##Теперь мы начинаем эти письма удалять. cat $MESID 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 RES=$? if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi done
Вот такой вот простенький скриптик. Но чтобы было вообще всё понятно, я покажу некоторые выводы команд, для того, чтобы все встало на свои места.
Что делает команда
/opt/zimbra/bin/zmmailbox -z -m $i s -l 9999 in:Inbox
где:
i - это у нас переменная, а именно название почтового ящика.
-l 9999 - (можно ставить больше) это сколько писем мы должно увидеть. По умолчанию вы увидите только 25.
Теперь пример из головы.
Допустим мы хотим почистить почту пользователя VASIA@megodomen.ru допустим X дней назад.
Для начала мы её найдём.
zmmailbox -z -m VASIA@megodomen.ru s -l 9999 in:Inbox | grep `date -d '-X day' +%m/%d/%y`
И видим (тут я заостряю ваше внимание только на самом главном).
28. -6747 conv Рекламисты Инструмен XM/X/11 15:19 29. 6744 conv Мария, Анна (2) Мы ищем XM/X/11 15:00
Я думаю вы заметили тоже, что ID разные. Есть с - и есть без него. Вот это, как бы, и есть разница.
Сейчас поясню - это сообщение.
А без - это тоже сообщение, но называется по другому. В Zimbr'е оно называется conversation (что в переводе с англ. "разговор"). Если вы посмотрите через веб-морду, то увидите такое.

И если вы напишете
zmmailbox -z -m VASIA@megodomen.ru deleteMessage 6744
то получите
ERROR: mail.NO_SUCH_MSG (no such message: 6744)
Хотя оно существет.
Правильная команда для удаления этого сообщения будет такая
zmmailbox -z -m VASIA@megodomen.ru deleteConversation 6744
Но прошу заметить, что если вы напишите
zmmailbox -z -m VASIA@megodomen.ru deleteConversation 6747
а мы помним, что этот ID был -6747,
то мы получим
ERROR: mail.NO_SUCH_CONV (no such conversation: 6747)
Потому что это сообщение относиться к типу Message. А правильная команда будет такой
zmmailbox -z -m VASIA@megodomen.ru deleteMessage 6747
Поэтому скрипт делится, как бы, на 2 части:
1-ая часть удаляет сообщения типа Message:
for a in $(cat $MESID | grep ^- | sed s/-//g ) do /opt/zimbra/bin/zmmailbox -z -m $i deleteMessage $a done
А 2-ая удаляет сообщения типа Conversation:
for a in $(cat $MESID | sed /-/d) do /opt/zimbra/bin/zmmailbox -z -m $i deleteConversation $a done
!!!ВНИМАНИЕ!!!
Я уже писал об этом, но повторюсь. Для приложений надо указывать полный путь. Например,
/opt/zimbra/bin/zmmailbox
Иначе, если вы укажите её через переменную или не с полным путём, скрипт у вас будет работать через crontab неправильно, если он вообще будет работать.