Проблема наблюдается в апреле-мае 2018 года с Dovecot настроенным работать
с Maildir, при условии, что в этих каталогах есть сообщения созданные
старой версией Dovecot и-или другими программами. Проявляется в том, что:
dovecot не может показать пользователю
некоторые папки на IMAP сервере (например,
код ошибки -1 в TheBat при попытке войти
в каталог)
часть сообщений не удаётся найти поиском
некоторые сообщения "залипают" в папках и не могут быть
удалены иначе как из шелла
doveadm index и doveadm force-resync не приводят к
положительному результату и завершаются с ошибкой, не
создав индексных файлов
Сообщение об ошибке
Вот пример такой ошибки, вызванный искусственно, перименованием
одного файла сообщения:
В Maildir имена файлов сообщений содержат часть имени ,S=1567 -
и тут должен быть точный размер в байтах. Сообщение dovecot не имеет
ни малейшего отношения к файлам индекса и кеша. Оно порождено
исключительно тем, что в некоторых сообщениях число в S= отличается
от реального размера в байтах.
Как чинить
Проще всего переименовать все такие неудачные файлы в соответствии с их
точным размером в байтах. Приведённый скрипт стирает индексные файлы,
находит все неудачные сообщения, проверяет их размер и переименовывает
их. После чего проходит по всем пользователям с index и resync.
cd /usr/local/vpopmail/domains
find ./ -name dovecot.index -delete
find ./ -name dovecot.index.log -delete
find ./ -name dovecot.list.index.log -delete
for i in `find ./ -name *.*.server.sksys.net\,S\=*`; do nname=${i%%,S=*} ; nsize=${i##*=} ; nsize=${nsize%%:*} ; rsize=`stat -f "%z" "$i"`; echo "$nsize - $rsize " ; [ "$nsize" = "$rsize" ] || mv "$i" "$nname,S=$rsize" ; done
cd /usr/local/etc/dovecot
for i in `cat users | awk 'BEGIN { FS=":"; } { print \$1; }'`; do echo $i ; doveadm index -u $i '*' ; doveadm force-resync -u $i '*' ; done