Sie sind hier

Compress maildir with dovecot's zlib plugin

With dovecots zlib plugin, it's possible to have compressed mails in the users maildir.

I've written a script to compress all mails on my mailserver:

#!/bin/sh

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/libexec/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
}

compress_maildir /home/user/.maildir/
chown -R username:users /home/user/.maildir/

If using this script, please do it after an backup/copy of the maildir, the script is far away from being perfect :-)

If the Script is rerun, it checks the files for a Z at the end of the filename, so the file isn't recompressed.

With compressed mails i saved ~25% of space.