From 5846a08667bfbc712078f3520a9ca08dde56636d Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Thu, 2 Jul 2026 17:47:12 -0400 Subject: [PATCH] =?UTF-8?q?serveur=5Fdovecot=20:=20remise=20LMTP=20fonctio?= =?UTF-8?q?nnelle=20=E2=80=94=20flux=20courriel=20interne=20prouv=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Réglages Dovecot 2.4 qui débloquent la remise LMTP (durement gagnés au premier flux réel) : - userdb static { static_allow_all_users = yes } : sinon le userdb exige un passdb et renvoie NOTFOUND (expéditeur/raw-mail-user externe absent de l'annuaire) → rejet 550. - mail_inbox_path vidé : le défaut 2.4 (/var/mail/%{user}, mbox root) refusait l'autocréation de l'INBOX (Permission denied). - Maildir explicite : mail_home + mail_path = %{home}/Maildir. - Chemin par nom d'utilisateur : home identique côté LMTP (local-part) et IMAP (adresse complète). Mono-domaine ; multi-domaine = raffinement. Prouvé de bout en bout : envoi → Postfix (validation LDAP) → LMTP → Dovecot → boîte → LU EN IMAP (auth LDAP, TLS step_ca). status=sent. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 8 ++++++++ roles/serveur_dovecot/defaults/main.yml | 6 ++++-- roles/serveur_dovecot/templates/99-setops.conf.j2 | 10 +++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9656a20..34f9ec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,14 @@ mis à jour. Réévaluer Stalwart ~2028. ### Ajouté +- **Flux courriel interne PROUVÉ de bout en bout (Étape A).** Envoi → Postfix (`edge-mta`, + validation LDAP) → LMTP réseau → Dovecot (mail-store) → boîte Maildir → **lu en IMAP** + (auth LDAP, TLS step_ca) : `status=sent`, message lu (sujet + corps). Réglages Dovecot 2.4 + qui débloquent la remise LMTP : `userdb static { static_allow_all_users = yes }` (sinon + NOTFOUND pour l'expéditeur/raw-mail-user externe), `mail_inbox_path =` vidé (le défaut mbox + `/var/mail` root refusait l'autocréation de l'INBOX), Maildir explicite (`mail_home` + + `mail_path = %{home}/Maildir`), chemin par nom d'utilisateur (home identique côté LMTP + local-part et IMAP adresse complète ; mono-domaine, multi-domaine = raffinement Étape B). - **Rôle `serveur_postfix` (Postfix 3.x) — MTA du nœud edge-mta.** Réception `:25`, cartes **LDAP** (validation des boîtes via l'attribut `mail`), remise **LMTP réseau** vers le nœud mail-store Dovecot (`virtual_transport = lmtp:inet:[…]:24`), TLS via **step_ca** (pont de diff --git a/roles/serveur_dovecot/defaults/main.yml b/roles/serveur_dovecot/defaults/main.yml index bd8db77..ea9e346 100644 --- a/roles/serveur_dovecot/defaults/main.yml +++ b/roles/serveur_dovecot/defaults/main.yml @@ -15,8 +15,10 @@ serveur_dovecot_vmail_utilisateur: "vmail" serveur_dovecot_vmail_uid: 5000 serveur_dovecot_vmail_gid: 5000 serveur_dovecot_vmail_base: "/var/vmail" -# Maildir par domaine/utilisateur (variables 2.4). -serveur_dovecot_mail_path: "{{ serveur_dovecot_vmail_base }}/%{user | domain}/%{user | username}" +# Maildir par utilisateur. Nom d'utilisateur seul → chemin IDENTIQUE pour la remise LMTP +# (destinataire local-part) et l'accès IMAP (adresse complète). Mono-domaine ; pour du +# multi-domaine il faudra préserver le domaine des deux côtés (raffinement Étape B). +serveur_dovecot_mail_path: "{{ serveur_dovecot_vmail_base }}/%{user | username}" # --- Annuaire/auth LDAP (vers serveur_openldap) --- serveur_dovecot_ldap_uris: "ldaps://id-ldap-01.{{ domaine_interne }}:636" diff --git a/roles/serveur_dovecot/templates/99-setops.conf.j2 b/roles/serveur_dovecot/templates/99-setops.conf.j2 index 95518fe..4304f61 100644 --- a/roles/serveur_dovecot/templates/99-setops.conf.j2 +++ b/roles/serveur_dovecot/templates/99-setops.conf.j2 @@ -8,9 +8,14 @@ protocols { # --- Stockage Maildir (boîtes virtuelles) --- mail_driver = maildir -mail_path = {{ serveur_dovecot_mail_path }} +mail_home = {{ serveur_dovecot_mail_path }} +mail_path = %{home}/Maildir +# L'INBOX vit dans le Maildir (pas le /var/mail mbox par défaut de 2.4, root → refusé). +mail_inbox_path = first_valid_uid = {{ serveur_dovecot_vmail_uid }} first_valid_gid = {{ serveur_dovecot_vmail_gid }} +# Garder l'adresse complète (user@domaine) comme identité — domaines virtuels. +auth_username_format = %{user} # --- TLS (certificat step_ca, via le pont) --- ssl = required @@ -30,6 +35,9 @@ passdb ldap { ldap_bind = yes } userdb static { + # Répond pour TOUT utilisateur sans exiger un passdb (requis pour la remise LMTP, + # y compris le contexte expéditeur/raw-mail-user qui n'est pas dans l'annuaire). + static_allow_all_users = yes fields { uid = {{ serveur_dovecot_vmail_utilisateur }} gid = {{ serveur_dovecot_vmail_utilisateur }}