Назад | Перейти на главную страницу

Dovecot отключает сжатие zlib и распаковывает существующие сообщения

После обновления dovecot до 2.1.7 (wheezy) индексные файлы почтовых ящиков кажутся поврежденными. Обычно dovecot исправляет их автоматически, но из-за сжатия zlib не может определить правильный размер сообщения.

Error: Corrupted index cache file ...
Input/output error (FETCH for mailbox INBOX UID ...
Maildir filename has wrong S value ...

Теперь я бы хотел полностью отключить плагин zlib и распаковать существующие сообщения. Испытания с dsync не увенчались успехом, потому что dsync вообще не распаковывает их.

Есть предложения, как с этим бороться?

Насколько мне известно, размер сообщения определяется атрибутом ", S = 12345" в имени файла. Они предоставляют сценарий Perl, который может рекурсивно сканировать один или несколько почтовых серверов с возможностью извлечения файлов, сжатых zlib, определения фактического размера сообщения и записи его в имени файла.

Я имею в виду информацию, найденную здесь: http://www.dovecot.org/list/dovecot/2013-January/087953.html

Скрипт доступен по адресу http://dovecot.org/tools/maildir-size-fix.pl

Возможно, вам придется изменить некоторые переменные конфигурации в сценарии или определить, какие параметры доступны - по крайней мере, я сам не нашел документации по использованию сценария, но конфигурация в начале сценария довольно понятна.

Для меня это сработало как шарм, пока никаких недостатков не было.

Изменить: параметры использования командной строки находятся в комментариях за переменными конфигурации. Так что сканировать через maildir /home/myuser/.maildir/ и исправьте все размеры сообщений, вам нужно будет запустить ./maildir-size-fix.pl -a -f -c -r /home/myuser/.maildir/ где

  • -a добавляет размер, если он отсутствует
  • -f исправляет размер, если он неправильный
  • -c проверяет, сжат ли файл, и если да, извлекает его, чтобы определить правильный размер
  • -r сообщает скрипту рекурсивно проходить через все подпапки

Вам нужно иметь gunzipи bunzip2 бинарные файлы, установленные для работы последнего; также, cat, wc и awk необходимо установить, что должно быть во всех основных дистрибутивах Linux.

#!/bin/bash 
IFS=$'\n'

for i in $(find /var/vmail -type f); do

    if file "$i" |grep gzip >/dev/null; then
#       echo "Extracting GZIP:" "$i" 
        mv "$i" "$i".gz
        gunzip "$i".gz

    elif file "$i" |grep bzip2 >/dev/null; then
#       echo "Extracting BZIP2:" "$i"
        bunzip2 -q "$i"
        mv "$i".out "$(echo $i |sed 's/.out//')"
     fi

done