Dernière mise à jour : août 2026
Relais SMTP local sur le serveur cahute (192.168.1.9) : Exim4 configuré en smarthost. Toutes les applications du serveur envoient leur courrier au relais local, qui l'authentifie et le relaie vers Infomaniak. Objectif : centraliser les identifiants SMTP à un seul endroit au lieu de les configurer (et les changer) dans chaque application.
127.0.0.1:25) et relaie tout vers mail.infomaniak.com:587 (STARTTLS + authentification)./etc/exim4/passwd.client.Application (Gitea, Nextcloud…) ──> Exim4 local (127.0.0.1:25) ──[TLS+AUTH]──> mail.infomaniak.com:587
Paquet : exim4-daemon-light (MTA par défaut de Debian, déjà présent). Pas besoin de Postfix.
Configurés via dpkg-reconfigure exim4-config :
127.0.0.1 ; ::1mail.infomaniak.com::587 (double deux-points = syntaxe port Exim)dc_use_split_config=true)
Le mode découpé (split=true) est nécessaire : il permet à Exim de lire les authenticators dans /etc/exim4/conf.d/auth/. En mode non-découpé, les ajouts personnalisés y sont ignorés.
Fichier : /etc/exim4/passwd.client — permissions 640 root:Debian-exim
Format : serveur:login:motdepasse
mail.infomaniak.com:beafrancois@beafrancois.fr:LE_MOT_DE_PASSE
Caractères spéciaux dans le mot de passe : les authenticators Debian par défaut (plain / login de 30_exim4-config_examples) gèrent les “:” présents dans le mot de passe via une extraction regex (le login est isolé sur le premier “:”, tout le reste = mot de passe). Donc :
“:” → OK, à coller tel quel, sans guillemets, sans échappement.“:” (une adresse email n'en a pas).sudo update-exim4.conf # recompile la config sudo systemctl restart exim4 sudo systemctl is-active exim4 # doit renvoyer "active"
Une seule opération, aucune application à toucher :
/etc/exim4/passwd.client, remplacer le mot de passe sur la ligne mail.infomaniak.com.sudo update-exim4.conf && sudo systemctl restart exim4echo "Test relais - $(date)" | sudo exim4 -v -i -f beafrancois@beafrancois.fr beafrancois@beafrancois.fr
Séquence attendue dans la sortie -v :
AUTH PLAIN envoyé, réponse 235 (auth acceptée)MAIL FROM / RCPT TO / DATA → 250250 Ok: queued as … (message accepté par Infomaniak)A=plain CV=yes (authentification + certificat TLS OK)
Le -f définit l'expéditeur d'enveloppe : sans lui, l'envoi part avec MAIL FROM:<> (vide) et peut être refusé.
Principe commun : pointer vers le relais local, sans auth, sans TLS.
Section [mailer] de /etc/gitea/app.ini — mode sendmail (le plus simple, appelle Exim directement) :
[mailer] ENABLED = true PROTOCOL = sendmail FROM = beafrancois@beafrancois.fr SENDMAIL_PATH = /usr/sbin/sendmail
Supprimer les anciennes lignes : SMTP_ADDR, SMTP_PORT, SMTP_STARTTLS, USER, PASSWD.
Recharger : sudo systemctl restart gitea. Tester via Administration → Configuration → Mailer → Send Testing Email.
Administration → Paramètres de base → Serveur de messagerie :
127.0.0.1 — Port : 25Plugin SMTP (« Autre SMTP » / WP Mail SMTP) :
localhost — Port : 25
Depuis un conteneur, 127.0.0.1 désigne le conteneur lui-même, pas l'hôte. Un conteneur joint donc Exim via l'IP de la passerelle de son réseau Docker (172.x.0.1). Deux conditions côté Exim, toutes deux configurées :
Dans /etc/exim4/update-exim4.conf.conf (les directives dc_* ont priorité sur les macros — c'est ici qu'il faut modifier, pas dans localmacros) :
dc_local_interfaces='127.0.0.1 ; ::1 ; 172.17.0.1 ; 172.18.0.1 ; 172.19.0.1 ; 172.20.0.1' dc_relay_nets='172.16.0.0/12'
dc_local_interfaces : localhost + passerelles des 4 réseaux Docker.dc_relay_nets : 172.16.0.0/12 couvre toute la plage privée Docker (172.16 → 172.31), donc pas besoin de la modifier à chaque nouveau réseau.
Appliquer : sudo update-exim4.conf && sudo systemctl restart exim4.
Vérifier l'écoute : sudo ss -tlnp | grep ':25 ' → doit lister les 172.x.0.1:25.
La politique INPUT est en DROP : sans règle explicite, le trafic des conteneurs vers le port 25 de l'hôte est jeté avant d'atteindre Exim (Exim écoute mais ne reçoit rien). Ouvrir le port 25 depuis la plage Docker :
sudo ufw allow from 172.16.0.0/12 to any port 25 proto tcp comment 'SMTP relais depuis conteneurs Docker'
(même plage que dc_relay_nets : les deux couches, pare-feu et relais Exim, sont alignées.)
Par défaut Exim annonce STARTTLS à tous. Un client conteneur (ex. Diun) tente alors un handshake TLS opportuniste, qui échoue sur le certificat auto-signé d'Exim (gnutls_handshake: Certificate is bad). On empêche l'annonce STARTTLS pour tout sauf le localhost strict — le trafic hôte↔conteneur passe alors en clair (local, non routable), et le chiffrement reste actif en sortie vers Infomaniak.
⚠️ Ne pas utiliser exim4.conf.localmacros : dans ce montage, les macros MAIN_* qu'on y place ne sont pas injectées dans la config compilée (testé : sans effet). Le fichier a été supprimé pour éviter toute confusion. Toute la config de ce relais passe par les directives dc_* (dans update-exim4.conf.conf) et par des fichiers conf.d/main/. Pour STARTTLS, la méthode fiable est un fichier direct dans conf.d/main/ :
sudo tee /etc/exim4/conf.d/main/00_local_no_starttls > /dev/null << 'EOF' # STARTTLS annoncé uniquement en local strict ; pas aux conteneurs Docker. tls_advertise_hosts = 127.0.0.1 : ::1 EOF sudo update-exim4.conf && sudo systemctl restart exim4
Vérifier que STARTTLS n'est plus annoncé aux conteneurs :
docker run --rm --network diun_net alpine sh -c \ "printf 'EHLO test\r\nQUIT\r\n' | nc -w 5 172.20.0.1 25" | grep -i starttls
→ ne doit rien renvoyer (STARTTLS absent).
| Réseau | Passerelle (IP hôte) | Sous-réseau |
|---|---|---|
| bridge (défaut) | 172.17.0.1 | 172.17.0.0/16 |
| surveillance_net | 172.18.0.1 | 172.18.0.0/16 |
| lldap_net | 172.19.0.1 | 172.19.0.0/16 |
| diun_net | 172.20.0.1 | 172.20.0.0/16 |
Retrouver la passerelle d'un réseau : docker network inspect <net> –format 'range_.ipam.configgatewayend'
Serveur SMTP = IP de la passerelle de son réseau (ex. Diun sur diun_net → 172.20.0.1), port 25, sans auth, sans TLS.
Exemple pour Diun (diun.yml) :
notif: mail: host: 172.20.0.1 port: 25 ssl: false from: "beafrancois@beafrancois.fr" to: "beafrancois@beafrancois.fr"
(les champs username / password deviennent inutiles)
Tester l'envoi mail de Diun : passer temporairement firstCheckNotif: true, vider la base (rm /mnt/stockage/docker/data/diun/diun.db) et recréer le conteneur → Diun notifie chaque image détectée. Remettre firstCheckNotif: false après le test, sinon Diun re-notifie tout à chaque redémarrage.
docker run --rm --network diun_net alpine sh -c \ "apk add --no-cache netcat-openbsd >/dev/null 2>&1; \ printf 'EHLO test\r\nQUIT\r\n' | nc -w 5 172.20.0.1 25"
Exim doit répondre 220 … ESMTP Exim suivi des capacités 250-….
⚠️ Sécurité : ouvrir le relais à 172.16.0.0/12 autorise tout conteneur à envoyer via Infomaniak. Acceptable tant que les passerelles Docker ne sont pas routables depuis le LAN (elles ne le sont pas par défaut). Un conteneur compromis pourrait néanmoins émettre du courrier.
Infomaniak peut refuser d'expédier un message dont le From n'est pas une adresse autorisée sur le compte. La valeur validée est beafrancois@beafrancois.fr (l'adresse authentifiée). Pour utiliser un From différent par service (ex. git@beafrancois.fr), il faut que ce soit un alias autorisé côté Infomaniak, sinon l'envoi est rejeté.
| Fichier | Rôle |
|---|---|
| /etc/exim4/update-exim4.conf.conf | Réglages principaux : dc_use_split_config=true, dc_local_interfaces (écoute), dc_relay_nets (relais Docker) |
| /etc/exim4/passwd.client | Identifiants Infomaniak (fichier unique, 640 root:Debian-exim) |
| /etc/exim4/conf.d/auth/30_exim4-config_examples | Authenticators Debian (plain / login) utilisés |
| /var/lib/exim4/config.autogenerated | Config compilée (ne pas éditer à la main) |
| /etc/exim4/conf.d/main/00_local_no_starttls | Désactive l'annonce STARTTLS hors localhost (config découpée) |
Règle UFW 25/tcp ALLOW 172.16.0.0/12 | Autorise les conteneurs à joindre le relais |
Important : les directives dc_* de update-exim4.conf.conf ont priorité sur les macros MAIN_* de localmacros (mécanisme .ifndef). Pour l'écoute et le relais, modifier les dc_*, pas les macros.
530 Authentication required : Exim n'a pas envoyé d'AUTH. Vérifier que dc_use_split_config=true et que la ligne existe dans passwd.client. Recompiler.dc_local_interfaces priment. Modifier update-exim4.conf.conf, pas localmacros.relay not permitted depuis un conteneur : le sous-réseau du conteneur n'est pas dans dc_relay_nets. Vérifier que 172.16.0.0/12 y figure.127.0.0.1 (= lui-même) au lieu de la passerelle. Utiliser l'IP 172.x.0.1 de son réseau.nc) : politique INPUT DROP d'UFW. Ouvrir le port 25 depuis 172.16.0.0/12 (voir section pare-feu).gnutls_handshake: Certificate is bad depuis un conteneur : le client tente STARTTLS et refuse le certificat auto-signé d'Exim. Désactiver l'annonce STARTTLS via conf.d/main/00_local_no_starttls (voir section dédiée).exim4.conf.localmacros (macros non injectées dans ce montage — fichier supprimé). Utiliser un fichier conf.d/main/ (config découpée) ou la directive dc_* correspondante.Frozen) : voir la file avec sudo mailq, détails avec sudo exim4 -Mvl <id>. Relancer un message après correction : sudo exim4 -M <id>.sudo mailq — vider un message : sudo exim4 -Mrm <id>.sudo tail -f /var/log/exim4/mainlog.