Pst2md

De www.blorand.org
Aller à : navigation, rechercher
pst2md (lire pst to maildir) est un script qui permet la conversion d'un pst vers un maildir sans utiliser de client de messagerie. Il s'avère très pratique lors de la migration de plusieurs boites mails dans un réseau.
En recherchant sur internet, j'ai vu que beaucoup de gens déplaçaient simplement les mails via Outlook du pst vers le compte imap. Cette manipulation est très longue et fastidieuse, aussi elle n'est pas toujours sans erreur. J'ai donc développé ce script à partir d'outils que l'on trouve sur le net.
  • Patch :
J'ai du créer ce patch pour que convmv puisse convertir l'utf8 du pst vers utf7 modifié qu'utilise l'IMAP.

convmv-utf7imap.patch

--- convmv      2010-09-03 14:36:52.000000000 +0200
+++ convmv      2010-09-03 14:36:02.000000000 +0200
@@ -246,6 +246,7 @@
#use Encode 'is_utf8';
use Unicode::Normalize;
use utf8;
+use Encode::IMAPUTF7;
use bytes;

Getopt::Long::Configure ("bundling");
  • pst2md :
Voici le script bash qui associe ces différents programmes.

pst2md.sh

#!/bin/sh
PST2MDCONF=/etc/pst2md.conf

usage() {
        echo "usage :"
        echo "$0 -p file1.pst [-p file2.pst] ..."
        echo "$0 -c <config file> (default /etc/pst2md.conf)"
        echo "$0 -h"
        echo ""
        echo "Your Maildir will be created in $PWD with pst.XXXXX folder's name"
}

remove_mbox() {
while read line ; do
        if [ -d "$line.mbox" ] ; then
                rm -r "$line" && mv "$line.mbox" "$line"
        fi
done
}

remove_dot() {
while read line ; do
        DIRPATH=`echo "$line" | sed 's@^\(.*/\)\([^/].*\)$@\1@g'`
        DIRNAME=`echo "$line" | sed 's@^\(.*/\)\([^/].*\)$@\2@g' | tr '.' '-'`
        if [ ! "$line" == "$DIRPATH$DIRNAME" ] ; then
                mv "$line" "$DIRPATH$DIRNAME"
        fi
done
}

test_command() {
        for i in $@ ; do
                if [ ! -x "$i" ] ; then
                        echo "command $i not found"
                        ERR=1
                fi
        done
        [ "$ERR" == "1" ] && exit 1
}

while getopts "p:c:h" opt ; do
        case "$opt" in
                p)
                        PST="$PST $OPTARG"
                        ;;
                c)
                        PST2MDCONF=$OPTARG
                        ;;
                h)
                        usage
                        exit 0
                        ;;
                \?)
                        echo "Unknown parameter"
                        exit 1
                        ;;
        esac
done

[ -z "$PST" ] && echo "-p parameter not specified" && exit 1

if [ ! -e $PST2MDCONF ] ; then
        echo "$PST2MDCONF doesn't exist"
        exit 1
fi
. $PST2MDCONF

test_command $READPST $MB2MD $CONVMV

TMP=`mktemp -d $PWD/pst.XXXXX` || (echo "cannot create temporary directory" ; exit 1)
TMP2=`mktemp -d $PWD/pst.XXXXX` || (echo "cannot create temporary directory" ; exit 1)
LOG="$TMP2.log"
for i in $PST ; do
        [ -f $i ] || echo "file $i doesn't exist !"
        [ `echo $i | grep -i pst` ] || echo "file $i isn't an .pst file !"
        $READPST -q -r -o $TMP $i >> $LOG 2>&1
done
$CONVMV --notest -f utf8 -t IMAP-UTF-7 -r $TMP >> $LOG 2>&1
find $TMP -mindepth 1 -type d -name '*.*' | remove_dot >> $LOG 2>&1
$MB2MD -s $TMP -R -d $TMP2 >> $LOG 2>&1
rm -r $TMP
find $TMP2 -type d ! -name '*.mbox*' ! -name cur ! -name tmp ! -name new |  remove_mbox >> $LOG 2>&1
find $TMP2 -mindepth 1 -type d ! -name cur ! -name new ! -name tmp | sed 's@^.*/\.\(.*\)$@\1@g' >> $TMP2/subscriptions
echo "Your new maildir is $TMP2"
et son fichier de configuration

/etc/pst2md.conf

READPST=/usr/bin/readpst
MB2MD=/usr/bin/mb2md-3.20.pl
CONVMV=/usr/bin/convmv