Perles de Mongueurs (44)

Article publié dans Linux Magazine 119, septembre 2009.

[+ del.icio.us] [+ Developers Zone] [+ Bookmarks.fr] [Digg this] [+ My Yahoo!]

La perle de ce mois-ci a été rédigée par Sébastien Deseille (sdeseille) (sebastien.deseille@gmail.com).

Migration de boîtes mail IMAP via imapsync

Ce que j'aime avec le langage Perl c'est que je peux m'en servir naturellement dans toutes les activités de mon travail. J'ai récemment participé à la migration d'un serveur de messagerie libre vers un serveur de messagerie propriétaire dont je tairais le nom pour ne pas en faire la publicité. Par chance, il existe un protocole standard qui permet la consultation et la manipulation de boîtes mail, il s'agit du protocole IMAP. Une fois le protocole identifié, il ne restait plus qu'à trouver l'outil pour réaliser la migration.

Je pensais que l'utilisation d'un protocole standard m'aiderait à trouver facilement des outils libres répondants à mon besoin de migration de boîtes mail. J'ai été surpris de la difficulté de la chose. Heureusement, j'ai découvert un outil développé en Perl du nom d'imapsync.

imapsync est un outil qui permet de transférer des courriers électroniques d'une boîte mail vers une autre boîte mail au travers du protocole IMAP. Cette copie se fait de façon incrémentale. Il permet donc de réaliser des migrations de boîtes mail en réduisant la quantité de données à transporter. En effet, il ne copie que les messages qui ne sont pas présents entre la source et la destination. Il a pour autres qualités de préserver les flags indiquant si les messages sont lus, non lus, supprimés. Il autorise aussi l'arrêt et la reprise du traitement par son caractère incrémental.

Pré-requis et installation

Avant de pouvoir utiliser imapsync, il vous faudra adapter votre système à certains prérequis. Tout d'abord, imapsync a besoin du module Mail::IMAPClient. Il ne fonctionne correctement qu'avec la version Mail-IMAPClient-2.2.9. Je sais... nous sommes actuellement à la version 3.19. Fort heureusement, la version 2.2.9 est toujours disponible sur le CPAN. Il vous suffira de désarchiver le fichier à l'endroit de votre choix. Pour utiliser la bonne version d'IMAPClient, exécuter le script avec les paramètres suivants :

    perl -I ./Mail-IMAPClient-2.2.9 imapsync

Je vous laisse consulter les consignes d'installation disponibles dans le fichier INSTALL présent sur le site d'imapsync.

À la découverte d'imapsync

Pour connaître les options disponibles utilisez la commande suivante :

    perl imapsync --help

Afin de rendre cette brève plus sympathique prenons un cas concret.

Nous avons le compte Foo qui a une boîte mail sur le serveur imap.Foo.fr. Nous avons le compte Bar qui a une boîte mail sur le serveur imap.Bar.fr. Nous pouvons réaliser la synchronisation de la boîte de Foo vers la boîte de Bar par cet exemple très simple.

  perl imapsync --host1 imap.Foo.fr --user1 Foo --password1 Foo_pwd \
                --host2 imap.Bar.fr --user2 Bar --password2 Bar_pwd

Je vais vous présenter les options qui m'ont été d'un grand secours.

Voici en prime le programme que j'ai écrit :

    use strict;
    use warnings;

    my $paramfile = $ARGV[0];
    my $logfile   = "$paramfile.log";
    my $stopfile  = "c:\\Installation\\imapsync-1.267\\series_01\\stop";

    open my $log, ">>", $logfile
    	or die "Erreur : impossible d'écrire le fichier '$logfile' : $!\n";

    open my $param, "<", $paramfile
    	or die "Erreur : impossible de lire le fichier '$paramfile' : $!\n";

    while ( defined ( my $line = <$param> ) ) {
        if (-e $stopfile) {
            print "Arrêt du traitement demandé : " . localtime() . " \n"; 
            close $log;
            close $param;
            exit 0;
        }

        chomp $line;
        my ($host1, $user1, $password1, $host2, $user2, $password2)
          = split /;/, $line;

        my @cmd = (
            "perl", "imapsync",
            "--nofoldersizes", "--fastio1", "--fastio2",
            "--host1"       => "$host1",
            "--user1"       => "$user1",
            "--password1"   => "$password1",
            "--host2"       => "$host2",
            "--user2"       => "$user2",
            "--password2"   => "$password2",
            "--useheader"   => "Message-ID",
            "--regextrans2" => 's: $:_:g',
            "--regextrans2" => 's: /:_/:g',
            "--regexflag"   => 's:^(.Forwarded|Junk|NonJunk)$:():g',
            "--regexflag"   => 's:^(.Forwarded|Junk|NonJunk) ::g',
            "--regexflag"   => 's: (.Forwarded|Junk|NonJunk)::g',
            "--regexflag"   => 's:^$:():g'
        );

        print {$log} localtime() . " - $cmd\n";
        system(@cmd);
        print {$log} localtime() . " => status=$?\n";
    }

    close $log;
    close $param;

Conclusion

Comme vous l'avez certainement constaté, le processus n'est pas simple et une phase d'ajustement des paramètres s'est avérée nécessaire. Cependant, imapsync m'a permis de migrer environ 1500 boîtes mail pour une volumétrie d'environ 175 Go. Cette opération a été réalisée en une nuit avec peu de rattrapage au regard des chiffres ci-dessus. Quelques boites mails m'ont opposé de la résistance mais il s'agissait de boites de plusieurs gigaoctets ou ayant des structures de dossiers monstrueuses.

Je tiens à remercier Gilles Lamiral qui est l'auteur du programme imapsync. Je remercie bien sûr les mongueurs pour leur relecture attentive.

Références

À vous !

Envoyez vos perles à perles@mongueurs.net, elles seront peut-être publiées dans un prochain numéro de Linux Magazine.

[IE7, par Dean Edwards] [Validation du HTML] [Validation du CSS]