Aller au contenu

Neomutt

Neomutt est un client mail en ligne de commande, fork de mutt. Pas de GUI, tout au clavier, ultra configurable.

J’utilise neomutt pour gérer mon Gmail directement depuis le terminal - même setup que le reste de mon workflow (nvim, khal, khard…). Pas de dépendance à un client graphique, tout est dans des fichiers texte, tout est scriptable.

Fichier principal : ~/.config/neomutt/neomuttrc

# Compte IMAP
set imap_user = "ton.adresse@gmail.com"
set imap_pass = "ABCD EFGH IJKL MNOP" # mot de passe d'application Gmail
set smtp_url = "smtps://ton.adresse@gmail.com@smtp.gmail.com:465/"
set smtp_pass = "ABCD EFGH IJKL MNOP"
set from = "ton.adresse@gmail.com"
set realname = "Ton Nom"
set folder = "imaps://imap.gmail.com/"
# Dossiers
set spoolfile = "+INBOX"
set postponed = "+[Gmail]/Brouillons"
set record = "" # Gmail sauvegarde les envoyés auto → pas de doublon
set trash = "+[Gmail]/Corbeille"
# Comportement
set mail_check = 60
set timeout = 10
set sort = threads
set sort_aux = last-date-received
set editor = "nvim"
# Cache
set header_cache = "~/.cache/neomutt/headers"
set message_cachedir = "~/.cache/neomutt/bodies"
# Découverte automatique des dossiers IMAP
set imap_check_subscribed = yes
# Rendu HTML
auto_view text/html
alternative_order text/plain text/enriched text/html

record = "" évite les doublons - Gmail sauvegarde automatiquement les envois côté serveur.

Le mot de passe à renseigner est un mot de passe d’application Gmail, pas le mot de passe du compte. À générer dans les paramètres de sécurité Google.

# Sidebar
set sidebar_visible = yes
set sidebar_width = 25
set sidebar_short_path = yes
set sidebar_delim_chars = "/"
set sidebar_format = "%B%?F? [%F]?%* %?N?%N/?%S"
# Ordre des dossiers
mailboxes +INBOX \
"+[Gmail]/Brouillons" \
"+[Gmail]/Corbeille" \
"+[Gmail]/Important" \
"+[Gmail]/Messages envoyés" \
"+[Gmail]/Spam"
# Navigation
bind index,pager \CP sidebar-prev
bind index,pager \CN sidebar-next
bind index,pager \CO sidebar-open
bind index,pager B sidebar-toggle-visible

Format sidebar_format :

  • %B → nom du dossier
  • %?F? [%F]? → nb de flagged si > 0
  • %* → espace
  • %?N?%N/? → nb de non-lus si > 0
  • %S → total de messages

Avec imap_check_subscribed = yes, les dossiers sont découverts automatiquement. Le bloc mailboxes sert uniquement à contrôler l’ordre d’affichage.

Les noms des dossiers Gmail varient selon la langue du compte. Pour voir les noms exacts disponibles sur ton compte : c puis ? dans neomutt pour ouvrir le browser IMAP.

Dans l’index, chaque mail affiche un ou plusieurs flags :

FlagSignification
NNew - arrivé depuis la dernière session, non lu
OOld - présent avant la dernière session, non lu
rReplied - tu as répondu
!Flagged - marqué (= étoile Gmail / drapeau Outlook)
DDeleted - marqué pour suppression
*Tagged - sélectionné pour action groupée
+To me - destinataire direct
CCC - en copie
LList - envoyé via mailing list
SSigned - signé GPG
EEncrypted - chiffré GPG

N et O sont tous les deux non lus - la différence : N est arrivé après ta dernière ouverture de neomutt, O était déjà là et jamais ouvert.

! et * ne sont pas la même chose :

  • ! → persistant, synchronisé IMAP (étoile Gmail). À utiliser pour marquer “à traiter”.
  • * → temporaire, local à la session. Sert uniquement à sélectionner des mails pour des actions groupées avec ;.
ToucheAction
j / kMail suivant / précédent
<Enter>Ouvrir le mail
mNouveau mail
rRépondre
RReply all
fForwarder
dSupprimer
uAnnuler suppression
sDéplacer vers un dossier
cChanger de dossier
/Chercher
lFiltrer (limit)
tTagger un mail
TTagger par pattern
;Action sur tous les tagués
FFlaguer / déflaguer
<Tab>Prochain thread non lu
<Space>Replier / déplier un thread
ToucheAction
SpacePage suivante
-Page précédente
j / kLigne suivante / précédente
qRetour à l’index
hAfficher les headers complets
vVoir les pièces jointes

Neomutt regroupe les mails en threads via les headers IMAP :

  • Message-ID → identifiant unique du mail
  • In-Reply-To → ID du mail parent
  • References → toute la chaîne
set sort = threads
set sort_aux = last-date-received

Dans l’index, indique un thread replié. <Space> pour déplier, <Tab> pour sauter au prochain non lu.

Le principe : tu sélectionnes un ensemble de mails par pattern, et tu leur appliques une action d’un coup.

Tagger :

t → toggle tag sur un mail
T~N → tague tous les non lus
T~f addr → tague tous les mails d'un expéditeur
^T → détagger par pattern

Patterns disponibles :

~N → non lus
~F → flaggés
~D → supprimés
~R → lus
~O → old (non lus, pas nouveaux)
~s mot → sujet contient "mot"
~f addr → expéditeur
~b mot → corps contient "mot"
~d >7d → reçu il y a plus de 7 jours
~A → tous

Actions groupées avec ; :

;d → supprimer tous les tagués
;s → déplacer tous vers un dossier
;! → flaguer tous
;C → copier tous

Exemple - vider les notifications GitHub :

T~f notifications@github.com # tague tout ce qui vient de GitHub
;d # supprime
$ # sync

l filtre l’affichage de l’index sans toucher aux mails :

l ~N → que les non lus
l ~F → que les flaggés
l ~s "mot" → que les mails avec "mot" dans le sujet
l ~A → reset, tout réafficher

C’est ma façon préférée de traiter un type de mail en masse - filtrer, agir, reset.

Le postpone est le mécanisme natif de neomutt pour interrompre une rédaction et y revenir plus tard :

  • En cours de rédaction → Ctrl+O pour postponer
  • m depuis l’index → neomutt propose automatiquement de reprendre le postponed

La différence avec un brouillon classique : le postpone sauve aussi le contexte de réponse (thread, destinataire). Avec set postponed = "+[Gmail]/Brouillons", les postponed sont aussi visibles depuis Gmail.

Mutt/neomutt te laisse tout configurer : ce qui est coloré, comment, et selon quels critères (expéditeur, sujet, flags…). Aucun thème imposé, contrairement aux clients graphiques.

Sans config couleur, neomutt hérite des couleurs du terminal. Les thèmes viennent de la communauté ou s’écrivent à la main.

Je sépare les couleurs dans un fichier dédié, sourcé depuis le neomuttrc :

source ~/.config/neomutt/colors.rc

Dans mon cas j’utilise Gruvbox Dark - à adapter selon ton thème :

# Sidebar
color sidebar_ordinary color246 color235
color sidebar_new color142 color235
color sidebar_flagged color208 color235
color sidebar_highlight color235 color109
color sidebar_indicator color223 color237
color sidebar_divider color239 color235
# Index
color index color223 color235 "~A"
color index color142 color235 "~N"
color index color208 color235 "~F"
color index color167 color235 "~D"
color index_author color109 color235 "~N"
color index_subject color142 color235 "~N"
color index_date color246 color235
# Headers
color header color246 color235 ".*"
color header color109 color235 "^(From|To|Cc):"
color header color214 color235 "^Subject:"
color header color108 color235 "^Date:"
# Corps
color quoted color246 color235
color quoted1 color108 color235
color quoted2 color109 color235
color signature color239 color235
# UI
color status color235 color214
color prompt color214 color235
color error color167 color235
color search color235 color214