Article publié dans Linux Magazine 119, septembre 2009.
La perle de ce mois-ci a été rédigée par Sébastien Deseille (sdeseille)
(sebastien.deseille@gmail.com
).
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.
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.
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.
Cette option force l'authentification IMAP en mode LOGIN
.
Elle permet de s'affranchir d'un problème qui apparait parfois pendant
le processus de migration et qui à pour effet de consommer toute les ressources
CPU avant de planter.
L'utilisation de cette option est incontournable
surtout si comme moi, vous avez des boîtes mail de plusieurs gigaoctets à migrer.
En effet, lorsque les boîtes mail étaient trop volumineuses cela avait la
fâcheuse tendance à faire crasher la migration.
Elle est associée à l'option --useheader
.
Cette option est associée à --nofoldersizes
Cette option permet avec l'aide d'expressions régulières de modifier le nom d'un dossier de mails en cours de migration. Elle est très utile lorsque vous tombez sur des boîtes mail où l'utilisateur a trouvé bon de mettre un espace comme dernier caractère du nom du dossier. Il m'a fallu un certain temps pour identifier que c'était la cause des échecs du processus de migration.
Je ne vais pas m'attarder sur cette option. Il n'y a pas de mal à chercher à gagner un peu de performance lors des transferts.
Cette option utilise aussi les expressions régulières mais l'objectif, ici, est de modifier les flags associés aux mails. Certains serveurs de messagerie ne supportent pas les flags personnalisés. Il faut donc les supprimer pendant le processus de migration.
C'est l'option indispensable pour effectuer les tests avant de passer aux choses sérieuses et de dérouler le processus de migration.
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;
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.
Définition du protocole IMAP sur Wikipedia
Le site qui héberge le projet imapsync.
La page du CPAN qui concerne le module Mail::IMAPClient
.
Ce sera le sujet d'un prochain article sur cette magnifique
boite à outils du protocole IMAP.
Envoyez vos perles à perles@mongueurs.net
, elles seront peut-être
publiées dans un prochain numéro de Linux Magazine.
Copyright © Les Mongueurs de Perl, 2001-2011
pour le site.
Les auteurs conservent le copyright de leurs articles.