Supprimer les doublons dans votre messagerie
Ce document s'inspire en grande partie d'un article publié en anglais par Mark H. Wilkinson.
Introduction
De nombreuses raisons peuvent conduire à la présence de doublons [1] dans votre messagerie : arrêt inopiné d'une connexion POP3, être en copie d'un message à distination d'une liste, erreurs de manipulation de votre outil de messagerie, … Cette situation, bien que non critique, n'est pas optimale et peut engendrer une série de problèmes annexes comme le manque de place sur un disque ou des recherches ralenties.
Si vous stockez vos mails sous le format maildir et que vous utilisez Courier, cet article vous aidera à faire le ménage de manière automatisée.
Si vous débutez dans la programmation bash, les quelques commandes utilisées ici constituent d'excellents exemples pratiques.
maildir
Dans votre répertoire personnel /home/userid, vous devriez trouver un répertoire Maildir qui contient l'ensemble de vos messages. Chaque message est un fichier individuel sur votre disque et chaque "boîte" est un répertoire.
Pour chaque boîte de votre messagerie, vous devriez retrouver la structure de répertoire suivante :
$ du .ML.bxlug.2004 536K .ML.bxlug.2004/tmp 4.0K .ML.bxlug.2004/new 134M .ML.bxlug.2004/cur 135M .ML.bxlug.2004
Cet exemple reprend la structure du répertoire /home/gaetan/Maildir/.ML.bxlug.2004 correspondant à la boîte ML->bxlug->2004 de ma messagerie :
Lorsqu'un MTA délivre un mail dans ce répertoire, il le place dans le répertoire new. Lorsqu'un MUA lit les messages de ce répertoire, il les déplace du répertoire new vers cur.
Avant toute autre opération, veillez donc bien à lire votre messagerie via votre MUA habituel et vous assurer que le répertoire new est bien vide.
Nombre de messages à traiter
Pour avoir une idée du nombre de messages dans le répertoire à traiter, utilisez les commandes suivantes (en adaptant le chemin à votre situation, bien entendu) :
$ cd /home/gaetan/Maildir/.ML.bxlug.2004 $ ls cur/* | wc -l 16682
Dans la suite de cet article, on suppose que les instructions sont exécutées depuis le répertoire utilisé ci-dessus.
reformat
Pour inspecter et puis trier nos mails, nous allons utiliser l'outil reformat [2] présent dans la suite Courier-MTA.
Plus particulièrement, nous utiliserons les options suivantes :
- "-x" pour extraire une en-tête du message
- "-X" pour extraire la ligne complète d'une en-tête du message
- "-D" pour détecter les doublons.
Identifier un message de manière unique
Pour determiner de manière unique un message, nous allons utiliser l'en-tête Message-ID que chaque message devrait posséder.
$ for i in cur/*; do reformail -x Message-ID: <$i; done | wc -l 16676
Explications :
- for i in cur/* démarre une boucle sur l'ensemble des fichiers contenus dans le répertoire cur.
- reformail -x Message-ID: <$i envoie le contenu du fichier actuellement utilisé dans la boucle (i.e. $i) et en extrait l'en-tête Message-ID.
- done termine la boucle.
- wc -l compte le nombre d'en-têtes extraites des fichiers, ce qui devrait correspondre au nombre de fichiers.
Ce nombre doit être égal au nombre obtenu ci-dessus. Si ce n'est pas la cas, consulter la section ci-dessous.
Messages sans Message-ID
Il est possible que certains messages ne contiennent pas l'identifiant unique Message-ID [3]. Pour retrouver les messages qui ne possèdent pas d'en-tête Message-ID, vous pouvez utiliser, par exemple, la commande suivante :
$ for i in cur/*; do if [ `reformail -X Message-ID: <$i | wc -l` -eq 0 ] ; then echo $i ; fi ; done
Ce code effectue les opérations suivantes :
- pour chaque message de la boîte : for i in cur/*
- extrait la ligne d'en-tête qui contient Message-ID : reformail -X Message-ID <$i
- compte le nombre de ligne retournée par l'instruction reformail : wc -l
- si ce nombre est 0 : if [ `...` -eq 0 ]
- affiche le nom du fichier : echo $i
Détection des doublons
L'option -D de reformail effectue les opérations suivantes :
- Extraction du Message-ID
- Recherche dans un fichier cache du Message-ID trouvé
- Si l'identifiant est retrouvé, retourne 0 [4]
- Si l'identifiant n'est pas trouvé, retourne 1 et ajoute l'identifiant dans le fichier cache
Nous pouvons donc compte les doublons très simplement par la commande suivante :
$ rm -f /tmp/msgids $ for i in cur/*; do reformail -D 500000 /tmp/msgids <$i && echo $i; fi; done | wc -l 6501
Explications :
- Comme précédemment, la boucle for i in cur/* reprend l'ensemble des fichers (et donc des messages) du répertoire cur
- Comme expliqué ci-dessus, reformail -D 500000 /tmp/msgids <$i va
- examiner le message courant (à savoir : $i)
- en extraire le Message-ID,
- examiner le fichier cache /tmp/msgids pour voir s'il contient déjà l'identifiant du message
- "retourne" 0 ou 1 en fonction de la présence de Message-ID dans le fichier cache
- && echo $i ne sera exécuté que si l'action précédente a placé le code de retour à 0
- À la fin de la boucle, on compte le nombre de fichier dont le nom a été affiché (wc -l), ce qui correspond au nombre de doublons.
Effacer les doublons
Pour effacer définitivement [5]:
$ rm -f /tmp/msgids $ for i in cur/*; do reformail -D 500000 /tmp/msgids <$i && rm -f $i; fi; done
Remarques :
- N'oubliez pas d'effacer le fichier cache avant de relancer l'opération ! Sans cela, tous les messages seraient considérés comme des doublons et risquent d'être effacés...
- Il est important de noter que le nombre 500000 n'est pas arbitraire. C'est la taille maximum (en bytes) du fichier cache utilisé par reformail. Veillez donc à le positionner correctement. À la fin du processus, si la taille de ce fichier est égale au nombre spécifié, il est préférable de recommencer avec un nombre plus grand [6].
Conclusion
Vous avez tous les éléments en main pour contrôler, examiner, trier puis purger les doublons présents dans votre messagerie.
[1] messages en double dans votre messagerie
[2] Pour une description précise de cet outil, vous pouvez toujours consulter http://www.courier-mta.org/?reformail.html
[3] TODO: Pourquoi ?
[4] C'est un abus de langage, il faut lire : le statut de sortie de reformail est placé à 0
[5] Donc de manière irrémédiable, faites attention à ce que vous faites !
[6] Pour donner un ordre de grandeur, dans mon cas, il y a +/- 10000 messages uniques qui ont généré un fichier cache de +/- 400 KB