Installation de mutt-notmuch

Note pour moi-même : je n'utilise finalement pas notmuch.

Note pour les autres : comme j'avais rédigé ça, je le laisse là, des fois que ça puisse servir.

Compilation et installation

Récupération du dépôt :

cd tmp 
git clone https://github.com/karelzak/mutt-kz/ mutt-notmuch
cd mutt-notmuch
./prepare

Installation de dépendances (non encore installées chez moi) :

sudo apt-get install libcdk5 libcdk5-dev libgpg-error-dev libgpgme11-dev libnotmuch-dev \ 
libnotmuch3 libdb-dev libncursesw5-dev
sudo apt-get install --no-install-recommends notmuch

Configuration avec les options qui vont bien :

./configure --enable-gpgme --enable-hcache --enable-imap --enable-locales-fix \ 
--enable-mailtool --enable-pop --enable-smtp --with-gnutls --with-ssl \ 
--enable-notmuch --with-wc-funcs --enable-iconv

Compilation puis installation :

make
sudo make install

Mise à jour des alternatives :

sudo update-alternatives --install /usr/bin/mutt mutt /usr/local/bin/mutt 40
sudo update-alternatives --config mutt

Paramétrages

Paramétrage dans ~/.notmuch-config :

# .notmuch-config - Configuration file for the notmuch mail system
# For more information about notmuch, see http://notmuchmail.org

# Database configuration
#
# The only value supported here is 'path' which should be the top-level
# directory where your mail currently exists and to where mail will be
# delivered in the future. Files should be individual email messages.
# Notmuch will store its database within a sub-directory of the path
# configured here named ".notmuch".
[database]
path=/home/<login>/Mail

# User configuration
#
# Here is where you can let notmuch know how you would like to be
# addressed. Valid settings are
#
#       name            Your full name.
#       primary_email   Your primary email address.
#       other_email     A list (separated by ';') of other email addresses
#                       at which you receive email.
#
# Notmuch will use the various email addresses configured here when
# formatting replies. It will avoid including your own addresses in the
# recipient list of replies, and will set the From address based on the
# address to which the original email was addressed.
[user]
name=<Nom>
primary_email=<user>@<domain.tld>
other_email=<otheruser>@<otherdomain.tld>

# Configuration for "notmuch new"
#
# The following options are supported here:
#
#       tags    A list (separated by ';') of the tags that will be
#               added to all messages incorporated by "notmuch new".
[new]
tags=new;inbox;

Paramétrage du marquage des mails, dans Mail/.notmuch/hooks/post-new :

#!/bin/sh

notmuch tag +collectif +asso    -- tag:new AND \( folder:INBOX.asso* OR folder:archives.asso* OR from:root@monasso.tld \)

notmuch tag +spam                -- tag:new AND \( folder:Junk \)
notmuch tag +archive             -- tag:new AND \( folder:archives* \)
notmuch tag -inbox               -- tag:new AND \( folder:Draft* OR folder:Send* OR folder:Junk OR folder:Archives* \)

notmuch tag -new                 -- tag:new

Installation et paramétrage de offline-imap

Installation :

sudo apt-get install offlineimap

Paramétrage dans ~/.offlineimaprc :

[general]
accounts = <login>

[Account <login>]
autorefresh = 0.25
quick = 10
localrepository = Local
remoterepository = Remote
postsynchook = notmuch new

[Repository Local]
type = Maildir
localfolders = ~/Mail

[Repository Remote]
type = IMAP
ssl = yes
remotehost = imap.domain.tld
remoteuser = <login>
remotepass = <pwd>
nametrans = lambda x: '.' if x in ['INBOX',] else '.' + x

Ensuite, on lance avec :

offlineimap

Et ça recopie en local l'arborescence du ou des serveurs Remote (on peut mettre plusieurs remoterepository pour tout récupérer sur un même poste.

Installation de dovecot en local

apt-get install dovecot-core dovecot-imapd

S'assurer que dovecot n'écoute que sur l'IP locale, puis ajouter la ligne :

protocols = imap

dans le dovecot.conf.

Installation de postfix en relai — poster sur un serveur maîtrisé

Configuration de postfix en local

On installe postfix si ce n'est pas déjà fait :

apt-get install postfix postfix-pcre

Penser aussi à supprimer un autre serveur de mail qui traînerait sur la machine…

Génération d'un certificat auto-signé :

openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/ssl/private/postfix-monposte.pem -out /etc/ssl/certs/postfix-monposte.pem

Cette commande génère le certificat x509 et la clef privée (valables 10 ans).

Le fichier main.cf :

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/postfix-monposte.pem
smtpd_tls_key_file = /etc/ssl/private/postfix-monposte.pem
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtp_use_tls = yes
smtp_tls_cert_file = /etc/ssl/certs/postfix-monposte.pem
smtp_tls_key_file = /etc/ssl/private/postfix-monposte.pem
smtp_tls_mandatory_ciphers = high
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_CApath = /etc/ssl/certs

myhostname = monposte.domain.tld
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = monposte.domain.tld, localhost.domain.tld, localhost
relayhost = smtp.domain.tld:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only

maximal_queue_lifetime = 183d
bounce_queue_lifetime = 183d
header_checks = pcre:/etc/postfix/header_checks

Les directives importantes :

  • les postfix-monposte.pem sont les clefs et certificats auto-signés qui seront utilisés pour la connexion au relai ;
  • relayhost pour spécifier quel est le serveur relai (à qui seront envoyés les mails dès qu'on a du réseau) – je spécifie le port 587 (submission) pour relayer le mail pour m'affranchir des réseaux trop fermés qui empêchent l'utilisation du port 25 ;
  • smtp_use_tls=yes pour obliger à chiffrer les connexions vers le relai (si le relai en question le supporte) ;
  • *_queue_lifetime pour garder beaucoup de queue, si on n'a pas de connexion pendant longtemps (je mets à peu près 6 mois) ;
  • header_checks, cf. ci-dessous.

Le fichier header_checks :

/^Received:.*/  IGNORE

Cette directive permet de supprimer toute référence à la machine « locale » (celle depuis laquelle on poste) dans les entêtes des mails envoyés.

Redémarrer postfix.

Configuration sur le serveur distant (relai)

Ici, je suppose que postfix est déjà installé et paramétré, je montre juste les morceaux à ajouter.

master.cf

La première chose à faire est de modifier le master.cf pour autoriser les clients authentifiés par certificats à envoyer du mail via cette machine :

submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o cleanup_service_name=submissioncleanup
  -o smtpd_tls_ask_ccert=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,permit_tls_clientcerts,reject
[…]
submissioncleanup   unix  n       -       -       -       0       cleanup
  -o header_checks=pcre:/etc/postfix/submission_headerchecks

Le mot-clef important est permit_tls_clientcerts. Dans le cleanup, on effectue une opération similaire à celle sur la machine « locale », pour supprimer toute référence à son IP ou à son nom dans les entêtes des mails que l'on relaie.

Le fichier submission_headerchecks :

/^Received:.*/            IGNORE
/^X-Originating-IP:.*/    IGNORE

main.cf

Pour autoriser le relai pour les machines clientes identifiées avec un certificat, il faut ajouter les lignes suivantes :

smtpd_tls_fingerprint_digest = sha1
relay_clientcerts = hash:/etc/postfix/relay_clientcerts

Par défaut, le daemon smtp vérifie les empreintes de clef en md5 ; si on veut pouvoir lui donner des empreintes en sha1 (lorsque j'ai écrit cette documentation pour la première fois, sha1 n'était pas encore dépassé, on doit maintenant pouvoir utiliser du sha256), il faut lui préciser. On donne ensuite le fichier contenant ces empreintes.

Si des restrictions sont en place, il faut ajouter le droit pour les machines authentifiées en TLS de passer ces restrictions. Ceci se fait en ajoutant la directive permit_tls_clientcerts dans chacune des restrictions, par exemple pour smtpd_client_restrictions :

smtpd_client_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    permit_tls_clientcerts

Il faut ensuite récupérer l'empreinte du certificat que l'on a créé sur la machine distante (le client), et le poser dans le fichier relay_clientcerts :

F8:A0:CF:6B:57:18:F0:03:EB:C9:AA:72:B1:A8:DB:F6:02:A7:00:EC user.at.machine

Pour récupérer l'empreinte du certificat :

openssl x509 -in /etc/ssl/certs/postfix-monposte.pem -noout -fingerprint

Penser à faire un postmap sur ce fichier relai, puis redémarrer postfix.