Article écrit par Eddie Barraco
C’est sans doute la partie dans toute ma stack technique qui a le plus évolué avec le temps. Depuis quelques années, elle s’est pourtant bien stabilisée. C’est de cela dont j’ai envie de parler aujourd’hui.
Quelques contraintes que j’ai pour mes solutions :
- Dois me permettre d’utiliser n’importe quel éditeur de texte
- Gère une grande liste de boites mail, de manière unifiée
- Les outils doivent être interchangeables et avoir des alternatives (ou être simple pour que je les maintienne)
- Permet de chercher des mails
- Peut se brancher à d’autres outils
- Dois me permettre de faire le ménage
Isync
J’utilise donc un ensemble d’outils qui marchent de pair. Pour synchroniser les mails du serveur IMAP de mon fournisseur jusqu’à mon stockage local j’ai deux possibilités équivalentes :
- offlineimap
- mbsync (aka Isync)
J’ai choisi mbsync. Nous le configurons ainsi :
# ~/.mbsyncrc IMAPAccount synbioz Host imap.gmail.com User ebarraco@synbioz.com PassCmd "pass Web/accounts.google.com/ebarraco@synbioz.com" CertificateFile /etc/ssl/certs/ca-certificates.crt SSLType IMAPS IMAPStore synbioz-remote Account synbioz MaildirStore synbioz-local Path ~/.mail/synbioz/ Inbox ~/.mail/synbioz/INBOX Channel synbioz Far :synbioz-remote: Near :synbioz-local: Patterns * Create Both SyncState *
On lance la commande mbsync
pour synchroniser cette boite mail dans le dossier ~/.Mail/synbioz
. Ce dossier ressemble à ça :
$ ls ~/.mail/synbioz/ Archive Brouillons Drafts INBOX Sent Spam Trash $ ls ~/.mail/synbioz/INBOX/ cur new tmp
Chacun des dossiers contient un cur
, new
et tmp
. C’est le format Maildir
Pour rendre la synchronisation plus rapide lorsqu’on a plusieurs fournisseurs :
#!/bin/sh # ~/bin/email_sync grep Channel ~/.mbsyncrc | cut -d' ' -f2 | xargs -n1 -P 0 mbsync -qX
Lancer email_sync
vas synchroniser en parallèle toutes les boites mails.
Mblaze
Maintenant que les mails sont en local, nous voulons les lister, les afficher, y répondre, etc.
J’utilise pour cela Mblaze. Ce projet s’inspire de MH appliqué au format Maildir (et non mbox).
Mblaze fournit un ensemble de commandes qui permettent d’utiliser les fichiers mails stockés au format Maildir. L’idée est de chaîner plusieurs commandes pour faire ce qu’on souhaite. Les taches les plus courantes peuvent être simplifiées dans un script. Quelques exemples :
# Liste les mails d'un dossier $ mlist ~/.mail/synbioz/INBOX/ /home/stacy/.mail/synbioz/Archive/cur/1642849468.15544_227.yellow-orcess,U=227:2,RS /home/stacy/.mail/synbioz/Archive/cur/1642849502.15544_720.yellow-orcess,U=720:2, /home/stacy/.mail/synbioz/Archive/cur/1642849496.15544_592.yellow-orcess,U=592:2, /home/stacy/.mail/synbioz/Archive/cur/1642849485.15544_435.yellow-orcess,U=435:2, /home/stacy/.mail/synbioz/Archive/cur/1644068637.3764_3.yellow-orcess,U=818:2, /home/stacy/.mail/synbioz/Archive/cur/1642849491.15544_525.yellow-orcess,U=525:2, /home/stacy/.mail/synbioz/Archive/cur/1642849445.15544_14.yellow-orcess,U=14:2,S /home/stacy/.mail/synbioz/Archive/cur/1642849481.15544_365.yellow-orcess,U=365:2, /home/stacy/.mail/synbioz/Archive/cur/1642849455.15544_107.yellow-orcess,U=107:2,RS /home/stacy/.mail/synbioz/Archive/cur/1642849493.15544_541.yellow-orcess,U=541:2,
# Permet d'en tirer des informations $ mlist ~/.mail/synbioz/INBOX/ | mscan . 2021-07-02 David Verove > Re: Infos pour création de factures Odoo . Tue Jan 18 Suivi de projet I [G-OXYGENE - Développement #11886] (Validation) REQ_GES_0048 Gestion des avoirs sur une facture d . 2020-11-26 Martin Catty > Invitation mise à jour: Suivi - jeu. 26 nov. 2020 11am - 11:30am (CET) (ebarraco@synbioz.com) . 2021-01-18 mducrocq@synbioz. Entretiens de suivis . 2020-12-17 Notion > 1 update in Synbioz 2020-07-28 Martin Catty Préparation des entretiens
# msort permet de trier, ici par date $ mlist ~/.mail/synbioz/INBOX/ | msort -rd | mscan . Tue Jan 18 Suivi de projet I [G-OXYGENE - Développement #11886] (Validation) REQ_GES_0048 Gestion des avoirs sur une facture d . 2021-07-02 David Verove > Re: Infos pour création de factures Odoo . 2021-01-18 mducrocq@synbioz. Entretiens de suivis . 2020-12-17 Notion > 1 update in Synbioz . 2020-11-26 Martin Catty > Invitation mise à jour: Suivi - jeu. 26 nov. 2020 11am - 11:30am (CET) (ebarraco@synbioz.com) 2020-07-28 Martin Catty Préparation des entretiens
Les nouveaux mails synchronisés ont le statut « nouveau » et sont stockés dans le dossier new
du format Maildir. Mblaze nous permets de les lister et de les marquer comme vu avec la commande minc
.
La commande suivante attrape les nouveaux mails, leur retire leur caractère nouveau et passe la main à mscan
qui en affiche un résumé :
$ minc ~/.mail/synbioz/INBOX | mscan >. 1 Mon 15:12 Peter John Hartma [PATCH sxmo-utils v2 00/22] Pinenote Patches
Nous avons plusieurs boites mail, donc nous souhaitons rendre cela plus rapide :
#!/bin/sh # ~/bin/mnew # mdirs liste tous les dossiers d'une boite (INBOX, Sent, etc.) mdirs "$HOME"/.mail | xargs minc | mthread -r
Nous n’avons plus qu’à utiliser email_sync && mnew | mless
pour synchroniser et afficher tous les nouveaux mails de toutes nos boites.
mless
est généralement l’outil principal pour parcourir les mails. Il ouvre les mails listés dans un page less
:
$ mlist ~/.mail/synbioz/INBOX/ | msort -rd | mless . 14 Tue Feb 1 Suivi de projet [Développement #11906] (To be released in prod) REQ_BUR_0050 Demande . 15 Tue Feb 1 Andréa XXXXX + Kick off refonte Bureau des consultants >. 16 Tue Feb 1 Nicolas Cavigneau > Re: XXXXXXXX | Description des XXXX (#306) . 17 Tue Feb 1 Nicolas Cavigneau > Re: XXXXXXXX | feat: add descriptions to product XXXXXXXXX (!280) From: "Nicolas Cavigneaux (@ncavigneaux)" <bot@synbioz.com> Subject: Re: XXXXXXXX | Description des XXXX (#306) To: ebarraco@synbioz.com Date: Tue, 01 Feb 2022 15:01:25 +0100 (6 days, 21 minutes, 4 seconds ago) --- 1: multipart/alternative size=2003 --- --- --- 2: text/plain size=250 --- Nicolas Cavigneaux commented: Back validé et mergé
En haut de cette page, on voit le mail courant indiqué par un >
en début de ligne. On tape la commande :n
et :p
pour naviguer vers le mail suivant et précédent. On ferme less
avec q
.
On affiche le mail courant avec mshow
. On peut rouvrir la liste de mails avec mless
directement.
mblaze
utilise deux fichiers pour conserver le contexte actuel ~/.mblaze/seq
et ~/.mblaze/cur
.
Quelques scripts additionnels qui me simplifient la vie :
#!/bin/sh # ~/bin/mls mdirs "$HOME"/.mail | grep "$1$" | xargs mlist | mthread -r
Me permet de lister tous les mails du dossier INBOX de toutes les boites avec mls INBOX | mless
. Les mails sont triés par thread du plus récent au plus ancien.
#!/bin/sh # ~/bin/mmv REGEX="$(printf 's|[^/]+/[^/]+/[^/]+$|%s|' "$1")" mshow -t . | head -n 1 | sed "$REGEX" | xargs mrefile .
Me permet de déplacer le mail courant dans le dossier « Archive » de sa boite mail avec mmv Archive
. Je peux donc archiver facilement les mails sans me soucier de sa boite d’origine et sans avoir besoin de changer de contexte.
Pour composer un mail ou pour y répondre on peut utiliser respectivement mcom
et mrep
. Mblaze vas nous préparer le modèle du mail avec les en-têtes correspondants et ouvrir l’éditeur de texte.
To: XXX / XXXXXXXX <XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX> Cc: Bcc: Subject: Re: XXXXXXXX | feat: add descriptions to product XXXXXXXXX (!280) From: Eddie Barraco <ebarraco@synbioz.com> In-Reply-To: <69c406662334a6e2f24c36cf8557c381@git.synbioz.com> Message-Id: <20DCRCY035H7Z.26F60R3KQ1ZW1@yellow-orcess.my.domain> > Merge request URL: https://git.synbioz.com/XXX/XXXXXXXX/-/merge_requests/280 > > > Merge request !280 was merged > Merge request URL: https://git.synbioz.com/sba/XXXXXXXX/-/merge_requests/280 > Branches: feat/XXXXXXXX-desc to develop > Author: Eddie Barraco > Assignee: Martin Catty > Reviewers: Merci cher bot !
Une fois le fichier sauvegardé et l’éditeur clos, Mblaze demande via un menu interactif s’il doit envoyer ou si nous souhaitons encore le modifier.
[ebarraco@ebarraco.synbioz ~]$ mrep What now? ([s]end, [c]ancel, [d]elete, [e]dit, [m]ime, [p]review, sign, encrypt)
Mblaze n’est pas capable d’envoyer le mail par lui-même. Pour cela il va passer la main au programme que nous verrons juste après.
Mes routines deviennent donc :
- Pour voir les nouveaux mails :
email_sync && mnew | mless
- Pour lister tous les mails à traiter :
mls INBOX | mless
- Pour appliquer le patch du mail courant :
mshow -r | git am -3
- Pour archiver le mail courant :
mmv Archive && mless
Le pager mless
a aussi quelques raccourcis qu’on peut étendre. Vous trouverez ici la version que j’utilise actuellement mless
En l’état, je ne quitte quasiment jamais mless
. J’appuie sur a
pour archiver le mail, t
pour le mettre dans la corbeille, r
pour répondre, et w
pour récupérer les nouveaux mails (ou synchroniser). Je peux revenir à ma liste INBOX avec i
, je quitte à tout moment le pager avec q
et le rouvre avec mless
.
Plutôt simple finalement ? Non ? Bon…
msmtp
Pour gérer l’envoi des mails, j’utilise msmtp
. C’est un programme très simple qui lit une configuration, attrape le contenu du mail qu’on lui donne et envois ledit mail. Son fichier de configuration est :
# ~/.msmtprc # Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log account synbioz host smtp.gmail.com port 587 from ebarraco@synbioz.com user ebarraco@synbioz.com passwordeval "pass Web/accounts.google.com/ebarraco@synbioz.com"
On doit également configurer Mblaze pour l’utiliser.
# ~/.mblaze/profile Sendmail: msmtp Sendmail-Args: --read-envelope-from --read-recipients Local-Mailbox: Eddie Barraco <ebarraco@synbioz.com>
C’est avec msmtp
que mblaze
enverra le mail lorsqu’on utilise mcom
, mrem
, mfwd
. Notez au passage qu’avec --read-envelope-from
msmtp
utilise la configuration correspondante au From
.
Notmuch
J’ai mes mails en local, pleins d’outils pour les lister, les déplacer. Je peux en composer de nouveau ou répondre à certains. Maintenant comment est-ce que je fais une recherche ?
Mblaze offre un moyen simple de le faire :
$ mlist ~/.mail/synbioz/Archive/ | magrep -a "/:project synbioz" | mless
Cependant, il est peu performant et peu pratique. Je ne le recommande pas si vous chercher dans une grande liste de mail.
J’utilise un outil appelé Notmuch pour indexer et rechercher dans mes mails.
~/.notmuch-config [database] path=.mail [user] name=Eddie Barraco primary_email=ebarraco@synbioz.com [new] tags=inbox ignore= [search] exclude_tags=deleted;spam; [maildir] synchronize_flags=false [crypto] gpg_path=gpg2
On indique à Notmuch de ne pas toucher lui-même aux fichiers.
On lance l’indexation avec notmuch sync
. Cette action prend du temps la première fois et sera plus rapide par la suite. Nous allons d’ailleurs abstraire cette tache grâce à notre script email_sync
.
#!/bin/sh # ~/bin/email_sync grep Channel ~/.mbsyncrc | cut -d' ' -f2 | xargs -n1 -P 0 mbsync -qX mnew notmuch sync 2>/dev/null >&2
On simplifie encore une fois notre routine. On lance email_sync | mless
pour synchroniser le mail, les indexer et afficher les nouveaux.
Ce petit raccourci va nous simplifier les recherches :
#!/bin/sh # ~/bin/msearch exec notmuch search --output=files "$@"
On l’utilise ainsi :
$ msearch "Martin Catty" and "subject:/fiche de paie/" | msort -rd | mless … # une liste de mail $ msearch body:"Proposition commerciale" and folder:/Trash/ | msort -rd | mless … # une plus grande liste de mail
Je me sers de Notmuch pour lister les mails automatiques et ainsi les nettoyer. Vous trouverez mon script ici mcleanup.
Enfin
J’ai choisi d’utiliser un ensemble de petits outils plutôt qu’un programme qui cherche à tout faire. Cela me donne une plus grande flexibilité, mais également de meilleures performances. Je peux travailler sur ma machine fixe actuelle ou sur un microordinateur sans même m’en rendre compte.