03-comment-je-travaille/guides/email-dkim.md

Email transactionnel & DKIM multi-NDD

Configuration opérationnelle de la stack email Telaria en production. SPF + DKIM + DMARC implémentés et validés.


Architecture

Application Symfony
    │  (Mailer DSN : smtp://localhost)
    â–Ľ
Postfix (satellite / relais)
    │  (relay → OVH SMTP)
    â–Ľ
OpenDKIM (signature DKIM avant envoi)
    │
    â–Ľ
OVH SMTP (relais sortant)
    │
    â–Ľ
Destinataire

Postfix est configuré en mode satellite : il ne reçoit pas d'emails entrants, il relaie uniquement les emails sortants de l'application vers OVH.


Postfix — configuration satellite

Fichier : /etc/postfix/main.cf (extraits clés)

# Mode satellite — relais OVH uniquement
relayhost = [ssl0.ovh.net]:465
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_wrappermode = yes

# Milter OpenDKIM (signature avant envoi)
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/var/spool/postfix/opendkim/opendkim.sock
non_smtpd_milters = unix:/var/spool/postfix/opendkim/opendkim.sock

Credentials OVH : /etc/postfix/sasl_passwd

[ssl0.ovh.net]:465  login@telaria.dev:mot_de_passe
sudo postmap /etc/postfix/sasl_passwd   # recompiler après modif
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

OpenDKIM — multi-NDD

OpenDKIM signe tous les emails sortants avec la clé privée du domaine expéditeur. La config multi-NDD permet de signer depuis plusieurs domaines avec des clés distinctes.

Fichiers de config

/etc/opendkim.conf (extraits)

Mode                    sv
Socket                  local:/var/spool/postfix/opendkim/opendkim.sock
UserID                  opendkim
UMask                   007
Syslog                  yes
SyslogSuccess           yes
LogWhy                  yes

# Multi-NDD
KeyTable                /etc/opendkim/key.table
SigningTable            refile:/etc/opendkim/signing.table
ExternalIgnoreList      refile:/etc/opendkim/trusted.hosts
InternalHosts           refile:/etc/opendkim/trusted.hosts

/etc/opendkim/signing.table — qui signe quoi

*@telaria.dev       telaria._domainkey.telaria.dev
*@adoption.fr       adoption._domainkey.adoption.fr

/etc/opendkim/key.table — quel sélecteur/clé par domaine

telaria._domainkey.telaria.dev    telaria.dev:telaria:/etc/opendkim/keys/telaria.dev/telaria.private
adoption._domainkey.adoption.fr   adoption.fr:adoption:/etc/opendkim/keys/adoption.fr/adoption.private

/etc/opendkim/trusted.hosts

127.0.0.1
localhost
telaria.dev
adoption.fr

Génération des clés

sudo mkdir -p /etc/opendkim/keys/telaria.dev
cd /etc/opendkim/keys/telaria.dev
sudo opendkim-genkey -s telaria -d telaria.dev
sudo chown opendkim:opendkim telaria.private
sudo chmod 600 telaria.private
# telaria.txt contient l'enregistrement DNS TXT Ă  publier
cat telaria.txt

Enregistrement DNS Ă  publier (OVH)

telaria._domainkey.telaria.dev  TXT  "v=DKIM1; h=sha256; k=rsa; p=<clé_publique>"

Vérification

# Tester la signature
echo "Test" | mail -s "test DKIM" destinataire@example.com
# Vérifier les headers reçus : chercher "DKIM-Signature" et "Authentication-Results: dkim=pass"

# Vérification DNS
dig TXT telaria._domainkey.telaria.dev

SPF

Enregistrement DNS à publier sur chaque domaine expéditeur :

telaria.dev  TXT  "v=spf1 include:mx.ovh.com ~all"

DMARC

_dmarc.telaria.dev  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc@telaria.dev; pct=100"

Piège connu — socket Postfix/OpenDKIM

Le socket OpenDKIM doit être dans le chroot Postfix pour que Postfix puisse y accéder :

# Créer le répertoire socket dans le chroot Postfix
sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
sudo chmod 750 /var/spool/postfix/opendkim

# Ajouter opendkim au groupe postfix (ou l'inverse)
sudo adduser postfix opendkim

Symptôme si mal configuré : emails envoyés sans signature DKIM (Authentication-Results: dkim=none) ou Postfix refuse de démarrer (milter: can't connect).


Symfony Mailer — configuration

Dans .env.local :

MAILER_DSN=smtp://localhost:25
# ou
MAILER_DSN=sendmail://default

Le Mailer Symfony envoie au Postfix local, qui relaie signé vers OVH.


Voir aussi

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #