09/04/2010

Maildir mbox – La migration

Traditionellement, les serveurs UNIX utilisent mbox pour stocker les mails. Pour mbox, chaque dossier de votre boîte mail (Reçu, Envoyés, Archive, Corbeille, etc) est representé par un fichier, ou tout les mails sont enregistrés à la suite, séparés par une ligne vide.

Ce format, très simple à utiliser, pose de nombreux problèmes. Premièrement, on ne peut pas faire d’accès parallèles, même sur des mails différents, puisque le fichier est le même (problème de verrou). Deuxièment, les serveurs POP/IMAP (comme Dovecot) ont souvent un support limité de mbox. Dovecot est obligé de placer un mail “interne” dans la boîte, pour garder l’arborescence et l’organisation des dossiers. Courier ne supporte pas mbox.

L’avantage principal de mbox, c’est le fait qu’il soit très répandu. Il est supporté par tout les MUA (mailutils/mail, bsd-mailx, mutt, emacs, Kmail, thunderbird, evolution). Mais les problèmes récurrents qu’il pose ont poussé le principal développeur de qmail a créer un nouveau format : Maildir.

Maildir

Avec Maildir, chaque mail est un fichier, et chaque dossier de la boîte mail, un répertoire. Attention, c’est un peu plus compliqué que ça. Les mails ne sont pas directement enregistrés dans boîte/mail :

  • Le MDA enregistre le mail dans boîte/tmp/unique (“unique” est un nom de fichier unique généré a partir de données pseudo-aléatoires)
  • Une fois que le mail est écrit, le MDA le déplace dans boîte/new/unique
  • Le MUA le déplace dans boîte/cur/unique une fois qu’il voit qu’un nouveau message est arrivé dans boîte/new/

Pourquoi ? Ce comportement est utilisé pour éviter que le MUA voit un mail incomplet (car le MDA est encore en train de l’écrire), ce qui peut arriver si la machine est surchargée, si le Maildir est sur un serveur distant (NFS,FTP), voire même si le mail est gigantesque.

Maildir et procmail

Le but de cet article n’est pas d’expliquer comment configurer un MDA pour qu’il enregistre les mails en Maildir, mais malgré tout je fais une petite encartade pour les gens qui utilisent procmail. Le code suivant dans /etc/procmailrc permet de dire à procmail de mettre par défaut (cela peut donc être supplanté par une directive contraire dans le ~/.procmailrc) :

DEFAULT=$HOME/Maildir/

Aussi, si vous n’utilisez pas encore procmail je vous conseille d’y migrer rapidement :

  • Plus besoin de toucher à la configuration du MTA pour changer les méthodes de livraison des mails
  • Les utilisateurs peuvent écrire leurs propres règles pour leurs boîtes mails (pour avoir des boîtes séparées pour certains mails, par exemple)
  • Si vous changez de MTA vous pouvez toujours garder la même configuration, à condition de dire à votre MTA d’utiliser procmail

Configuration de mutt

mutt gère très bien les Maildirs, mais il faut le configurer. Dans le .muttrc, rajoutez :

# pour dire à mutt de que mbox est un Maildir
set mbox_type=Maildir
# pour dire à mutt que les chemins relatifs (avec +) sont dans "~/Maildir/"
set folder="~/Maildir/"
# pour dire à mutt que les mails arrivent dans Maildir/
set spoolfile="~/Maildir/"
# les mails archivés (pas nouveau) seront envoyés dans +Mailbox
# (+ est remplacé par la variable folder).
set mbox="+Mailbox"

# remplacez par votre propre choix (ce n'est pas un tutorial de la configuration de mutt)
# on indique à mutt d'envoyer les mails de ~/Maildir/ dans la boîte indiquée par la variable "mbox"
set move="ask-yes"

# ce code montre la puissance de mutt (inclure des scripts shell dans sa configuration)
# ouvrir tous les dossiers qu'il trouve dans ~/Maildir/
mailboxes ! + `\
for file in ~/Maildir/.*; do \
  box=$(basename "$file"); \
  if [ ! "$box" = '.' -a ! "$box" = '..' -a ! "$box" = '.customflags' \
      -a ! "$box" = '.subscriptions' ]; then \
    echo -n "\"+$box\" "; \
  fi; \
done`

On note qu’il faut créer les boîtes mails dans ~/Maildir/, ainsi que le Maildir en lui-même (même si procmail peut le créer tout seul, et que si vous avez converti vos mbox il existe déjà). On va créer la boîtes “Mailbox” (utilisé par mutt avec set mbox=”+Mailbox”).

cd # on se place dans $HOME
mkdir Maildir # on crée Maildir (ça sera peut-être déjà fait)
cd Maildir
mkdir cur new tmp # on crée une arborescence Maildir
mkdir .Mailbox # on crée une nouvelle boite
cd .Mailbox
mkdir cur new tmp

On note que :

  • La boîte principale, ou les mails entrants sont enregistrés par le MDA, est à la racine du Maildir
  • Les sous-dossiers de la boîte, commencent tous par un .

Vous pouvez maintenant démarrer mutt, et exploiter votre mbox (pour naviguer dans les boîtes, utilisez “y”)

Migrer des boîtes mbox en Maildir

Pour migrer les mbox en Maildir, le script perfect_maildir.pl est parfait, et son usage est simple :

./perfect_maildir.pl path_to_Maildir/ < mbox

pam_mail.so et You have new mail

Vous avez peut-être déjà remarqué que quand vous vous ouvrez un shell, vous avez un beau message “You have new mail” qui indique de nouveaux mail dans /var/mail/$USER. Cet avertissement est geré par pam_mail.so, un module de PAM qui permet de faire ça. Si on utilise Maildir il est intéressant de dire à pam_mail.so d’aller vérifier les nouveaux mails dans le Maildir. Cette configuration se fait dans /etc/pam.d/ sous Debian et Gentoo. Tout d’abord éditer le fichier login, et trouver cette ligne :

session    optional   pam_mail.so standard

Remplacer par :

session optional pam_mail.so standard dir=~/Maildir

Je recommande d’effectuer aussi la manipulation pour le fichier “ssh”.

Normalement PAM devra modifier la variable d’environnement MAIL à Maildir/, si par hasard ce comportement ne marche pas (en fonction de la configuration de PAM) il y a toujours moyen d’ajouter

MAIL=Maildir/

dans /etc/environment.

Faire fonctionner la commande “mail”

La commande mail est le moyen le plus simple de lire ses mails sous unix. Vous constaterez probablement que votre commande mail ne marche plus (même avec MAIL=Maildir/), car elle ne supporte pas Maildir. Mais il y a plusieurs versions de cette commande, la plus répandue étant celle de bsd (bsd-mailx avec Debian). Je vous conseille d’installer une autre version, appellée “heirloom-mailx” (sous Debian), voire “nail”, qui supporte très bien les Maildir.

Liens relatifs

Ironiquement j’ai trouvé beaucoup de mes renseignements sur bugs.debian.org :

  1. dadu
    | #1

    Pour créer un répertoire Maildir
    $ maildirmake Maildir
    La commande créé le répertoire et les sous-répertoires.

  2. | #2

    @dadu
    Salut dadu, merci de ta remarque :)

    Cette commande est sympa, mais je ne l’ai pas cité car elle n’est disponible qu’avec maildrop, le MDA de courier.

    pistache,

  1. | #1