Mailutils-pop3d installation

Introduction

Mailutils prétend être le couteau suisse pour la gestion des mails. J'espère, quand même, que le couteau suisse est plus facile à utiliser. Mais vous allez voir, ça va bien se passer...

Ce document s'intéresse, uniquement à l'installation du serveur pop3d de mailutils dans le cadre d'une installation locale où l'on préfère la simplicité à la prétendue sécurité des autres serveurs de mail.

Le but est de servir les mails locaux aux clients comme Thunderbird en utilisant le protocole pop3 ou pop3s aux machines du réseau local.

Histoire et le pourquoi des choses...

Depuis que j'ai une machine Linux, j'ai un serveur mail local et pour accéder aux mails locaux, le client mail Thunderbird s'adresse au serveur pop3 qui s'active à la demande par l'intermédiaire de xinetd. Le serveur pop3 a été, successivement, popa3d, qpopper.

Void linux, que j'utilise, est une distribution Linux rolling release, qui n'est rien d'autre qu'une machine de compilation. Elle passe son temps à rechercher les paquets qyi ont évoluées, à les compiler, à compiler les dépendances et à la mettre à disposition sur leurs serveurs.

L'utilisateur, qui vient de faire une instalation, est donc tout de suite en décalage par rapport aux serveurs, ce qui n'empêche pas le fonctionnement.

Le problème survient dès que l'on veut installer une nouvelle application. Il faut, avant d'installer, synchroniser l'installation avec le serveur. Ce faisant, on a des chances de remplacer une application qui fonctioonait auparavent par une qui ne focntioone plus.

Dans mon cas, thundirbird ne sait plus parler à qpopper. Donc remplacons qpopper par pop3d de mailutils pour éviter les serveurs sur-dimensionner comme dovcocote ou cyrus qui sont plus orientés sur le protocole imap.

Configuration et compilation

Vous retrouverez tous les fichiers cités dans la zone de téléchargement.

Après téléchargement et extraction des sources de Mailutils, ici la version 3.15, on peut lancer la configuration par la comande sh doconf dont le contenu suit et qui exécute la commande ./configure.

./configure \
    --sysconfdir=/etc \
    --enable-debug \
    --disable-pam  \
    --disable-ldap  \
    --disable-maildir \
    --disable-python  \
    --without-unistring \
    --without-gsasl \
    --without-guile \
    --with-mail-rc=/etc/mail/mail.conf \
    --with-mail-spool=/var/mail \
    --disable-nls \
    --with-gdbm \
    --with-gnutls \
    --with-tokyocabinet \
    --with-kyotocabinet \
    --disable-virtual-domains \
    --disable-build-sieve  \
    --disable-build-guimb  \
    --disable-build-maidag \
    --disable-imap \
    --disable-build-imap4d \
    --disable-build-lmtpd \
    --disable-mh \
    --disable-build-mh

echo "#define MU_SITE_CONFIG_FILE \"/etc/mail/mailutils.conf\"" >> config.h
exit 0
#    --without-fribidi
#    --with-sql=MODLIST
#    --with-mysql
#    --with-postgres
#    --with-odbc[={odbc|iodbc}]
#    --with-mh-bindir=DIR
#    --with-virtual-pwddir=DIR
#    --without-readline
#    --with-gssapi
#    --with-guile-site-dir[=DIR]
#    --with-log-facility=facility
#    --with-berkeley-db[=ARG]
#    --with-ndbm
#    --disable-imap        Disables IMAP protocol support. 
#    --disable-pop         Disables POP protocol support. 
#    --disable-smtp        Disables support for SMTP mailer.
#    --disable-sendmail    Disables support for `Sendmail' mailer.
#    --disable-mh          Disables support for MH mailbox format.  
# --disable-build-servers    do not build server utilities
# --disable-build-clients    do not build client utilities
# --disable-pthread
#    --disable-build-comsat     do not build comsat
# --disable-build-frm        do not build frm
# --disable-build-mail       do not build mail
# --disable-build-pop3d      do not build pop3d
#    --disable-build-messages   do not build messages
# --disable-build-movemail   do not build movemail
# --disable-build-mimeview   do not build mimeview
# --disable-build-readmsg    do not build readmsg
# --disable-build-dotlock    do not build dotlock

Le but c'est d'enlever au maximum ce qui ne sert pas. Le fichier doconf est construit à partir du fichier READDME et des informations fournies par la commande ./configure --help.

Il y a des options qui ne sont pas définies qu'il faut mettre. Il y a des options qui ne sont pas acceptées et qui sont définies. Il y a des options définies qui n'ont auncune action. La dernière ligne définit la variable MU_SITE_CONFIG_FILE utilisée par toutes les applications mais définit nulle part.

Le résultat de doconf se termine par la table suivante: ce n'est pas trop pire !.

*******************************************************************
GNU Mailutils configured with the following settings:

Default mailbox scheme ........ mbox
Use PAM ....................... no
Use -ltdl ..................... yes
Use DBM ....................... GDBM
Use GNU TLS ................... yes
Use GSASL ..................... no
Use GSSAPI .................... yes
Use TCP wrappers .............. no
Pthread support ............... yes
Readline support .............. yes
Libunistring support .......... no
MySQL support ................. no
PostgreSQL support ............ no
LDAP support .................. yes
Radius support ................ no
Support for virtual domains ... no

IPv6 support .................. yes

Interfaces:

Guile ......................... no
C++ ........................... no
Python ........................ no

Mailbox formats:

IMAP .......................... no
POP ........................... yes
MH ............................ no
maildir ....................... no
dotmail ....................... yes

Mailers:

SMTP .......................... yes
Sendmail ...................... yes

Utilities to build:

Servers ....................... pop3d comsat mda
Clients ....................... putmail frm mail messages readmsg dotlock movemail mimeview decodemail

*******************************************************************

Before proceeding, verify if these satisfy your requirements.
configure: WARNING: unrecognized options: --disable-ldap, --disable-build-guimb, --disable-build-maidag

Avant de compiler, il faut modifier un fichier ./pop3d/cmd.c sinon tls ne fonctioonera pas. Voici le contenu du fichier pop3d.patch:

mailutils-3.15]$ cat pop3d.patch
--- ./pop3d/cmd.c~	2022-02-12 16:20:43.000000000 +0100
+++ ./pop3d/cmd.c	2022-10-01 18:42:36.736840623 +0200
@@ -138,6 +138,7 @@
 	  continue;
 
 	case MU_TLS_CONFIG_OK:
+	   tls_ok = 1;
 	  break;
 
 	default:

On peut compiler maintenant et installer dans /usr/local:

make
sudo make install

Après installation, la commande /usr/local/bin/mail (mailutils) vient perturber la commande /usr/bin/mail (mailx - send and receive Internet mail). On renomme la commande /usr/local/bin/mail.

sudo mv /usr/local/bin/mail /usr/local/bin/mumail
sudo mv /usr/local/share/man/man1/mail.1 /usr/local/share/man/man1/mumail.1

Génération des certificats pour le serveur pop3d

Avant de communiquer avec le serveur en tls, il faut générer des certificats auto-signé. On se sert pour cela de la recette de Grégory Soutadé, merci à lui pour son généreux partage.

Voici, en plus bref, les opérations exécutées:


mkdir -p -m665 /etc/mail/certs
chown root:mail /etc/mail/certs
chmod 660 /etc/mail/certs

cd  /etc/mail/certs

# générer la clé privée et le certificat racine de notre autorité de certification (CA)
openssl req -new -x509 -keyout hq_ca.key -out hq_ca.crt -days 36500 -newkey rsa:4096

# => hq_ca.crt  hq_ca.key

# Il faut commencer par créer une clé privée (2048 bits dans cet exemple) :
openssl genrsa -out olix.home.key 4096

# => hq_ca.crt  hq_ca.key  olix.home.cert

# La requête de signature (sans mot de passe)
openssl req -key olix.home.key -new -out olix.home.csr

# => hq_ca.crt  hq_ca.key  olix.home.cert  olix.home.csr

# le certificat final (signé par notre autorité) et valide 1 an (maximum recommandé)
openssl x509 -req -days 3650 -in olix.home.csr -CA hq_ca.crt -CAkey hq_ca.key -out olix.home.cert -CAcreateserial -CAserial olix.home_ca.srl

# => hq_ca.crt  hq_ca.key  olix.home.cert  olix.home.csr  olix.home.key  olix.home_ca.srl

chmod 600 /etc/mail/certs/hq_ca.key
chown root.root /etc/mail/certs/hq_ca.key

Configuration du serveur pop3d sans TLS

Ne pas oublier que pop3d renomme le fichier mailbox /var/mail/<user>. Si on utilise la fonction inotify du noyau linux, il faut refaire le inotify_watch après utilisation de pop3d, en effet le numéro d'inode a changé et ce n'est donc plus le même fichier. L'évèmnement IN_DELETE_SELF peut être utilisé à cet effet.

Les configurations données sont fonctionnelles, mais doivent être considérées comme non optimisées.

Pour tester, il vaut mieux commencer par la configuration sans TLS. Apres avoir installé le fichier de configuration mailutils.conf dans /etc/mail, on peut lancer le serveur pop3d dans un terminal. Pour un démarrage automatique, il faut installer le sevice en eécutant les commandes suivantes (Eh oui, c'est Void Linux !).

mkkdir /etc/sv/pop3d

echo #!/bin/sh > /etc/sv/pop3d/run
echo exec /usr/local/sbin/pop3d >> /etc/sv/pop3d/run
(cd  /etc/sv/pop3d ; ln -s run/runit/supervise.pop3d supervise)
ln -s /var/service/pop3d /etc/sv/pop3d

Voici le contenu de mailutils.conf pour une configuration sans TLS.

program pop3d {
  # Set daemon mode.
#  mode inetd;
  mode daemon;

  # Run in foreground.
  foreground true;

  # Maximum number of children processes to run simultaneously.
  max-children 20;

  # Store PID of the master process in file.
  pidfile /var/run/pop3d.pid;

  # Default port number.
  port 110;

  # Set idle timeout.
  timeout 60;

ldap {
  # Enable LDAP lookups.
  enable false;
}

debug {
  # Set Mailutils debugging level.
  level auth.trace2;
  
  # Prefix debug messages with Mailutils source locations.
  line-info true;
}


tls {
    # Specify SSL certificate file.
    ssl-certificate-file /etc/mail/certs/olix.home.cert;
    # Specify SSL certificate key file.
    ssl-key-file /etc/mail/certs/olix.home.key;
  # Specify trusted CAs file.
    ssl-ca-file  /etc/mail/certs/hq_ca.crt;
  # Set the priorities to use on the ciphers, methods, etc.
#  ssl-priorities string;
  # Set timeout for I/O operations during TLS handshake (seconds).
  handshake-timeout 60;
}

tls-file-checks {
  # Configure safety checks for SSL key file.
  key-file none;
  # Configure safety checks for SSL certificate.
  cert-file none;
  # Configure safety checks for SSL CA file.
  ca-file none;
}

mailbox {
  # Use specified url as a mailspool.
  mail-spool /var/mail;
  
  # Create mailbox url using pattern.
#  mailbox-pattern pattern;
  
  # Default mailbox type.
  mailbox-type mbox;
  
  # Default user mail folder.
#  folder dir;
}


locking {
  # Default locker flags.
#  type dotlock;
  type kernel;
  
  # Set the maximum number of times to retry acquiring the lock.
  retry-count 10;
  
  # Set the delay between two successive locking attempts.
  retry-sleep 1;
  
  # Expire locks older than this amount of time.
  expire-timeout 1;

  # Check if PID of the lock owner is active, steal the lock if it not. 
  pid-check true;

  # Use prog as external locker program.
#  external-locker prog;
}

logging {
  # Send diagnostics to syslog.
  syslog yes;
  
  # Print message severity levels.
  print-severity yes;
  
  # Output only messages with a severity equal to or
  # greater than this one.
  severity debug;
  
  # Set syslog facility.
  facility mail;

  # Log session ID
  session-id yes;
    
  # Tag syslog messages with this string.
  tag pop3d;
}

auth {
  # Set a list of modules for authentication.
  authentication system;
  
  # Set a list of modules for authorization.
  authorization system;
}


server 0.0.0.0:110  {

  # Run this server as a single process.
  single-process false;
  
  # Log the session transcript.
  transcript true;

  # Size of the queue of pending connections
  backlog 10:10;

  # Set idle timeout.
  timeout 60;
  
  # Kind of TLS encryption to use for this server.
#  tls-mode connection;
  tls-mode no;

  tls {
    # Specify SSL certificate file.
    ssl-certificate-file /etc/mail/certs/olix.home.cert;
    # Specify SSL certificate key file.
    ssl-key-file /etc/mail/certs/olix.home.key;
    # Specify trusted CAs file.
    ssl-ca-file  /etc/mail/certs/hq_ca.crt;
    # Set the priorities to use on the ciphers, methods, etc.
#    ssl-priorities string;
    # Set timeout for I/O operations during TLS handshake (seconds).
    handshake-timeout 60;
  }
  
  # Set server specific ACLs.
  acl { /* See ACL Statement. */ };
}
}

Configuration de Thunderbird Paramètres du compte / compte / serveurs / paramètres de sécurité :

préférences de thunderbird pour configuration sans TLS
préférences de thunderbird notls

Configuration du serveur pop3d sans TLS avec xinetd

Apres avoir installé le fichier de configuration mailutils.conf dans /etc/mail, if faut installer le fichier de configuration xinetd dans /etc/xinetd.d et relacer le service winetd. On peut alors se connecter avec le client.

Le fichier de configuration pour xinetd.

service pop3
{
	disable			= no
	flags			= REUSE NAMEINARGS
	socket_type		= stream
	wait			= no
	user			= root
	server			= /usr/local/sbin/pop3d
	server_args		= stderr
	instances		= 50
	port			= 110
	per_source		= 10
	log_type                = SYSLOG mail debug
}

#
# Second setup is for port 995. This is here primarily for Outlook
# and Outlook Express, which seem unable to get STARTTLS properly
# implemented.
#
service pop3s
{
	disable			= yes
	flags			= REUSE NAMEINARGS
	socket_type		= stream
	wait			= no
	user			= root
	server			= /usr/local/sbin/pop3d
	server_args		= stderr
	instances		= 50
	per_source		= 10
	port			= 995
	log_type                = SYSLOG mail debug
}

Voici le contenu de mailutils.conf pour une configuration sans TLS avec xinetd.

program pop3d {
  # Set daemon mode.
  mode inetd;
#  mode daemon;

  # Run in foreground.
  foreground true;

  # Maximum number of children processes to run simultaneously.
  max-children 20;

  # Store PID of the master process in file.
  pidfile /var/run/pop3d.pid;

  # Default port number.
  port 110;

  # Set idle timeout.
  timeout 60;

ldap {
  # Enable LDAP lookups.
  enable false;
}

debug {
  # Set Mailutils debugging level.
  level auth.trace2;
  
  # Prefix debug messages with Mailutils source locations.
  line-info true;
}


tls {
    # Specify SSL certificate file.
    ssl-certificate-file /etc/mail/certs/olix.home.cert;
    # Specify SSL certificate key file.
    ssl-key-file /etc/mail/certs/olix.home.key;
  # Specify trusted CAs file.
    ssl-ca-file  /etc/mail/certs/hq_ca.crt;
  # Set the priorities to use on the ciphers, methods, etc.
#  ssl-priorities string;
  # Set timeout for I/O operations during TLS handshake (seconds).
  handshake-timeout 60;
}

tls-file-checks {
  # Configure safety checks for SSL key file.
  key-file none;
  # Configure safety checks for SSL certificate.
  cert-file none;
  # Configure safety checks for SSL CA file.
  ca-file none;
}

mailbox {
  # Use specified url as a mailspool.
  mail-spool /var/mail;
  
  # Create mailbox url using pattern.
#  mailbox-pattern pattern;
  
  # Default mailbox type.
  mailbox-type mbox;
  
  # Default user mail folder.
#  folder dir;
}


locking {
  # Default locker flags.
#  type dotlock;
  type kernel;
  
  # Set the maximum number of times to retry acquiring the lock.
  retry-count 10;
  
  # Set the delay between two successive locking attempts.
  retry-sleep 1;
  
  # Expire locks older than this amount of time.
  expire-timeout 1;

  # Check if PID of the lock owner is active, steal the lock if it not. 
  pid-check true;

  # Use prog as external locker program.
#  external-locker prog;
}

logging {
  # Send diagnostics to syslog.
  syslog yes;
  
  # Print message severity levels.
  print-severity yes;
  
  # Output only messages with a severity equal to or
  # greater than this one.
  severity debug;
  
  # Set syslog facility.
  facility mail;

  # Log session ID
  session-id yes;
    
  # Tag syslog messages with this string.
  tag pop3d;
}

auth {
  # Set a list of modules for authentication.
  authentication system;
  
  # Set a list of modules for authorization.
  authorization system;
}


server 0.0.0.0:110  {

  # Run this server as a single process.
  single-process false;
  
  # Log the session transcript.
  transcript true;

  # Size of the queue of pending connections
  backlog 10:10;

  # Set idle timeout.
  timeout 60;
  
  # Kind of TLS encryption to use for this server.
#  tls-mode connection;
  tls-mode no;

  tls {
    # Specify SSL certificate file.
    ssl-certificate-file /etc/mail/certs/olix.home.cert;
    # Specify SSL certificate key file.
    ssl-key-file /etc/mail/certs/olix.home.key;
    # Specify trusted CAs file.
    ssl-ca-file  /etc/mail/certs/hq_ca.crt;
    # Set the priorities to use on the ciphers, methods, etc.
#    ssl-priorities string;
    # Set timeout for I/O operations during TLS handshake (seconds).
    handshake-timeout 60;
  }
  
  # Set server specific ACLs.
  acl { /* See ACL Statement. */ };
}
}

Configuration de Thunderbird : comme sans TLS voir au dessus.

Configuration du serveur pop3d avec TLS

Pour tester, apres avoir installé le fichier de configuration mailutils.conf dans /etc/mail, on peut lancer le serveur pop3d dans un terminal. Pour un démarrage automatique, il faut installer le sevice comme dans le cas sans TLS.

Voici le contenu de mailutils.conf pour une configuration sans TLS.

program pop3d {
  # Set daemon mode.
#  mode inetd;
  mode daemon;

  # Run in foreground.
  foreground true;

  # Maximum number of children processes to run simultaneously.
  max-children 20;

  # Store PID of the master process in file.
  pidfile /var/run/pop3d.pid;

  # Default port number.
  port 995;

  # Set idle timeout.
  timeout 60;

ldap {
  # Enable LDAP lookups.
  enable false;
}

debug {
  # Set Mailutils debugging level.
  level auth.trace2;
  
  # Prefix debug messages with Mailutils source locations.
  line-info true;
}


tls {
    # Specify SSL certificate file.
    ssl-certificate-file /etc/mail/certs/olix.home.cert;
    # Specify SSL certificate key file.
    ssl-key-file /etc/mail/certs/olix.home.key;
  # Specify trusted CAs file.
    ssl-ca-file  /etc/mail/certs/hq_ca.crt;
  # Set the priorities to use on the ciphers, methods, etc.
#  ssl-priorities string;
  # Set timeout for I/O operations during TLS handshake (seconds).
  handshake-timeout 60;
}

tls-file-checks {
  # Configure safety checks for SSL key file.
  key-file none;
  # Configure safety checks for SSL certificate.
  cert-file none;
  # Configure safety checks for SSL CA file.
  ca-file none;
}

mailbox {
  # Use specified url as a mailspool.
  mail-spool /var/mail;
  
  # Create mailbox url using pattern.
#  mailbox-pattern pattern;
  
  # Default mailbox type.
  mailbox-type mbox;
  
  # Default user mail folder.
#  folder dir;
}


locking {
  # Default locker flags.
  type kernel;
#  type dotlock;
  
  # Set the maximum number of times to retry acquiring the lock.
  retry-count 10;
  
  # Set the delay between two successive locking attempts.
  retry-sleep 1;
  
  # Expire locks older than this amount of time.
  expire-timeout 1;

  # Check if PID of the lock owner is active, steal the lock if it not. 
  pid-check true;

  # Use prog as external locker program.
#  external-locker prog;
}

logging {
  # Send diagnostics to syslog.
  syslog yes;
  
  # Print message severity levels.
  print-severity yes;
  
  # Output only messages with a severity equal to or
  # greater than this one.
  severity debug;
  
  # Set syslog facility.
  facility mail;

  # Log session ID
  session-id yes;
    
  # Tag syslog messages with this string.
  tag pop3d;
}

auth {
  # Set a list of modules for authentication.
  authentication system;
  
  # Set a list of modules for authorization.
  authorization system;
}


server 0.0.0.0:995  {

  # Run this server as a single process.
  single-process false;
  
  # Log the session transcript.
  transcript true;

  # Size of the queue of pending connections
  backlog 10:10;

  # Set idle timeout.
  timeout 60;
  
  # Kind of TLS encryption to use for this server.
  tls-mode connection;
#  tls-mode no;

  tls {
    # Specify SSL certificate file.
    ssl-certificate-file /etc/mail/certs/olix.home.cert;
    # Specify SSL certificate key file.
    ssl-key-file /etc/mail/certs/olix.home.key;
    # Specify trusted CAs file.
    ssl-ca-file  /etc/mail/certs/hq_ca.crt;
    # Set the priorities to use on the ciphers, methods, etc.
#    ssl-priorities string;
    # Set timeout for I/O operations during TLS handshake (seconds).
    handshake-timeout 60;
  }
  
  # Set server specific ACLs.
  acl { /* See ACL Statement. */ };
}
}

Configuration de Thunderbird Paramètres du compte / compte / serveurs / paramètres de sécurité :

préférences de thunderbird pour configuration avec TLS
préférences de thunderbird tls

Configuration du serveur pop3d avec TLS avec xinetd

Cette configuration n'est pas fonctioonelle, le serveur ne réagit pas ! Si vous avez une solution, n'hésiter pas à me la communiquer.

Commandes utiles

Commande pour lister les options de pop3d.

pop3d --help

Commande pour tester la syntaxe du fichier de configuration.

pop3d --config-lint

Commande pour générer un modèle de fichier de configuration.

pop3d --config-help

Références

  1. GNU Mailutils - Official GNU Software.
  2. Download de Mailutils.
  3. Certificat SSL/TLS auto signé.

Download