Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Gérer son courriel avec des logiciels libres

Ne pas avoir à utiliser un navigateur pour aller sur son webmail est un vrai gain de temps, en particulier si l'on utilise plusieurs adresses mail. D'autant plus qu'il existe de outils permettant de trier automatiquement vos mails selon de nombreux critères. Heureusement, les logiciels libres sont là, et vont nous permettre d'avoir un accès à notre courrier sur mesure.

Voici la présentation de quelques outils que je ne peux que vous conseiller.

Récupération du courrier avec fdm

Bien qu'il existe la possibilité d'utiliser les bulldozer fetchmail et procmail, je vous propose ici une solution plus légère : fdm. À lui tout seul, il peut récupérer vos e-mails, les trier selon le destinataire, l'émetteur, la date, archiver vos mails…

Par la suite, vous serez en mesure de lire vos mails localement, puisqu'ils seront téléchargés dans vos dossiers. Pour cela, on utilise des dossiers appelés Maildir, eux mêmes composés de sous-dossier cur, new et temp. Pensez donc à créer ces dossiers avant de récupérer vos mails.

L'installation est des plus simple : apt-get install fdm.

Maintenant, on peut le configurer. Pour cela, créez un fichier ~/.fdm.conf (le ‘~’ représentant votre répertoire utilisateur).

Notez qu'il existe des exemples de configuration dans /usr/share/doc/fdm

Ajout des comptes

On peut désormais préciser dans le fichier de configuration les comptes e-mail. Cela se fait avec la syntaxe suivante :

account "compte1" imap server "imap.serveur.net" port 143
    user "brucewayne" pass "******"

Ce qui est précisé entre guillemets ainsi que le numéro du port est à remplacer selon vos besoins. Sachez que “compte1” est le nom donné à ce compte, pour pouvoir se repérer ensuite dans la configuration. Il est tout à fait possible de définir plusieurs comptes de cette façon. Attention toutefois, pour les comptes imap ssl, remplacez imap par imaps

fdm le facteur du système

Pour recevoir les mails du système, ajoutez ces lignes au fichier de configuration ~/.fdm.conf, après tous les autres comptes. (lignes account ....

account "stdin" disabled stdin

Puis ceci dans le fichier ~/.forward, avec les " :

"|/usr/bin/fdm -m -a stdin fetch"

De cette façon, tous les mails qui sont envoyés par le système seront envoyés à fdm par l'entrée standard (stdin), et fdm les enverra sur le compte par défaut.

Plus d'infos à cette page, paragraphe “5.7 stdin and local mail” : http://fdm.sourceforge.net/

Définir des actions

fdm utilise un système d'“actions” pour traiter vos e-mails. Par exemple, on peut définir une action nommée “inlaposte”, pour déplacer les messages dans le dossier maildir “/home/brucewayne/Maildir/laposte”. Afin de se simplifier la vie, vous pouvez écrire %h à la place de /home/utilisateur, fdm le comprendra.

Voici donc un exemple pour déplacer du courrier dans un dossier précis :

action “inlaposte” maildir “%h/Maildir/laposte”

On va maintenant dire à fdm de placer les courriels destinés à ce compte dans le dossier correspondant. On écrit alors plus bas :

match account "laposte" action "inlaposte"

Gestion des spams

Pour gérer les spams, je vous conseille bogofilter. Je vous propose le comportement suivant : un mail arrive, bogofilter vérifie s'il s'agit d'un spam, et si oui, il ajoute un en-tête à ce spam. Ensuite, fdm se charge de placer les éventuels spam dans un dossier prévu à cet effet : ~/Maildir/spam

On définit alors les 2 actions suivantes, qui se chargent de filtrer les spams, et de déplacer dans le dossier spam :

action "antispam" rewrite "bogofilter -u -e -p"
action "inspam" maildir "%h/Maildir/spam"

Afin que bogofilter traite les éventuels spams, on va placer 3 autres lignes avant la ligne match account "laposte" action "inlaposte" :

# Tout passe par l'antispam
match all action "antispam" continue
match "^X-Spam-Status: Yes" in headers action "inspam"
match "^X-Bogosity: Yes" in headers action "inspam"

Ces trois lignes font passer tous (all) les mails à l'action antispam, puis continue. Ensuite, on vérifie si dans les en-têtes des mails (headers) sont présentes les lignes X-Spam-Status: Yes et X-Bogosity: Yes témoignant de la nature spam du mail. Si oui, alors ce mail est passé à l'action “inspam”, et placé dans le dossier des spams.

Listes de diffusion

De la même façon, on peut placer les mails destinés à une liste de diffusion dans un dossier à part. Cela se passe avec des expressions régulières (regexp) qui peuvent être trouvées dans le header ou le corps (body) du message :

match "^(From|Cc|To|List-Id).*@suckless\.org" in headers action "suckless"

Archivage

fdm peut apparemment archiver les mails plus vieux de n jours. Voici ce que l'on ajoute dans le fichier de configuration pour ce faire :

action "keep" keep
action "archive" mbox "%h/Maildir/archive/%[maildir]-%yq%Q" compress
account "archive" disabled maildirs {
    "%h/Maildir/laposte/"
    # insérer d'autres comptes ici
        }
match account "archive" action "keep"
match account "archive" {
match age invalid or age > 30 days action "archive"
match all action keep
}

Cela suppose qu'il existe un dossier appelé archive. Pour cela, tapez la commande : mkdir -p ~/Maildir/archive/. Les permissions doivent être à 700 : chmod -R 700 ~/Maildir/archive.

Ensuite, vous archivez en lançant la commande suivante : fdm -va archive fetch. Cette commande peut tout à fait avoir sa place dans le crontab :

43 12 * * 1 /usr/bin/fdm -va archive fetch

Récupérer le courrier

Pour récupérer le courrier, lancez la commande fdm fetch. Pour faire vos essais, rajoutez l'option -k afin de laisser les messages sur le serveur.

Si vous souhaitez que fdm récupère vos messages toutes les 5 minutes, tapez crontab -e, puis ajoutez cette ligne :

*/5 * * * * /usr/bin/fdm fetch >> $HOME/Maildir/fdm.log

Un exemple?

Cela fait beaucoup d'un coup. Vous trouverez plusieurs exemples dans /usr/share/doc/fdm/examples. Voici mon propre fdm.conf :

# Quelques options :
#set verify-certificates
set unmatched-mail keep
set parallel-accounts 2
# Les courriels plus vieux que %max_age sont archivés
%max_age    = 30
# simple actions
action "drop" drop
action "keep" keep
# actions à réaliser sur les mails
action "inlaposte" maildir "%h/Maildir/laposte"
action "infac" maildir "%h/Maildir/fac"
action "inlavabit" maildir "%h/Maildir/lavabit"
action "intoilelibre" maildir "%h/Maildir/toilelibre"
action "inboiteaspam" maildir "%h/Maildir/bas"
# Bogofilter super antispam
action "antispam" rewrite "bogofilter -u -e -p"
action "inspam" maildir "%h/Maildir/spam"
# Listes de diffusion
action "suckless" maildir "%h/Maildir/devlists/suckless"
action "gnewsense" maildir "%h/Maildir/devlists/gnewsense"
action "xfce" maildir "%h/Maildir/devlists/xfce"
action "debian" maildir "%h/Maildir/devlists/debian"
action "hurd" maildir "%h/Maildir/devlists/hurd"
### archiving action
action "archive" maildir "%h/Maildir/archive/
###
# Comptes courriel :
account "laposte" imap server "imap.laposte.net"
    user "xavier.cartron" pass "******"
account "fac" imaps server "imaps.etu.univ-nantes.fr" port 993
    user "user2" pass "********"
account "lavabit" imaps server "imap.lavabit.com" port 993
    user "bcnofne" pass "*************"
account "toilelibre" imaps server "imap.singularity.fr" port 993
    user "thuban@singularity.fr" pass "***************"
account "boiteaspam" imap server "imap.laposte.net"
    user "user4" pass "******************"
account "stdin" disabled stdin
###
# Archivage
account "archive" disabled maildirs {
    "%h/Maildir/laposte/"
    "%h/Maildir/lavabit/"
    "%h/Maildir/fac/"
    "%h/Maildir/toilelibre/"
    "%h/Maildir/bas/"
    "%h/Maildir/devlists/"
        }
match account "archive" and age > %{max_age} days action "archive"
match account "archive" action "keep"
# Tout passe par l'antispam
match all action "antispam" continue
match "^X-Spam-Status: Yes" in headers action "inspam"
match "^X-Bogosity: Yes" in headers action "inspam"
# Filtres pour les liste de diffusion :
match "^(From|Cc|To|List-Id).*@suckless\.org" in headers action "suckless"
match "^(From|Cc|To|List-Id).*@gnu\.org" in headers action "hurd"
match "^(From|Cc|To|List-Id).*@nongnu\.org" in headers action "gnewsense"
match "^(From|Cc|To|List-Id).*@xfce\.org" in headers action "xfce"
match "^(From|Cc|To|List-Id).*debian.*@lists\.debian\.org" in headers action "debian"
# On envoie les mails dans leurs boîtes
match account "laposte" action "inlaposte"
match account "fac" action "infac"
match account "lavabit" action "inlavabit"
match account "toilelibre" action "intoilelibre"
match account "boiteaspam" action "inboiteaspam"
# On attrape tout ce qui n'a pas été filtré
match all action "inlaposte"

Lire ses mails avec mutt

Il existe de très nombreux tutoriel pour utiliser mutt, je ne reviendrait donc pas dessus au risque de faire ça moins bien. Par exemple, vous pouvez lire :

Vous pouvez éventuellement consulter cette page pour utiliser mutt avec plusieurs comptes. Ainsi, vous pourrez passer d'une boite mail à l'autre en tapant sur la touche c.

Je me contenterai donc ensuite de lister quelques astuces à placer dans le fichier de configuration de mutt ~/.muttrc

Voici, en plusieurs fichiers, la configuration que j'utilise :

Fichier .muttrc :

set mbox_type=Maildir
set spoolfile = "~/Maildir/laposte"
set postponed="~/Maildir/draft"
set record="~/Maildir/sent"
set envelope_from=yes
# Pour utiliser msmtp
set sendmail="/usr/bin/msmtp"
# Pour être averti dans dwm
set beep_new=yes
# Emplacement de fichiers divers
set header_cache=~/.mutt/cache/headers
set message_cachedir=~/.mutt/cache/bodies
set certificate_file=~/.mutt/certificates
# Le fichier mailcap associant type de fichier et application
set mailcap_path    = ~/.mailcap
# Impression sympa
#set print_command="/usr/bin/muttprint -F Latex -p TO_FILE:/tmp/$USER.ps EPSON_Stylus_D88 %s"
set print_command="muttprint -P A4 -F Latex %s"
#set print_command="a2ps --borders=no --strip=3 -B -o /tmp/$USER.ps"
set reverse_name=yes
set reverse_realname=yes
set from="thuban@yeuxdelibad.net"
# Heures et dates françaises
set locale="fr_FR.UTF-8"
set charset="utf-8"     # character set for your terminal
set assumed_charset="utf-8"
set send_charset="utf-8:iso-8859-15:us-ascii"
set move = no
set copy = yes
set abort_unmodified=yes
# Automatically include message when replying
set include=yes
# Set default editor
# Vim avec vérification d'orthographe et commencement à la première ligne
set editor='vim + -c "set spell" -c "set spelllang=fr" -c "set wrap" -c "start" -c ":1"'
set sort = 'threads'
set sort_aux = 'last-date-received'
set check_new
set alias_file=~/.mutt/aliases
source $alias_file
# Unset Marking Mails Old
unset mark_old
# Pour les mailing lists
set followup_to=no
set honor_followup_to=no
#différent formats indiqué
set attribution="* %n <%a> [%{%Y-%m-%d %H:%M:%S %Z}]:
"
set folder_format="%N %f %F %s %t"
set index_format="%4C %Z  Exp: %-40.40f    Suj: %-50.50s %b %d %-20.20L (%?l?%4l&amp;%4c?)"
set pager_context=3
set nostrict_threads
set date_format="%H:%M:%S le %d %b %Y "
# permet lorsqu'on lit un mail de toujours avoir
# une liste affiché en haut dans une 2ème fenêtre
set pager_index_lines=9
# permet d'avoir les threads, et arbre en places
set sort=threads
set sort_aux = last-date-received
# les citations
set attribution="Le %d, %n a écrit :"
set forward_format="[Re: %s]"
set forward_quote
# config pour le html
set implicit_autoview
auto_view text/html
# Les couleurs
source ~/.mutt/colors
# les raccourcis
source ~/.mutt/keybinds
# GPG
source ~/.mutt/gpg
# Les dossiers
set folder = ~/Maildir
mailboxes +laposte
mailboxes +lavabit
mailboxes +toilelibre
#mailboxes +spam
mailboxes +fac
mailboxes +bas
mailboxes +devlists/xfce
mailboxes +devlists/debian
mailboxes +devlists/gnewsense
mailboxes +devlists/suckless
mailboxes +devlists/hurd
mailboxes +rss
#listes de diff
subscribe wiki@suckless.org
subscribe dev@suckless.org
subscribe hackers@suckless.org
subscribe bug-hurd@gnu.org
subscribe l4-hurd@gnu.org
subscribe help-hurd@gnu.org
subscribe debian-backports@lists.debian.org
subscribe debian-news-french@lists.debian.org
subscribe debian-backports-announce@lists.debian.org
subscribe debian-security-announce@lists.debian.org
subscribe debian-security@lists.debian.org
subscribe xfce4-dev@xfce.org
subscribe xfce@xfce.org
#hooks
#les alternatives
alternates     ^adresse1.domaine.net$ ^adresse2.domaine.net$
# Remplissage du champ From selon le dossier
folder-hook   +laposte           'my_hdr From: Xavier Cartron <thuban@yeuxdelibad.net>'
folder-hook   +toilelibre     'my_hdr From: Thuban <thuban@singularity.fr>'
folder-hook   +devlists/*      'my_hdr From: Thuban <thuban@singularity.fr>'
# on définit l'adresse
folder-hook   .          'set from="thuban@yeuxdelibad.net" \
    sendmail="/usr/bin/msmtp -a yeuxdelibad"'
folder-hook   +toilelibre     'set from="thuban@singularity.fr"\
    sendmail="/usr/bin/msmtp -a toilelibre"'
folder-hook   +devlists/*      'set from="thuban@singularity.fr"\
    sendmail="/usr/bin/msmtp -a toilelibre"'
# basé sur l'adresse qui sert à écrire, on met le bon msmtp
send-hook "~f ^thuban@yeuxdelibad.net$"  'set sendmail="/usr/bin/msmtp -a yeuxdelibad"'
send-hook "~f ^thuban@singularity.fr$"  'set sendmail="/usr/bin/msmtp -a toilelibre"'

Fichier ~/.mutt/keybinds

macro index,pager G "!fdm -vv fetch
"
macro index,pager b |urlscan
 'appelle urlview pour extraire les URLs des messages'
macro attach,compose b |urlscan
 'appelle urlview pour extraire les URLs des messages'
#raccourci à la vim
bind pager j next-line
bind pager k previous-line
# Gestion des spams
# F11 spam, F12 ham
macro index,pager S "|bogofilter -s
d"  "Apprendre comme spam et sauvegarder dans junk"
macro index,pager <space>s "|bogofilter -n
d"    "Apprendre comme non-spam et sauvegarder"
# Choix de l'adresse d'envoi
macro generic "<ESC>1" ':set sendmail="/usr/bin/msmtp -a laposte"'
macro generic "<ESC>2" ':set sendmail="/usr/bin/msmtp -a fac"'
macro generic "<ESC>3" ':set sendmail="/usr/bin/msmtp -a toilelibre"'
macro generic "<ESC>4" ':set sendmail="/usr/bin/msmtp -a lavabit"'
macro generic "<ESC>5" ':set sendmail="/usr/bin/msmtp -a boiteaspam"'
# Pour ouvrir les flux rss
#macro pager o "<pipe-entry>sensible-browser<enter>" 'Ouvre dans le navigateur'
# aller au dossier des rss directement
macro index,pager <Space>r <change-folder>=rss<Enter>

Fichier ~/.mutt/gpg pour chiffrer les mails

# GnuPG configuration
set pgp_use_gpg_agent=yes
set pgp_decode_command="gpg2 --status-fd=2 %?p?--passphrase-fd 0? --no-verbose --quiet --batch --output - %f"
set pgp_verify_command="gpg2 --status-fd=2 --no-verbose --quiet --batch --output - --verify %s %f"
set pgp_decrypt_command="gpg2 --status-fd=2 %?p?--passphrase-fd 0? --no-verbose --quiet --batch --output - %f"
set pgp_sign_command="gpg2 --no-verbose --batch --quiet --output - %?p?--passphrase-fd 0? --armor --detach-sign --textmode %?a?-u %a? %f"
set pgp_clearsign_command="gpg2 --no-verbose --batch --quiet --output - %?p?--passphrase-fd 0? --armor --textmode --clearsign %?a?-u %a? %f"
set pgp_encrypt_only_command="/usr/local/bin/pgpewrap gpg2 --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust -- -r %r -- %f"
set pgp_encrypt_sign_command="/usr/local/bin/pgpewrap gpg2 %?p?--passphrase-fd 0? --batch --quiet --no-verbose --textmode --output - --encrypt --sign %?a?-u %a? --armor --always-trust -- -r %r -- %f"
set pgp_import_command="gpg2 --no-verbose --import %f"
set pgp_export_command="gpg2 --no-verbose --export --armor %r"
set pgp_verify_key_command="gpg2 --verbose --batch --fingerprint --check-sigs %r"
set pgp_list_pubring_command="gpg2 --no-verbose --batch --quiet --with-colons --list-keys %r" 
set pgp_list_secring_command="gpg2 --no-verbose --batch --quiet --with-colons --list-secret-keys %r" 
set pgp_good_sign="^\[GNUPG:\] GOODSIG"
set pgp_ignore_subkeys
set pgp_autosign=yes
#set pgp_autoencrypt=no
set pgp_auto_decode=yes
set pgp_replysignencrypted
set pgp_replyencrypt=yes
set pgp_replysign=yes
set pgp_sign_as=0x31E493B37EF9F166
set pgp_timeout=32767
set pgp_verify_sig=yes
set pgp_getkeys_command="gpg2 --recv-keys %r"
#my_hdr X-GPG-Key-FingerPrint: 1180 F11D 11E6 1176 11CC E1B1 

Un .mailcap pour les pièces jointes

Voici un exemple de ~/.mailcap pour ouvrir les pièces jointes. Certains programmes sont en fait des scripts disponibles ici.

le fichier mailcap

Envoyer des mails avec msmtp

Msmtp se configure en éditant le fichier ~/.msmtprc. Sa syntaxe est très simple, puisqu'il suffit de préciser le nom du compte (qui sera utilisé avec mutt par exemple), puis de remplir le serveur, le mot de passe, le port, et éventuellement le nom qui apparaîtra au destinataire. Comme un exemple parle mieux :

account toilelibre
host smtp.singularity.fr
protocol smtp
from thuban@singularity.fr
tls_certcheck off
port 587
auth on
user thuban@singularity.fr
password *********

Vous pouvez éventuellement préciser en début du fichier tls on pour utiliser tls par défaut, et syslog on pour enregistrer les messages d'erreurs de msmtp dans le syslog.

Il est bien sur possible de préciser plusieurs comptes smtp. Pour choisir le compte avec lequel on souhaite envoyer un mail, il faut le préciser avec l'option -a. Par exemple, pour utiliser le compte (account) toilelibre ci- dessus, il faudra utiliser la commande : msmtp -a toilelibre, ce qui donne pour écrire un mail très rapide :

echo "Coucou!" | msmtp -a toilelibre correspondant@mail.zzz

Astuces reçues par cacatoes

cacatoes m'a gentiment envoyé quelques astuces par mail suite àc es recherches. Les voici :

Je réutilise une astuce trouvée sur le web:

macro compose v "<edit-from>^Uidentity_<tab>" "Select from"

…en ayant défini des alias au préalable:

alias identity_0        moncourrier1@boite.net
alias identity_1        autre@boite.org

Et là, ça se fait automatiquement via:

send2-hook "~f ^maboite@blop.com$" 'set sendmail="/usr/bin/msmtp -C
$HOME/.config/msmtp/msmtprc -a maboite"'

dans l'ordre, les hooks s'executent comme suit: d'abord reply-hook (lors du reply, si on reply), puis send-hook (avant composition), puis send2-hook (après composition)