42. pepsi-stage-relay-to-lmtp¶
Remettre localement via LMTP à un MDA (Dovecot) qui exécute Sieve.
42.1. Rôle¶
pepsi-stage-relay-to-lmtp est une étape de remise locale qui remet chaque message à un Mail Delivery Agent — généralement Dovecot — via LMTP (RFC 2033). Le MDA classe le message et, ce faisant, exécute le script Sieve (RFC 5228) du destinataire, de sorte que le filtrage côté serveur est délégué au MDA au lieu d’être implémenté dans Pepsi. C’est une alternative à pepsi-stage-relay-to-maildir : LMTP gagne Sieve et un statut de remise net par destinataire, et n’a besoin d”aucun helper setuid (le MDA effectue la remise par utilisateur), au prix de l’exécution d’un serveur IMAP/LMTP local.
42.2. Remise native LMTP, remettre-et-acheminer¶
Tous les destinataires d’enveloppe sont proposés en une seule transaction LMTP ; le MDA renvoie une réponse par destinataire après la fin du DATA (RFC 2033 §4.2). L’étape ne construit jamais elle-même de notification d’état de remise — elle remet, et sinon achemine chaque destinataire plus loin selon la raison, notant pourquoi sous state.bounce pour qu’une pepsi-stage-bounce en aval (ou un relais) agisse dessus :
2xx— remis ; une notificationNOTIFY=SUCCESS(et les avertissementsDELAY) est acheminée vers leNOTIFY_STAGEfacultatif ;un rejet permanent est acheminé selon son code d’état étendu RFC 3463 — une mauvaise boîte aux lettres (
x.1.x,x.2.xautre quex.2.2, ainsi qu’un550nu sans aucun code d’état étendu) versNEXT_STAGE, un dépassement de quota (x.2.2) versQUOTA_LIMIT_STAGE(sinonNEXT_STAGE), un rejet Sieve / de politique (x.7.x) versSIEVE_REJECT_STAGE(sinonNEXT_STAGE), tout le reste versNEXT_STAGE;4xx— transitoire : réessayer ce destinataire (backoff exponentiel) jusqu’àMAX_LIFETIME, puis acheminer selon la même classification.
Les destinataires remis, acheminés et encore différés sont réconciliés en un seul fan-out : les destinataires remis quittent la ligne, chaque destinataire acheminé devient une ligne sœur pending réduite à lui-même (de sorte qu’une cible de relais ne remet jamais de nouveau aux autres) à son étape cible, et la ligne est réduite aux destinataires différés pour le prochain réessai. Un échec de la session entière (connexion, STARTTLS, authentification, transfert des données) réessaie le message entier, ou — lorsqu’il est permanent ou au-delà de MAX_LIFETIME — achemine chaque destinataire vers NEXT_STAGE.
Comme le MDA fait autorité sur les adresses qui sont locales, l’étape ne fait aucune vérification de localité propre — placez-la après l’expansion d’alias afin que seuls les destinataires censés être locaux l’atteignent. NEXT_STAGE est obligatoire (réglez-le sur une pepsi-stage-bounce pour produire un rebond, ou sur une étape de relais pour rediriger vers l’extérieur) ; un message atteignant l’étape sans en avoir un est marqué failed avant que le MDA soit contacté, de sorte que rien n’est remis.
42.3. Transport¶
La cible est soit une socket de domaine UNIX (SOCKET, la disposition Dovecot courante : pas de TLS, pas d’identifiants), soit TCP (HOST/PORT, PORT par défaut 24) avec TLS = off|starttls|tls et AUTH = none|plain|login|external facultatifs. L’authentification est refusée en clair, de sorte que tout AUTH autre que none exige TLS. Le client LMTP partagé réutilise la machinerie de transport, TLS et SASL du client SMTP (pepsi_common::smtp::deliver_lmtp).
42.4. Configuration¶
[stage-<name>] : PROGRAM = pepsi-stage-relay-to-lmtp, NEXT_STAGE (obligatoire), les cibles de motif facultatives QUOTA_LIMIT_STAGE / SIEVE_REJECT_STAGE / NOTIFY_STAGE, la cible (SOCKET, ou HOST/PORT avec TLS, TLS_VERIFY, TLS_CA, TLS_CLIENT_CERT, TLS_CLIENT_KEY, AUTH et ses USERNAME/PASSWORD), SERVER_NAME (le nom du LHLO ; par défaut [pepsi-ingress] HOSTNAME), les délais d’attente (CONNECT_TIMEOUT/COMMAND_TIMEOUT/DATA_TIMEOUT) et la politique de réessai (RETRY_INITIAL/RETRY_MAX_INTERVAL/RETRY_FACTOR/MAX_LIFETIME/ DELAY_DSN_AFTER). pepsi-setup exige NEXT_STAGE et vérifie que chacune des trois cibles de motif nomme une étape réelle. Cette étape n’a aucun BOUNCE_STAGE : elle ne construit jamais de DSN elle-même.
42.5. État¶
Entrées :
state.dsn(NOTIFY/ORCPTpar destinataire) et la comptabilité de réessai qu’elle a écrite lors d’une passe antérieure.Sorties :
state.bouncesur chaque ligne sœur acheminée (consignant pourquoi le MDA a refusé, ou que la remise a réussi pour une notificationSUCCESS/DELAY), etattempts/last_error(plusdelay_sentune fois qu’un avertissement de délai a été acheminé) sur la ligne différée.state.dsn.rcptest découpé en phase avec les destinataires de chaque ligne.
42.6. Voir aussi¶
pepsi-stage-relay-to-maildir, pepsi-stage-aliases, pepsi-stage-bounce, pepsi-quota, Fonctionnalités prises en charge, pepsi-stage-relay-to-lmtp(1), pepsi.conf(5).