Configurer un serveur mail avec Postfix et Dovecot

Credit : Logo officiel

Configurer un serveur mail avec Postfix et Dovecot

Dylan D. — Agent Support Technique Serveur DNS 1806 mots 10 min de lecture

Le client qui veut ses mails chez lui

L'autre semaine, un client cabinet d'avocats m'appelle : il veut absolument heberger ses mails sur son propre serveur, pas chez Google ni chez Microsoft. Confidentialite client oblige. Quand vous entendez ca en tant que sysadmin, vous savez que la semaine va etre longue. Configurer un serveur mail Linux proprement, c'est probablement la chose la plus chronophage et la plus piegeuse de l'administration systeme. Mais c'est faisable, et quand c'est en place, ca tourne pendant des annees.

Ce guide est ce que je deroule en production sur Debian 12 et Ubuntu 22.04 LTS quand un client demande son propre serveur mail. L'architecture cible :

Le serveur cible est un VPS IONOS 4 vCPU, 8 Go RAM, IP publique fixe. Indispensable.

Les DNS d'abord, sinon rien marche

Avant meme apt install, il faut configurer les enregistrements DNS chez votre registrar. C'est la cause numero 1 des mails qui partent en spam et c'est aussi la plus rapide a fixer.

mail.monsite.fr     A       203.0.113.50
monsite.fr          MX 10   mail.monsite.fr
monsite.fr          TXT     "v=spf1 mx a ip4:203.0.113.50 -all"
_dmarc.monsite.fr   TXT     "v=DMARC1; p=quarantine; rua=mailto:dmarc@monsite.fr; pct=100"

Et le PTR (reverse DNS) de votre IP doit pointer vers mail.monsite.fr. Chez IONOS, c'est dans Serveur > Reseau > IP > Reverse DNS. Sans PTR coherent, Gmail et Outlook bloquent automatiquement vos mails. Apprenez de mes echecs.

Verifiez avec dig :

dig +short MX monsite.fr
dig +short TXT monsite.fr
dig +short -x 203.0.113.50

Si les trois ne renvoient pas ce que vous attendez, attendez la propagation (jusqu'a 24h selon les TTL) avant d'aller plus loin.

Hostname et certificat SSL

Le hostname du serveur doit correspondre au nom MX :

sudo hostnamectl set-hostname mail.monsite.fr
echo "mail.monsite.fr" | sudo tee /etc/mailname

Generez le certificat Let's Encrypt avant Postfix, sinon le service refuse de demarrer :

sudo apt install certbot -y
sudo certbot certonly --standalone -d mail.monsite.fr -d webmail.monsite.fr

Les fichiers se retrouvent dans /etc/letsencrypt/live/mail.monsite.fr/. Le renouvellement est automatique via le timer systemd certbot.timer.

Installation et configuration de Postfix

sudo apt update
sudo apt install postfix postfix-policyd-spf-python -y

L'installeur demande le type de configuration : choisissez Site Internet. Le mail name : monsite.fr (sans le mail.).

Editez ensuite /etc/postfix/main.cf :

myhostname = mail.monsite.fr
mydomain = monsite.fr
myorigin = $mydomain
mydestination = $myhostname, $mydomain, localhost
mynetworks = 127.0.0.0/8 [::1]/128
inet_interfaces = all
inet_protocols = ipv4

# TLS sortant et entrant
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.monsite.fr/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.monsite.fr/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# Restrictions anti-spam
smtpd_helo_required = yes
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname,
    check_policy_service unix:private/policyd-spf

# Authentification SASL via Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

# Limites raisonnables
message_size_limit = 52428800
mailbox_size_limit = 0

Activez la submission (port 587) dans /etc/postfix/master.cf :

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Les clients mail (Thunderbird, Outlook) se connectent sur 587 avec STARTTLS pour envoyer.

Dovecot pour la reception IMAP

sudo apt install dovecot-imapd dovecot-lmtpd -y

Dans /etc/dovecot/conf.d/10-mail.conf :

mail_location = maildir:~/Maildir
mail_privileged_group = mail

Dans /etc/dovecot/conf.d/10-auth.conf :

disable_plaintext_auth = yes
auth_mechanisms = plain login

Le SSL dans /etc/dovecot/conf.d/10-ssl.conf :

ssl = required
ssl_cert = </etc/letsencrypt/live/mail.monsite.fr/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.monsite.fr/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = ECDHE+AESGCM:ECDHE+AES256:ECDHE+AES128:!aNULL:!MD5:!DSS

Le socket d'auth pour que Postfix puisse demander a Dovecot de valider les credentials, dans /etc/dovecot/conf.d/10-master.conf :

service auth {
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
    unix_listener auth-userdb {
        mode = 0600
        user = vmail
    }
}

service lmtp {
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
        mode = 0600
        user = postfix
        group = postfix
    }
}

DKIM avec OpenDKIM

Le DKIM signe cryptographiquement chaque mail sortant. Sans signature, Gmail et Outlook collent vos mails au spam direct, peu importe la qualite du contenu.

sudo apt install opendkim opendkim-tools -y
sudo mkdir -p /etc/opendkim/keys/monsite.fr
sudo opendkim-genkey -s default -d monsite.fr -D /etc/opendkim/keys/monsite.fr
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod 600 /etc/opendkim/keys/monsite.fr/default.private

Le fichier default.txt contient l'enregistrement DNS a publier :

default._domainkey.monsite.fr  TXT  "v=DKIM1; k=rsa; p=MIIBIjANBg..."

Configurez /etc/opendkim.conf :

Mode                 sv
Socket               inet:8891@localhost
Domain               monsite.fr
Selector             default
KeyFile              /etc/opendkim/keys/monsite.fr/default.private
UMask                002
UserID               opendkim:opendkim

Et branchez le milter dans Postfix (/etc/postfix/main.cf) :

milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Comptes utilisateurs : Linux ou virtuel ?

La version simple : un compte mail = un compte Linux. Vous creez useradd -m alice et alice peut envoyer/recevoir sur alice@monsite.fr. C'est suffisant pour 5 a 10 utilisateurs.

Au-dela, passez en boites virtuelles (un user systeme vmail qui possede toutes les Maildir, et une table SQL ou texte pour les alias). C'est plus de config mais ca scale mieux et ca evite de creer des comptes Linux a tout va.

sudo useradd -m -s /bin/bash alice
sudo passwd alice

Roundcube : le webmail PHP

sudo apt install roundcube roundcube-plugins -y

La config Nginx pour webmail.monsite.fr :

server {
    listen 443 ssl http2;
    server_name webmail.monsite.fr;

    ssl_certificate /etc/letsencrypt/live/mail.monsite.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.monsite.fr/privkey.pem;

    root /var/lib/roundcube/public_html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(ht|git) { deny all; }
}

Dans /etc/roundcube/config.inc.php, pointez vers le serveur IMAP local :

$config['imap_host'] = 'ssl://mail.monsite.fr:993';
$config['smtp_host'] = 'tls://mail.monsite.fr:587';
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

Redemarrez tout :

sudo systemctl restart postfix dovecot opendkim nginx php8.2-fpm
sudo systemctl enable postfix dovecot opendkim

Tester la deliverabilite

Le site mail-tester.com est l'outil de reference. Vous y recoltez une adresse aleatoire, vous lui envoyez un mail depuis votre serveur, il vous note sur 10. Avec SPF, DKIM, DMARC et PTR bien configures, vous devriez avoir 9 ou 10/10. Ma premiere config a eu 4/10 a cause du PTR oublie.

Testez aussi avec :

echo "Test" | mail -s "Test depuis mon serveur" votre.email@gmail.com
tail -f /var/log/mail.log

Les logs de /var/log/mail.log sont votre meilleur ami : ils montrent exactement ce qui se passe a chaque etape.

Antispam : SpamAssassin et Rspamd

Un serveur mail sans filtrage antispam, c'est une boite a spam. Deux options solides :

Rspamd (le moderne)

Rspamd est plus rapide et plus moderne que SpamAssassin :

sudo apt install rspamd redis-server -y
sudo systemctl enable rspamd

Dans /etc/postfix/main.cf, ajoutez Rspamd comme milter :

smtpd_milters = inet:localhost:8891 inet:localhost:11332
non_smtpd_milters = inet:localhost:8891 inet:localhost:11332

L'interface web sur http://localhost:11334 permet de voir les statistiques, les regles declenchees et d'entrainer le filtre bayesien :

# Apprendre comme spam
rspamc learn_spam /chemin/vers/spam.eml

# Apprendre comme ham
rspamc learn_ham /chemin/vers/ham.eml

Greylist

Le greylisting refuse temporairement le premier mail d'un expediteur inconnu, qui doit reessayer apres quelques minutes. Les vrais MTA reessaient, les bots spam pas. Ca elimine 60-70 % du spam :

sudo apt install postgrey -y

Dans main.cf :

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination,
    check_policy_service unix:private/policyd-spf,
    check_policy_service inet:127.0.0.1:10023

Sauvegarde des boites mail

Les boites mail s'accumulent vite (10-50 Go pour un cabinet d'avocats apres 2 ans). Backup quotidien indispensable :

#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP="/backup/mail/$DATE"
mkdir -p $BACKUP

rsync -az --delete /home/*/Maildir/ $BACKUP/
tar -czf /backup/mail-$DATE.tar.gz -C /backup/mail $DATE
find /backup -name 'mail-*.tar.gz' -mtime +30 -delete

# Sync offsite
rclone sync /backup/ offsite:mail-backup/

Programmez via cron :

0 2 * * * root /usr/local/bin/mail-backup.sh

Erreurs courantes et leur fix

"Relay access denied" quand un client externe envoie. Vous n'avez pas active SASL ou le client ne s'authentifie pas. Verifiez smtpd_sasl_auth_enable = yes et que le client utilise bien le port 587 avec STARTTLS, pas le 25.

"550 5.7.1 [your IP] Spamhaus". Votre IP est dans une RBL. Verifiez sur mxtoolbox.com/blacklists.aspx. Si c'est une nouvelle IP IONOS, demandez au support de la sortir des listes. Sinon, c'est qu'un autre client de votre hebergeur a spamme.

OpenDKIM ne signe pas. Regardez /var/log/mail.log pour des messages "key not found". Verifiez les permissions sur /etc/opendkim/keys/ : owner opendkim, mode 700 sur le repertoire et 600 sur les .private.

Roundcube affiche "Connection to storage server failed". Le hostname IMAP dans imap_host ne matche pas le certificat. Utilisez ssl://mail.monsite.fr:993, pas localhost:993.

Mails entrants en silence. Verifiez que le port 25 est ouvert dans le pare-feu IONOS et que inet_interfaces = all est bien dans main.cf. Beaucoup d'hebergeurs bloquent le 25 sortant pour eviter le spam, mais l'entrant doit etre ouvert.

Mails sortants "Connection timed out" vers Gmail. Votre IP est probablement dans une RBL ou le port 25 sortant est bloque par votre hebergeur. Testez avec telnet smtp.gmail.com 25 : si ca ne se connecte pas, contactez le support de votre VPS. Chez OVH, le port 25 sortant est bloque par defaut sur les VPS et il faut ouvrir un ticket pour le debloquer.

Dovecot "Permission denied" sur les Maildir. Les permissions du ~/Maildir ne sont pas bonnes. Le repertoire doit appartenir a l'utilisateur final avec mode 700. Corrigez avec chown -R user:user /home/user/Maildir && chmod -R 700 /home/user/Maildir.

Roundcube qui timeout au login. Le serveur PHP-FPM est sature ou la connexion IMAP locale est lente. Augmentez pm.max_children dans le pool PHP-FPM, et verifiez imap_timeout dans roundcube/config.inc.php.

Pour aller plus loin

Le serveur mail qui dort tranquille

Monter Postfix + Dovecot c'est long, je ne vais pas mentir. Mais une fois en place et bien teste, ca tourne pendant des annees sans intervention. Le secret c'est de prendre le temps sur les DNS et le DKIM, parce que c'est la que se joue 90 % de la deliverabilite. Si vous voulez vraiment eviter cette galere, regardez Mailu ou Mailcow : ce sont des stacks Docker qui packagent tout ca en une commande. C'est ce que je recommande aux clients qui n'ont pas besoin de configuration fine.

EDIT : depuis 2026, Google et Microsoft exigent SPF + DKIM + DMARC + ARC alignes pour les expediteurs en volume (5000+ mails/jour). Si vous comptez faire du transactionnel, prevoyez aussi un service comme Postmark ou Brevo en relais SMTP plutot que d'envoyer en direct depuis votre VPS.

# Articles similaires

Sur les memes sujets et plus loin