Удаление старой почты

Какие нужны параметры, для того чтобы почта удалялась как положенно.

Во-первых,

$ 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 неправильно, если он вообще будет работать.