Journal Neatmail: un client mail minimaliste

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
30
15
juin
2018

Sommaire

J’utilise depuis quelque temps un tout petit client mail, qui ne fait vraiment que le minimum, mais a une interface si particulière, qu’il me semble intéressant de vous le présenter. Il s’agit de Neatmail écrit par Ali Gholami Rudi.

Ali Gholami Rudi

Je connais Ali Gholami Rudi pour une implémentation de Troff à la fois pertinente en termes de fonctionnalités et dont le code source est très propre. Il a aussi écrit un compilateur (neatcc), une libc (neatlibc), et une implémentation de vi. C’est un développeur qui, plutôt qu’une éthique, semble défendre une certaine esthétique du logiciel, que je qualifierai de minimaliste: code source compréhensible par une personne seule, logiciel qui fait peu de choses, mais le fait bien, etc.

Neatmail le client mail qu'il s'est programmé, et celui‐ci met en scène toute l’esthétique de son auteur.

Ce que Neatmail ne fait pas

Neatmail ne fait que gérer un fichier mbox (une concaténation de mails). Ainsi, il ne sait ni rapatrier, ni envoyer les mails, il ne sait ni extraire, ni ajouter de pièce jointes, etc.

Mais en vérité, il n’a pas besoin de faire tout cela, car d’autres logiciels le font. Ali Gholami Rudi propose ainsi un pop3 pour rapatrier les mails depuis un serveur pop3, et smtp pour envoyer ses mails à un serveur smtp. Et il existe dans certaines distributions un ripmime pour extraire les pièces jointes d’un fichier mime.

Ce que Neatmail fait

Neatmail se contente donc d’effectuer des actions sur un fichier mbox. Les actions de bases sont:

mk Génère une liste des mails contenus dans la mbox.
ns Génère une liste des nouveaux mails présents dans la mbox.
pg Affiche un des mails contenu dans la mbox.

On peut donc l’utiliser ainsi:

# Obtient les mails
pop3
# liste les mails, triés par fil de discussion
neatmail mk ‐r ‐st ‐0 18from:48~subject: mbox
# affiche le 3e mail
neatmail pg mbox 3
# prépare une réponse
neatmail pg ‐r mbox 3 > draft.eml
vi draft.eml
# envoie la réponse
tail ‐n+2 draft.eml | smtp
# garde une copie de la réponse
cat draft.eml >> sent
rm draft.eml

Mais en outre, neatmail peut interpréter les commandes ex contenues dans la liste des mails. Autrement dit, l’utilisateur est invité à ajouter des commandes à cette liste de mails, et donner le tout à neatmail qui se chargera de l’exécution:

neatmail mk ‐r ‐0 18from:48~subject > list.nm
vi list.nm
neatmail ex < list.nm

Le commande ex de neatmail

La commande ex de neatmail prend en entrée une liste de commandes, et les exécute sur un fichier mbox. Elle ignore toutes les lignes hormis celles commençant par deux points (commande ex) ou une lettre majuscule (un mail dans la liste). Les lignes commençant par une lettre majuscule de la forme "R100..", modifient le statut du message dont le nombre suit la lettre (ici, 100). Une telle ligne définit aussi le message actuel, celui sur lequel les commandes sont exécutées. Les commandes ex sont les suivantes:

rm supprime le message courant.
cp copie le message courant dans une mbox donnée.
mv déplace le message courant dans une mbox donnée.
hd modifie l’entête donnée du message courant.
ft passe le message courant à une commande donnée.
w écrit les modifications dans la mbox.
tj joint les fils de discussion en modifiant l’entête "Reply‐To".
ch coupe le message à l’offset indiqué.

Par défaut, ces commandes agissent sur le message courant, mais il est aussi possible d’utiliser des adresses du type 2,5rm pour effacer les messages 2 à 5. Il est aussi possible d’utiliser des expressions régulières du type /regex/rm, où regex est recherché dans le sujet des messages. D’autres champs peuvent être spécifiés en utilisant l’expression ^field:value.

Un script shell comme interface

Vous allez certainement penser que l’interface est un peu rude… À vrai dire, Ali Gholami Rudi n’utilise pas neatmail directement: un script shell (m) lui sert d’interface. Et c’est là que le logiciel brille: pour peu que l’on ait un peu l’habitude du shell, on peut se créer une interface sur mesure. On peut par exemple imiter l’interface de mh (un autre client mail non interactif un peu oublié). On pourrait créer une interface interactive. Bref, on peut faire ce qu’on veut.

J’utilise par exemple l’interface suivante:

m box inbox # liste les messages contenus dans la mbox inbox.
m vi 3 # affiche le message 3
m next # affiche le message 4
m repl # ouvre mon éditeur sur une réponse préformatée au message 4
m add f.pdf # joint f.pdf à ma réponse
m send # envoie ma réponse.
m R # marque le message 4 comme lu.
m com # enregistre les changements dans la mbox (ici, change l’entête du message 4)

Conclusion

Au jour le jour, je suis plutôt satisfait de l’ensemble. Le fait de travailler sur les mails en local est plutôt agréable: c’est fluide, offre une grande liberté d’organisation, s’associe bien à un système de sauvegarde ou de gestion de version, etc. Le fait que le client ne soit pas interactif apporte un certain confort d’usage: le shell est sous la main si besoin, je retrouve ma session de travail dans l’état où je l’ai laissée d’un jour à l’autre, il est facile d’implémenter des solutions pour revenir en arrière (cp…). Le fait de coupler le tout avec le shell offre une grande liberté dans la création de l’interface utilisateur.

  • # merci !

    Posté par  . Évalué à 2. Dernière modification le 15 juin 2018 à 22:38.

    super article: ça donne envie d'essayer, ça fait moins peur que mutt (sur ma todolist depuis 5 ans – procrastination); en tout cas on comprend bien les grands principes de conception et d'utilisation

    • [^] # Re: merci !

      Posté par  (site web personnel) . Évalué à 8.

      Merci pour le compliment, ça fait plaisir!

      ça fait moins peur que mutt

      Par contre, à mon avis, ça devrait faire plus peur que mutt. Mutt n'aura besoin que d'être configuré, et je suis certain qu'on trouve en ligne des exemples basiques.

      Pour neatmail, il faudra déjà compiler neatmail, pop3, smtp. Pop3 se configure via modifications des sources, et demandera les certificats pem pour se connecter au serveur en ssl. Et ensuite il faudra encore écrire le script shell pour avoir quelque chose d'utilisable.

      J'ai trouvé le tout très plaisant, mais honnêtement, ça fait peur. :)

    • [^] # Re: merci !

      Posté par  . Évalué à 4. Dernière modification le 16 juin 2018 à 15:09.

      J'ai mis du temps à essayer mutt, car je n'aurais été mu que par curiosité, alors que j'en suis venu à l'installer pour un réel besoin ; et celui-ci n'est pas tellement compliqué, du moins pour l'installer et accomplir les actions de base.

      Et par contre, Neatmail me paraît bien plus compliqué.

  • # Licence ?

    Posté par  . Évalué à 1.

    Bon au delà de ma question, je trouve l'outil très intéressant et très "excitant".

    Je suis un citoyen de GNU Emacs et j'utilise le client Rmail (qui est une sorte de neatmail on steroids puisqu'il propose une interface) et c'est exactement pour les raisons que tu évoques que je l'utilise: simplicité et efficacité.
    Je travaille également sur du mbox en local depuis peu car je ne souhaite plus disposer de multiples copies de mes correspondances sur des périphériques dont gross-modo je n'au aucune confiance.

    Ca me tenterait bien de faire un petit essai de ces outils.

    Tu as des "copies d’Écran" du rendu possible ? En tous cas, merci pour la découverte.

    • [^] # Re: Licence ?

      Posté par  (site web personnel) . Évalué à 2.

      Il n'y a pas grand chose à montrer, sinon, peut-être, la liste des mails telle qu'elle est rendue par la commande neatmail mk ‐r ‐0 18from:48~subject.

      R0051   [Dave Kemper <saint]    [[groff] vertical resolution and page location tr]
      R0052   [Werner LEMBERG <wl]     [+[groff] vertical resolution and page location ]
      R0053   [Werner LEMBERG <wl]      [+[groff] vertical resolution and page location]
      R0054   [Tadziu Hoffmann <h]      [+[groff] vertical resolution and page location]
      

      Pour le reste, j'imagine que chacun utilisera son éditeur préféré avec la coloration syntaxique adéquate.

      La licence mérite probablement clarification, mais elle est indiquées dans les sources de mail.c: « modified BSD license ».

      • [^] # Re: Licence ?

        Posté par  . Évalué à 1.

        On retrouve une UI assez proche de ce que j'ai dans Rmail (lorsque je filtre pour un "topic" défini).
        Du coup, j'imagine que c'est l'outil parfait pour une personne vivant sur la console linux (je parle bien du tty).

        Question bête (ou naive): ca fonctionne bien avec Unicode ?

        • [^] # Re: Licence ?

          Posté par  (site web personnel) . Évalué à 3.

          ça fonctionne bien avec Unicode ?

          Neatmail ne fait aucun transcodage. C'est donc ton éditeur qui devra gérer l'encodage du fichier que tu reçois, et s'assurer que tu réponds avec le même encodage.

          Concrètement, sur nos linux d'aujourd'hui, ce sont plutôt les encodages non unicode qui demanderont peut-être un transcodage manuel. Et si tu communiques avec des personnes qui ont des clients mails qui ne considèrent pas qu'unicode est l'encodage par défaut (mais est-ce que ça existe encore?), il faudra vraisemblablement construire des mails de type Mime, et indiquer l'encodage.

          Le seul hic, c'est lorsque le sujet d'un mail contient des caractères non unicode: ceux-ci s'afficheront mal dans la liste générée par neatmail, qui sera alors composée de plusieurs encodages.

          Mais pour ma part, il n'y a qu'un organisme qui m'envoie encore des mails non unicode, et comme il ne veut pas qu'on lui réponde par mail, je ne me soucis pas outre mesure de ce problème.

      • [^] # Re: Licence ?

        Posté par  (site web personnel) . Évalué à 4.

        En réponse à ma demande de précision, Ali Gholami Rudi a modifié la licence, préférant dorénavant la licence ISC.

  • # Corrections

    Posté par  (site web personnel) . Évalué à 3.

    Est-ce qu'un modérateur pourrait corriger les nombreuses fautes contenues dans cet article s'il vous plaît?

    • Le nom du développeur s'écrit Ali Gholami Rudi (et non Ali Golhami Rudi).
    • Il ne sait pas ni rapatrier -> Il ne sait ni rapatrier,
    • propose ainsi de pop3 -> propose ainsi un pop3
    • et smtp. pour envoyer -> et smtp pour envoyer

    Merci!

  • # mh ou nmh

    Posté par  . Évalué à 2. Dernière modification le 20 juin 2018 à 13:10.

    Salut,

    Merci pour le partage. :)

    Le programme me fait fortement penser à mh ou plus récemment nmh dans le principe si ce n'est qu'il est à mon avis un peu plus facile à prendre en main.

    • [^] # Re: mh ou nmh

      Posté par  (site web personnel) . Évalué à 2.

      Oui, neatmail et mh sont tous les deux non interactifs, et je me demande si ce ne sont pas les deux seuls clients mail non interactifs. Si dans mon journal les deux se ressemblent, c'est que l'interface de mon script m s'inspire de mh.

      Et effectivement, pour avoir essayé le mh de mailutils, je trouve qu'il est bien plus simple de travailler avec neatmail et un script. Mailutil-mh n'est pas toujours facile à configurer, et une large part de son comportement est codé en dur en C.

      Je n'ai pas eu l'occasion d'essayer, mais il est possible que la commande ex de neatmail puisse être utilisée comme substitut de pick pour une recherche triviale:

      :/^From:mail@example.com/cp pick.mbox
      

      Outre pick, un outil performant pour ajouter des pièces jointes comme mhn manque probablement. J'utilise un script basique pour cela, qui, s'il me convient très bien, reste très limité.

      • [^] # Re: mh ou nmh

        Posté par  . Évalué à 1. Dernière modification le 03 juillet 2018 à 16:21.

        C'est vrai que cela ressemble beaucoup au système MH.

        Tout comme MH avait une interface GNU emacs, est-il prévu d'en avoir une pour Neatmail ?

        • [^] # Re: mh ou nmh

          Posté par  (site web personnel) . Évalué à 2. Dernière modification le 04 juillet 2018 à 13:33.

          Non, aucune interface avec Emacs n'est prévue.

          Mais l'interface de Emacs pour mh existe toujours: mh-e. Elle utilise mailutils-mh en arrière plan, qui est en fait spécialement développé pour mh-e. Le développeur de mailutils est du reste très actif, et utilise mh-e lui-même.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.