I was getting an error about the file size being too large.
May 4 17:42:57 ns1 dovecot: imap(jdavis)<21859><XXXXXXXXX/YYYYYYYYY>: Error: Corrupted record in index cache file /home/jdavis/Maildir/.Archivedir/dovecot.index.cache: UID 1: Broken physical size in mailbox Archivedir: read(zlib(/home/jdavis/Maildir/.Archivedir/cur/1111111111.M555555P333V000000000000FD05I0001A11F_2212.mailhost,S=9794:2,SZ,Z)) failed: Cached message size larger than expected (9794 > 3254, box=Archivedir, UID=1)
I might have clobbered some things while trying to fix it, so I restored a backup to maildir.tmp, and did the following to try to repair/rebuild.
################################ ### Clean up the restored mail repo ################################ cd /storage/uploads/CustomerImages/mailtemp/Maildir.tmp for i in .[a-zA-Z]*/cur/* ; do rm cur/`basename $i` ; done IFS=$'\n' for i in $(find . -type f); do if file "$i" |grep gzip >/dev/null; then # echo "Extracting GZIP:" "$i" mv "$i" "$i".gz gunzip "$i".gz fi done & for i in $(find . -type f); do if file "$i" |grep bzip2 >/dev/null; then # echo "Extracting BZIP2:" "$i" bunzip2 -q "$i" mv "$i".out "$(echo $i |sed 's/.out//')" fi done & ################################ ### Copy in the missing or damaged files ################################ cd /home/jdavis/Maildir for i in .[a-zA-Z]* [a-z]* ; do rsync -avS --partial /storage/uploads/CustomerImages/mailtemp/Maildir.tmp/Maildir/"${i}" ./ ; done for i in .[a-zA-Z]*/cur/* ; do rm cur/`basename $i` ; done IFS=$'\n' for i in $(find . -type f); do if file "$i" |grep gzip >/dev/null; then # echo "Extracting GZIP:" "$i" mv "$i" "$i".gz gunzip "$i".gz fi done & for i in $(find . -type f); do if file "$i" |grep bzip2 >/dev/null; then # echo "Extracting BZIP2:" "$i" bunzip2 -q "$i" mv "$i".out "$(echo $i |sed 's/.out//')" fi done & ################################ ### Now, remove duplicates ################################ find /storage/uploads/CustomerImages/mailtemp/Maildir.tmp /home/jdavis/Maildir -type d -exec fdupes -dNI {} \; ################################ ### Now, recompress it all ################################ compress_maildir () { cd $1 DIRS=`find -maxdepth 2 -type d -name cur` for dir in $DIRS; do echo $dir cd $dir FILES=`find -type f -name “*,S=*” -not -regex “.*:2,.*Z.*”` #compress all files for FILE in $FILES; do NEWFILE=../tmp/${FILE} #echo bzip $FILE $NEWFILE if ! bzip2 -9 $FILE -c > $NEWFILE; then echo compressing failed exit -1; fi #reset mtime if ! touch -r $FILE $NEWFILE; then echo setting time failed exit -1 fi done echo Locking $dir/.. if PID=`/usr/lib/dovecot/maildirlock .. 120`; then #locking successfull, moving compressed files for FILE in $FILES; do NEWFILE=../tmp/${FILE} if [ -s $FILE ] && [ -s $NEWFILE ]; then echo mv $FILE $NEWFILE mv $FILE /tmp mv $NEWFILE ${FILE}Z else echo mv failed exit -1 fi done kill $PID else echo lock failed exit -1 fi cd – >/dev/null done } ################################ ### Actually RUN the script to compress all maildir files ################################ ./compress_maildir /home/jdavis/Maildir/ &
Related: http://omnitech.net/news/2015/11/14/compressed-dovecot-maildir/