Dovecot

Passer à Maildir

Première chose à faire, passer au format de stockage des messages « Maildir ». C'est extrêmement simple; Postfix sait gérer ce format, il suffit d'ajouter une ligne à notre /etc/postfix/main.cf :

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
myhostname = cyrus.nain-t.net
myorigin = $myhostname
mydestination = $myhostname, localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
relayhost = 
mynetworks = 127.0.0.0/8 192.168.0.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/

Généralement, un simple postfix reload suffit pour que le serveur relise sa configuration.

Essayons :

mail prof
Subject: Test Maildir
Nous passons a Maildir
.
Cc: 

Dans les logs :

Jun  3 14:22:58 cyrus postfix/pickup[20275]: 26D4D67D9E: uid=0 from=<root>
Jun  3 14:22:58 cyrus postfix/cleanup[20287]: 26D4D67D9E: message-id=<20080603122258.26D4D67D9E@cyrus.nain-t.net>
Jun  3 14:22:58 cyrus postfix/qmgr[20273]: 26D4D67D9E: from=<root@cyrus.nain-t.net>, size=329, nrcpt=1 (queue active)
Jun  3 14:22:58 cyrus postfix/local[20289]: 26D4D67D9E: to=<prof@cyrus.nain-t.net>, orig_to=<prof>, relay=local, delay=0.05, delays=0.03/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jun  3 14:22:58 cyrus postfix/qmgr[20273]: 26D4D67D9E: removed

Tout s'est bien passé. Mais où est allé notre message ? Est-il toujours dans /var/mail/ ? Non. Tout se passe désormais dans le répertoire de l'utilisateur :

# su prof
prof@cyrus:~/Maildir/new$ cd ~

prof@cyrus:~$ ls
Maildir

prof@cyrus:~$ cd Maildir/
prof@cyrus:~/Maildir$ ls
cur  new  tmp

prof@cyrus:~/Maildir$ cd new/
prof@cyrus:~/Maildir/new$ ls
1212495778.V306I7b467M188615.cyrus

prof@cyrus:~/Maildir/new$ cat 1212495778.V306I7b467M188615.cyrus
Return-Path: <root@cyrus.nain-t.net>
X-Original-To: prof
Delivered-To: prof@cyrus.nain-t.net
Received: by cyrus.nain-t.net (Postfix, from userid 0)
	id 26D4D67D9E; Tue,  3 Jun 2008 14:22:58 +0200 (CEST)
To: prof@cyrus.nain-t.net
Subject: Test Maildir
Message-Id: <20080603122258.26D4D67D9E@cyrus.nain-t.net>
Date: Tue,  3 Jun 2008 14:22:58 +0200 (CEST)
From: root@cyrus.nain-t.net (root)

Nous passons a Maildir
prof@cyrus:~/Maildir/new$ 
Dans le « home » de l'utilisateur, Postfix a créé un répertoire Maildir. Dedans, il y a 3 répertoires : cur, new et tmp. C'est dans new que Postfix range les messages entrants, un message par fichier. /var/mail/prof n'a plus de service.

Reste maintenant à installer Dovecot, pour permettre d'exploiter à distance le contenu de ~/Maildir, par l'entremise d'IMAP et éventuellement POP3.

Installation de Dovecot

Dovecot est fourni dans toutes les « bonnes » distributions GNU/Linux (et Debian en est une). Aperçu de quelques paquets relatifs à Dovecot sur une Debian Jessie:

# aptitude search dovecot
...                                                          
p   dovecot-core                                        - secure POP3/IMAP server - core files                         
...
p   dovecot-imapd                                       - secure POP3/IMAP server - IMAP daemon                        
... 
p   dovecot-managesieved                                - secure POP3/IMAP server - ManageSieve server                 
... 
p   dovecot-pop3d                                       - secure POP3/IMAP server - POP3 daemon                        
p   dovecot-sieve                                       - secure POP3/IMAP server - Sieve filters support              
...

Parmi les plus importants pour ce qui nous intéresse ici, relevons les paquets contenant le cœur du serveur, ce qui est nécessaire à la gestion des protocoles ipam et pop3, ainsi que sieve qui permet le filtrage et le classement des messages directement à leur arrivée, donc sans l'intervention d'un quelconque MUA.

# aptitude install dovecot-imapd dovecot-pop3d

Les NOUVEAUX paquets suivants vont être installés :     
  dovecot-core{a} dovecot-imapd dovecot-pop3d

0 paquets mis à jour, 3 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 3 854 ko d'archives. Après dépaquetage, 8 772 ko seront utilisés.
Voulez-vous continuer ? [Y/n/?]
...
Paramétrage de dovecot-imapd (1.0.rc15-2etch4) ...

Configuration de Dovecot

La configuration du pigeonnier a beaucoup évolué, du moins dans sa forme sinon dans son esprit depuis son origine. Cette page a été «actualisée» avec la version 2.2.13 de Debian Jessie.

Nous avons désormais une multitude de fichiers placés dans /etc/dovecot/conf.d tout en ayant toujours un /etc/dovecot/dovecot.conf. Si nous le vidons de ses commentaires, il se résume à ceci:

!include_try /usr/share/dovecot/protocols.d/*.protocol
dict {
}
!include conf.d/*.conf
!include_try local.conf

autrement-dit à rien si ce n'est à des références vers d'autres fichiers.

Comme ceci risquerait malgré tout de rester trop simple, nous avons également un /etc/default/dovecot. Nous savons que ce type de fichier n'a en général d'influence que sur les scripts de démarrage. Par défaut, il ne contient que des commentaires:

# Set to '0' to explicitly disable starting Dovecot
#ENABLED=0

# Set to '1' to allow Dovecot daemons to produce core dumps
#ALLOW_COREDUMPS=1

ce qui est très bien comme ça.

/usr/share/dovecot/protocols.d/

Avec notre installation, il n'y a que deux fichiers, imapd.protocol et pop3d.protocol. Par curiosité voyons ce qu'il y a dans imapd.protocol:

protocols = $protocols imap

Voilà qui promet…

conf.d/

Ici, c'est autre chose, la liste des fichiers présents ne présage rien de bon:

ls -1 conf.d
10-auth.conf
10-director.conf
10-logging.conf
10-mail.conf
10-master.conf
10-ssl.conf
10-tcpwrapper.conf
15-lda.conf
15-mailboxes.conf
20-imap.conf
20-pop3.conf
90-acl.conf
90-plugin.conf
90-quota.conf
auth-checkpassword.conf.ext
auth-deny.conf.ext
auth-dict.conf.ext
auth-master.conf.ext
auth-passwdfile.conf.ext
auth-sql.conf.ext
auth-static.conf.ext
auth-system.conf.ext
auth-vpopmail.conf.ext

local.conf

Ce fichier n'existe même pas, mais il est possible de le créer si l'on souhaite compliquer encore plus les choses (ou au contraire, les simplifier). En effet, ce fichier, s'il existait, serait lu en dernier et ce qu'il contiendrait écraserait tout le reste si nécessaire.

Premier essai

La question est Est-ce que, avec la configuration par défaut, nous aurions des chances que ça marche ? Et la réponse est:

netstat -lapte | grep dovecot
tcp        0      0 *:pop3                  *:*                     LISTEN      root       14267       3720/dovecot    
tcp        0      0 *:imap2                 *:*                     LISTEN      root       14295       3720/dovecot    
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN      root       14268       3720/dovecot    
tcp6       0      0 [::]:imap2              [::]:*                  LISTEN      root       14296       3720/dovecot    

Donc il est permis d'espérer. Les ports pop3 et imap sont effectivement à l'écoute.

Essayons…

Depuis une console locale:

telnet localhost 143

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
10 capability
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN
10 OK Pre-login capabilities listed, post-login capabilities have more.

20 login prof epikoi
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES
THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS
LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS
SPECIAL-USE BINARY MOVE
20 OK Logged in

Tout ceci est bien encourageant…

Essayons la même chose, mais depuis un autre nœud du réseau:

telnet cyrus.nain-t.net 143

Trying 192.168.60.115...
Connected to 192.168.60.115.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LOGINDISABLED] Dovecot ready.
Qu'est-ce à dire, ce LOGINDISABLED ? Essayons tout de même:
10 login prof epikoi

* BAD [ALERT] Plaintext authentication not allowed without SSL/TLS, but your client did it anyway.
If anyone was listening, the password was exposed.
10 NO [PRIVACYREQUIRED] Plaintext authentication disallowed on non-secure (SSL/TLS) connections.

Dovecot, par défaut, aurait donc des tendances paranoĩaques. S'il accepte en privé les connexions en clair, il n'accepte en public que TLS. L'attitude n'est pas absurde, mais du coup, il va nous falloir mettre les mains dans le cambouis car, qui TLS dit «chiffrement» donc «certificats X509».

L'horizon s'obscurcit.