serveur_dovecot : remise LMTP fonctionnelle — flux courriel interne prouvé

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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-02 17:47:12 -04:00
parent e17ae54fda
commit 5846a08667
3 changed files with 21 additions and 3 deletions

View file

@ -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

View file

@ -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"

View file

@ -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 }}