После обновления 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