Dépendre des plateformes de mail, cela peut vous soulager d'un poids, suffit il que la plateforme fasse son travail et vous portes assistance quand vous en avez besoin.
Ce qui de nos jours est de plus en plus rare... On se demande qui est le client...
Et quand on voit google workspace, qui facture jusqu'à 16 euros par mois pour un email professionnel, cela peut décourager un certain nombre de personnes.
C'est pourquoi j'ai décidé de m'affranchir de ses plateformes et de créer mon propre serveur de mail sur mon serveur. (un serveur que je paye 9 euros par mois)
J'ai commencé avec chatGPT mais en fait j'ai tourné en rond pendant plusieurs heures et alors je suis passé sur Claude Opus 4.5 et tout s'est résolu en 1 heure seulement.
Avant de continuer de lire la suite de l'article, je vous invites à vous inscrire à ma newsletter, pour connaître en avant première les futurs sujets traités chaque semaine.
1. Installation du serveur mail sur votre serveur
Voici le github pour créer un serveur mail sur votre serveur (avec docker compose) et son webmail roundcube avec la double authentification (pour la sécurité):
https://github.com/mgrr/serveur_mail_pro
2. Configuration des DNS
La configuration DNS est une étape critique lors de la mise en place d’un serveur mail.
Sans elle, les emails risquent de ne pas arriver, d’être classés comme spam, ou d’être refusés par les grands fournisseurs (Gmail, Outlook, Yahoo…).
2.1. Le record MX : où envoyer les emails
Le record MX (Mail eXchanger) indique quel serveur reçoit les emails pour un domaine.
Exemple :
mathieugrenier.fr. MX 10 mail.mathieugrenier.fr.
👉 Cela signifie que tous les mails destinés à @mathieugrenier.fr seront envoyés vers mail.mathieugrenier.fr.
⚠️ Le serveur MX doit toujours pointer vers un nom de domaine, jamais directement vers une IP.
2.2. Le record A (ou AAAA) : résoudre le serveur mail
Le nom utilisé dans le MX doit lui-même pointer vers une IP via un record A (IPv4) ou AAAA (IPv6).
Exemple :
mail.mathieugrenier.fr. A ip_du_serveur
👉 C’est ce lien DNS qui permet aux autres serveurs de contacter physiquement votre serveur mail.
2.3. Le reverse DNS (PTR) : la cohérence IP ↔ domaine
Le reverse DNS (PTR) fait le chemin inverse :
il relie l’IP du serveur à son nom de domaine.
Exemple :
ip_du_serveur → mail.mathieugrenier.fr
📌 Ce point est fondamental pour la délivrabilité :
- Une IP sans reverse DNS est très souvent considérée comme suspecte
- Le nom retourné doit correspondre au serveur qui envoie les mails
👉 Le PTR se configure chez l’hébergeur, pas dans la zone DNS classique.
2.4. SPF : autoriser les serveurs à envoyer des mails
Le SPF (Sender Policy Framework) indique quels serveurs ont le droit d’envoyer des emails pour un domaine.
Il est défini via un record TXT.
Exemple simple :
mathieugrenier.fr. TXT "v=spf1 ip4:ip_du_serveur mx ~all"
Signification :
- mx : seuls les serveurs définis dans les MX peuvent envoyer des mails
- -all : tout le reste est refusé
👉 SPF protège contre l’usurpation d’adresse (spoofing).
2.5. DKIM : signer les emails
Le DKIM (DomainKeys Identified Mail) ajoute une signature cryptographique aux emails sortants.
Il repose sur :
- une clé privée sur le serveur mail
- une clé publique publiée en DNS (record TXT)
Exemple :
mail._domainkey.mathieugrenier.fr. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."
👉 La clé publique peut se trouver sur plusieurs lignes quand vous générer le DKIM, il faut concaténer les lignes pour former le global, ce n'est pas la clé publique puis la clé privé
👉 Le serveur distant vérifie la signature via le DNS
👉 Si le contenu est modifié → la signature devient invalide
2.6. DMARC : la politique de confiance
Le DMARC combine SPF et DKIM et indique quoi faire en cas d’échec.
Exemple de configuration progressive :
_dmarc.mathieugrenier.fr. TXT "v=DMARC1; p=none; rua=mailto:dmarc@mathieugrenier.fr"
- p=none : mode observation (recommandé au début)
- rua : adresse pour recevoir les rapports
Une fois les tests validés :
p=quarantine p=reject
👉 DMARC est aujourd’hui indispensable pour être accepté par Gmail et consorts.
2.7. Ordre recommandé de mise en place
Pour éviter les erreurs :
- Record A / AAAA
- Reverse DNS (PTR)
- Record MX
- SPF
- DKIM
- DMARC (en mode none, puis durcissement)
3. Problématiques principales rencontrées
*** Problème 1 : "Connection to Storage Server Failed" (IMAP) ***
Cause : Roundcube ne pouvait pas se connecter au serveur IMAP car le
certificat SSL était auto-signé et les variables d'environnement
ROUNDCUBEMAIL_IMAP_SSL_VERIFY_PEER n'étaient pas appliquées correctement.
Solution : Créer un fichier de configuration personnalisé
./roundcube/data/config/custom.inc.php :
<?php
$config['imap_conn_options'] = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
),
);
---
*** Problème 2 : "SMTP Error: Authentication failure" ***
Cause : Deux problèmes combinés :
1. La variable ROUNDCUBEMAIL_SMTP_SERVER: mailserver n'incluait pas le préfixe
tls://, empêchant la négociation STARTTLS. Sans STARTTLS, le serveur SMTP
n'expose pas les mécanismes d'authentification (AUTH PLAIN LOGIN).
2. Les variables d'environnement ROUNDCUBEMAIL_SMTP_USER et
ROUNDCUBEMAIL_SMTP_PASS n'étaient pas appliquées par l'image Docker Roundcube.
Solution :
1. Modifier docker-compose.yml :
ROUNDCUBEMAIL_SMTP_SERVER: tls://mailserver
2. Ajouter dans custom.inc.php :
$config['smtp_conn_options'] = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
),
);
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
Note : Dans Roundcube 1.5+, la variable est smtp_host et non smtp_server. Le
fichier docker génère déjà smtp_host, donc inutile de le redéfinir.
---
*** Problème 3 : "554 Client host rejected: Access denied" ***
Cause : Même après STARTTLS, l'authentification SMTP ne se faisait pas
(connexion "Anonymous TLS"). Le serveur rejetait donc le relay vers des
domaines externes.
Solution : C'était lié au problème 2 - les identifiants SMTP n'étaient pas
transmis. Une fois smtp_user et smtp_pass configurés dans custom.inc.php,
l'authentification fonctionnait et le relay était autorisé.
---
Configuration finale
docker-compose.yml (extrait Roundcube) :
roundcube:
image: roundcube/roundcubemail:latest
environment:
ROUNDCUBEMAIL_DEFAULT_HOST: ssl://mailserver
ROUNDCUBEMAIL_DEFAULT_PORT: 993
ROUNDCUBEMAIL_SMTP_SERVER: tls://mailserver
ROUNDCUBEMAIL_SMTP_PORT: 587
volumes:
- ./roundcube/data:/var/roundcube
./roundcube/data/config/custom.inc.php :
<?php
$config['imap_conn_options'] = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
),
);
$config['smtp_conn_options'] = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
),
);
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
---
Commandes de diagnostic utiles
# Tester la connectivité IMAP
docker exec -it roundcube openssl s_client -connect mailserver:993
# Tester SMTP avec STARTTLS
docker exec -it roundcube openssl s_client -starttls smtp -connect
mailserver:587
# Vérifier les logs Roundcube
docker compose logs roundcube | grep -i error
# Vérifier les logs Mailserver
docker compose logs mailserver | tail -20
# Lister les comptes email
docker exec -it mailserver setup email list
Bonus: DMarc comment surveiller:
Ajoutez
cet enregistrement DNS TXT :
Nom : _dmarc Type : TXT
Valeur :
v=DMARC1; p=none; rua=mailto:postmaster@mathieugrenier.fr
Commencez avec p=none pour surveiller sans bloquer. Après quelques jours,
passez à p=quarantine puis p=reject.
> Comment surveiller ?
● Les serveurs de réception (Gmail, Yahoo, etc.) enverront des rapports XML à
postmaster@mathieugrenier.fr. Ces rapports arrivent généralement une fois par
jour.
Option 1 : Lire les rapports manuellement
Les fichiers XML sont difficiles à lire. Vous pouvez utiliser des outils en
ligne gratuits pour les analyser :
- https://dmarc.postmarkapp.com/ (coller le XML)
- https://mxtoolbox.com/DmarcReportAnalyzer.aspx
Option 2 : Service de surveillance gratuit
Utilisez un service qui agrège et visualise les rapports :
- Postmark DMARC (gratuit) : https://dmarc.postmarkapp.com/
- DMARCian (gratuit limité) : https://dmarcian.com/
Modifiez votre enregistrement DMARC pour utiliser leur adresse :
v=DMARC1; p=none;
rua=mailto:votre-id@ag.dmarcian.com,mailto:postmaster@mathieugrenier.fr
Option 3 : Vérification rapide
Pour tester maintenant que tout est bien configuré :
dig TXT _dmarc.mathieugrenier.fr
Ou utilisez https://mxtoolbox.com/dmarc.aspx pour vérifier votre
configuration.
Qui suis je ?
Je suis Mathieu GRENIER, CTO d'Easystrat une startup de Montpellier, en France. Je manage une équipe d'une dizaine d'ingénieurs (Graphistes, IA, frontend, backend, devOps, AWS) en remote depuis le Japon.
J'ai aussi mon activité de freelance, où je conseille des entrepreneurs dans leurs projets d'application.
Avec mon expérience personnelle de plus de 15 ans en ESN, j'ai pu travailler pour un large panel d'entreprises de différentes tailles. Ma compréhension des problèmes métiers est une de mes grandes forces et permet à mes clients de pouvoir se projeter plus facilement.
L'essentiel de mon travail consiste à canaliser l'énergie des entrepreneurs sur l'essence même de leur projet.
La technologie, les méthodes, le management sont le cœur de mes compétences.
Vous pouvez me faire confiance sur ces points là.
Si vous voulez me parler d'un de vos projets, n'hésitez pas à m'envoyer un email avec vos disponibilités à : contact@mathieugrenier.fr
Tous les articles de ce blog sont écris par moi, même si je peux m'aider de l'IA pour illustrer mes propos. Mais jamais je ne fournis d'articles 100% IA.
Créer son propre serveur de mail pro avec Claude pour 0 euros