Convertir les archives PST d’Outlook vers un dossier IMAP avec un serveur GNU/Linux

../../../../2012/10/08/convertir-les-archives-pst-outlook-dossier-imap/
Antoine Van-Elstraete (antoine@van-elstraete.net)
lundi 8 octobre 2012





6 min.

Image d'illustration

Dans cet article, je vais décrire comment passer d’un fichier d’archive généré par Microsoft Outlook (format PST) a une structure de type IMAP, intégrée au dossier « Maildir » d’un utilisateur. Cette démarche se déroule en 3 étapes : extraire l’archive, créer la structure IMAP et injecter les courriels.

Introduction

Microsoft Outlook

Outlook est un client de messagerie, calendrier, contact et tâches édité par Microsoft. Pour sauvegarder leurs messages, les utilisateurs peuvent récupérer un dossier d’archive au format propriétaire « PST », « Personal storage Table ».

Ce tutoriel explique comment obtenir ces archives : http://forums.cnetfrance.fr/topic/119484-outlook-creer-une-archive-de-ses-emails/.

IMAP & Maildir

Internet Message Access Protocol (IMAP)  est un protocole qui permet de récupérer les courriers électroniques sur des serveurs de messagerie (Wikipédia - IMAP).

Maildir est une structure de répertoires particulière, qui est utilisée pour sauvegarder des courriers électroniques. De par son architecture, Maildir est performant et très fiable. Il est de plus particulièrement adapté pour les serveurs de courriels (MDA) supportant le protocole IMAP (Wikipédia - Maildir).

Outils utilisés

bash

Le shell utilisé ici est bash. Voir l’article wikipédia sur bash.

find

find est un outil (GNU software) qui permet de rechercher des fichiers ou des dossiers en ligne de commande.

sed

sed est un outil (GNU software) qui permet de travailler des chaînes de caractères, en remplaçant certains caractères par exemple.

readpst

Disponible dans la libpst, readpst est un programme permettant d’extraire les archives PST d’Outlook en répertoire contenant des fichiers mbox (fichiers « boite aux lettres »).

site : http://www.five-ten-sg.com/libpst/ ; licence : GPL

maildirmake

C’est une commande permettant la création et la manipulation de répertoires Maildir, utilisés par le protocole IMAP. Elle est fourni avec le serveur IMAP, par exemple courier-imap : http://www.courier-mta.org/imap/.

perfect_maildir

Ce programme, développé par Philip Mak, permet de convertir un fichier mbox en courriers dans un Maildir (IMAP) de manière « simple mais parfaite ». Il est distribué sous licence GPL, c’est donc un logiciel libre.

Il est disponible depuis sa page : http://perfectmaildir.home-dn.net/. Je vous conseille fortement pour la suite de placer ce script perl dans votre PATH (explications ici :  « la variable d’environnement PATH »).

Déroulement

Extraction de l’archive PST

Très simple, avec l’outil readpst, il suffit de lancer la commande suivante :

$ readpst -r Archive.pst

Un dossier du nom de l’archive et créé. Celui-ci contient les dossiers d’Outlook, dont “Boîte de réception” et “Éléments envoyés” qui nous intéressent.

Création du la structure de dossier IMAP

Pré-requis : un serveur IMAP fonctionnel, avec des dossiers type « Maildir » pour les utilisateurs.

Pour les exemples, je considère que les utilisateurs ne sont pas virtuels et que le dossier IMAP est situé dans le répertoire utilisateur, e.g. : ~/.Maildir.

Si ce n’est déjà fait, il faut créer un dossier qui recevra l’archive. Par exemple, « Archive Outlook ».

$ maildirmake -f "Archive Outlook" ~/.Maildir/

Ensuite, il nous faut créer, pour chaque dossier de l’archive, son équivalent IMAP. Si l’archive contient de nombreux dossiers, cela peut devenir très fastidieux. Heureusement, avec bash, un script nous aidera à faire cela correctement.

Ce script travaille en plusieurs étapes :

  1. Il récupère le nom du dossier courant, l’outil « sed » le modifie pour éviter les caractères accentués (sinon des problèmes surviennent avec certains clients IMAP) ;
  2. Si ce dossier n’existe pas dans notre dossier « Archive Outlook », il le crée ;
  3. Au moyen de l’outil « find », on récupère la liste de tous les répertoires ;
  4. L’outil « sed » retravaille cette liste et la rend exploitable pour le script ;
  5. Une boucle crée tous les répertoires et sous-répertoires nécessaires, si ceux-ci ne sont pas déjà présent.

Voici le script en lui-même. Attention, il faut adapter le dossier de destination (ici, toujours « Archive Outlook »).

#!/bin/bash

REP=${PWD##*/}
REP=`echo $REP | sed 's/É/E/g' | sed 's/é/e/g' | sed 's/è/e/g' | sed 's/à/a/g' | sed 's/î/i/g' |sed s/'/ /g`

if test -d ~/.Maildir/".Archive Outlook.$REP"; then
        echo "Le dossier $REP existe déjà"
else
        maildirmake -f "Archive Outlook.$REP" ~/.Maildir/
fi

find ./ -type d | sed 's/^..//' | sed '/^$/d' |sed 's///./g' |sed 's/É/E/g' | sed 's/é/e/g' | sed 's/è/e/g' | sed 's/à/a/g' | sed 's/î/i/g' |sed s/'/ /g |while read i
do
        if test -d ~/.Maildir/".Archive Outlook.$REP.$i"; then
                echo "Le dossier $i existe déjà"
        else
                maildirmake -f "Archive Outlook.$REP.$i" ~/.Maildir/
        fi
done

Injection des courriels

Ici, c’est l’outil « perfect_maildir » qui nous servira. Comme ci-dessus, c’est au moyen d’un script en bash que les courriers seront injectés dans les répertoires, de manière récursive. Le script est très proche car il travaille de la même manière :

  1. Récupération du répertoire courant et traitement du nom avec l’outil « sed » ;
  2. Injection des courriers présent à la racine ;
  3. Injection des courriers dans les différents répertoires, si un fichier « mbox » y existe.

Le script en lui-même, toujours avec le dossier « Archive Outlook » de l’exemple :

#!/bin/bash

REP=${PWD##*/}
REP=`echo $REP | sed 's/É/E/g' | sed 's/é/e/g' | sed 's/è/e/g' | sed 's/à/a/g' | sed 's/î/i/g' |sed s/'/ /g`

perfect_maildir.pl ~/".Maildir/.Archive Outlook.$REP" < "./mbox"

find ./ -type d | sed 's/^..//' | sed '/^$/d' | while read i
do
        ii=`echo $i |sed 's///./g' | sed 's/É/E/g' | sed 's/é/e/g' | sed 's/è/e/g' | sed 's/à/a/g' | sed 's/î/i/g' |sed s/'/ /g`
        if test -f "./$i/mbox" ; then
                perfect_maildir.pl ~/".Maildir/.Archive Outlook.$REP.$ii" < "./$i/mbox"
        fi
done

N.B.: ici, les noms de répertoire sont stockés dans 2 variables :

  • $i : le nom du répertoire, avec son chemin, utilisé par bash ;
  • $ii : le nom du répertoire, mais au format utilisé par IMAP (avec des point comme séparateur).

Conclusion

Il n’a pas été facile de trouver les différents outils, notamment « perfect_maildir ». Encore merci à Philip Mak, l’auteur de ce programme simple et efficace.

L’utilisation des outils standard disponibles sous GNU/Linux a permis de gagner beaucoup de temps et de simplicité en créant des scripts contenant une boucle gérant les tâches répétitives.

Pour information, j’ai utilisé cette méthode pour extraire 14 archives provenant d’Outlook (2003 à 2010), d’environ 1,5 Gio chacune, pour obtenir au final une structure de 565 répertoires, 65 495 courriels, totalisant 18,7 Gio. Le temps de traitement est totalement dépendant de la vitesse d’entrée/sortie du stockage, les différentes étapes n’ont jamais pris plus de 30% des ressources processeur (x86 cadencé à 1,3 Ghz), pour un « average load » maximum de 7. La partie la plus longue est l’extraction de l’archive PST, pour moi environ 2h  par archive.