En résumé

Problème : configurer Postfix sur un serveur mail, c’est souvent un copier-coller de lignes obscures sans comprendre ce qu’elles font.
Solution : la configuration main.cf complète de mon serveur srv-hosting, commentée bloc par bloc : TLS, DANE, SASL, milters DKIM, LMTP.
Temps de lecture : 8 min

🎯 Introduction (accroche SEO)

La configuration Postfix est le cœur de tout serveur mail self-hosted. Pourtant, main.cf reste un fichier intimidant : des dizaines de lignes, des paramètres obscurs, et pas toujours de commentaires clairs. Voici le fichier main.cf complet qui tourne en production sur srv-hosting (Debian 12 + Virtualmin), avec un décryptage de chaque bloc : TLS, DANE, SASL/Dovecot, restrictions, milters DKIM et livraison LMTP. Tu peux t’en servir comme base pour ton propre serveur.

🛠️ La configuration étape par étape

Étape 1 : Le fichier main.cf de référence

Voici l’intégralité du fichier main.cf de production, tel qu’il est actif sur le serveur :

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

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

# appending .domain is the MUA’s job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6

# TLS parameters
smtpd_tls_security_level = may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level = dane
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = srv-hosting.democrasite.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, srv-hosting.democrasite.com, localhost.democrasite.com, localhost, democrasite.com, kameleon.fr
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
#mailbox_command = /usr/bin/procmail-wrapper -o -a $DOMAIN -d $LOGNAME
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
virtual_alias_maps = hash:/etc/postfix/virtual
sender_bcc_maps = hash:/etc/postfix/bcc
sender_dependent_default_transport_maps = hash:/etc/postfix/dependent
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
# corrigé le 21/05/2026 smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_policy_service inet:127.0.0.1:10023
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_policy_service inet:127.0.0.1:10023
spfcheck_time_limit = 3600
smtp_dns_support_level = dnssec
smtp_host_lookup = dns
allow_percent_hack = no
resolve_dequoted_address = no
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
tls_server_sni_maps = hash:/etc/postfix/sni_map
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:1002
virtual_gid_maps = static:1002
policyd-spf_time_limit = 3600
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtp_tls_cert_file = /etc/letsencrypt/live/democrasite.com/fullchain.pem
smtp_tls_key_file = /etc/letsencrypt/live/democrasite.com/privkey.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/democrasite.com/chain.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/democrasite.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/democrasite.com/privkey.pem

Étape 2 : Décryptage des points clés

Identité et domaines

TLS entrant et sortant

Authentification SASL avec Dovecot

Restrictions et policy SPF

Milters DKIM

Livraison locale : Maildir et Dovecot LMTP

Certificats TLS Let’s Encrypt

⚠️ Points d’attention

Attention

Cohérence du socket milter : cette config déclare smtpd_milters = inet:127.0.0.1:8891. Vérifie que /etc/opendkim.conf et /etc/default/opendkim utilisent bien la même adresse (inet:8891@localhost ou inet:127.0.0.1:8891), sinon la signature DKIM ne fonctionne pas.

✅ Résultat final

Cette configuration est celle qui tourne en production sur srv-hosting (Debian 12, ARM64, Virtualmin). Elle combine authentification, sécurité TLS/DANE et signature DKIM.

Avant Après
Serveur mail sans politique de sécurité claire TLS + DANE + DNSSEC, protocoles obsolètes bloqués
Authentification SMTP non définie SASL via Dovecot (private/auth)
SPF non contrôlé Policy service policyd-spf sur le port 10023
DKIM absent Milters OpenDKIM sur le port 8891
Livraison locale non optimisée Maildir + livraison LMTP via Dovecot

Checklist de validation :

# Commande de validation finale
sudo postfix check

🎓 Conclusion

Voilà, tu as maintenant une configuration Postfix main.cf complète, éprouvée en production, avec chaque bloc expliqué : TLS/DANE, SASL Dovecot, restrictions SPF, milters DKIM et livraison LMTP. Tu peux t’en inspirer ligne par ligne pour ton propre serveur mail. Et toi, quels paramètres main.cf utilises-tu ? Tu as déjà testé DANE ou tu restes en TLS opportuniste ? Raconte-moi ça en commentaire !

📚 Ressources complémentaires

💬 Ton avis ?

Cette config commentée t’aide à y voir plus clair dans main.cf ? Tu veux un article dédié à un bloc précis (DANE, policyd-spf, LMTP) ? Laisse un commentaire, je réponds !

📚 Dans la même série

Postfix et ses amis — Article 1

Postfix main.cf : ma configuration serveur mail commentée 👈 (tu es ici)

🔗 Articles liés