85.1.14. pepsi-stage-relay-to-lmtp

deliver a message to a local MDA (Dovecot) over LMTP

Handbuchabschnitt:

1

85.1.14.1.1. Name

pepsi-stage-relay-to-lmtp - die LMTP-Stage der Pepsi-Pipeline für die lokale Zustellung.

85.1.14.1.2. Übersicht

pepsi-stage-relay-to-lmtp [GLOBAL-OPTIONS] worker

85.1.14.1.3. Beschreibung

pepsi-stage-relay-to-lmtp ist ein Stage-Programm, das von pepsi-dispatch(1) ausgeführt wird. Es lädt den pepsi.workqueue-Datensatz (und weigert sich zu handeln, sofern sein status nicht running ist), liest seinen [stage-<stage>]-Abschnitt und übergibt die Nachricht an einen Mail Delivery Agent — typischerweise Dovecot — über LMTP (RFC 2033) zur endgültigen lokalen Zustellung. Der MDA wendet beim Ablegen der Mail das Sieve-Skript (RFC 5228) jedes Empfängers an, sodass serverseitige Filterung (fileinto, vacation, redirect, Flag-Setzung, …) vom MDA statt von Pepsi bereitgestellt wird.

Die Stage ist LMTP-nativ: Jeder Umschlagempfänger wird in einer einzigen LMTP-Transaktion angeboten und der MDA gibt nach dem Ende von DATA eine separate Antwort pro Empfänger zurück. Die Stage selbst baut nie eine Zustellungsstatusbenachrichtigung — sie stellt zu und routet andernfalls jeden Empfänger weiter zu einer konfigurierten Stage und hält unter state.bounce fest, warum, sodass ein nachgelagertes pepsi-stage-bounce(1) (oder ein Relay) darauf reagieren kann. Das Schicksal jedes Empfängers folgt seiner Antwort:

  • 2xx — zugestellt; der Empfänger verlässt den Datensatz. Wenn der Empfänger NOTIFY=SUCCESS angefordert hat und [pepsi] ORIGINATE_SUCCESS_DSN gesetzt ist, wird eine positive Benachrichtigung zum optionalen NOTIFY_STAGE geroutet.

  • eine permanente Ablehnung wird nach Grund geroutet, klassifiziert anhand des erweiterten RFC-3463-Status der Antwort: ein ungültiges Zielpostfach (x.1.x, oder x.2.x außer x.2.2, oder ein bloßes 550 für einen unbekannten Benutzer ohne erweiterten Status) geht an UNKNOWN_MAILBOX_STAGE, wenn der Empfänger an einer der LOCAL_DOMAINS liegt, sonst an NEXT_STAGE; eine Ablehnung wegen Quotenüberschreitung (x.2.2) an QUOTA_LIMIT_STAGE (sonst NEXT_STAGE); eine Ablehnung durch Sieve / lokale Richtlinie (x.7.x) an SIEVE_REJECT_STAGE (sonst NEXT_STAGE); alles andere an NEXT_STAGE.

  • 4xx (z. B. Server ausgelastet) — ein vorübergehender Fehler: Der Empfänger wird mit exponentiellem Backoff bis MAX_LIFETIME wiederholt, dann nach derselben Grundklassifizierung geroutet.

Eine Nachricht kann daher teilweise behandelt werden: zugestellte, geroutete und aufgeschobene Empfänger werden in einer Auffächerung abgeglichen — die zugestellten Empfänger verlassen den Datensatz, jeder geroutete Empfänger wird ein Geschwister-pending-Datensatz (auf diesen einen Empfänger zugeschnitten, sodass ein Relay-Ziel nie an seine Geschwister erneut zustellt) an seiner Ziel-Stage, und der ursprüngliche Datensatz wird auf nur die noch aufgeschobenen Empfänger für den nächsten Versuch reduziert. Eine DELAY-Warnung (wenn fällig und NOTIFY=DELAY angefordert wurde) wird ebenfalls zum NOTIFY_STAGE geroutet. Die Auffächerung und das eigene Ende des Datensatzes (gelöscht oder für die Wiederholung pausiert) sind eine Anweisung: Der MDA hat die zugestellten Empfänger bereits abgelegt, und eine ohne ihr Ende festgeschriebene Aufteilung ließe sie auf einem Datensatz zurück, an den die Wiederholung erneut zustellen würde. Schlägt diese Anweisung fehl (die Datenbank ist nicht erreichbar), wird der Fehler wiederholt, und die Empfänger, die der MDA angenommen hat, erhalten die Nachricht ein zweites Mal — die Zustellung erfolgt mindestens einmal.

Ein Fehler der gesamten Sitzung — beim Verbinden, bei der Begrüßung, bei STARTTLS, bei der Authentifizierung oder bei der Datenübertragung, vor jeder Antwort je Empfänger — ist nicht empfängerspezifisch: Ein vorübergehender wiederholt die ganze Nachricht mit Backoff, und ein dauerhafter (oder jeder, sobald MAX_LIFETIME verstrichen ist) leitet jeden Empfänger ohne Klassifizierung des Grundes zu NEXT_STAGE.

Da der MDA entscheidet, welche Adressen lokal sind, führt diese Stage keinen eigenen Lokalitätstest durch (anders als pepsi-stage-relay-to-maildir(1)): Jeder Empfänger wird dem MDA angeboten. LOCAL_DOMAINS entscheidet nur, wohin ein unbekanntes Postfach anschließend geht. An einer unserer eigenen Domains darf es keine Relay-Stage erreichen — das Relay würde unseren eigenen MX nachschlagen und die Nachricht direkt an diesen Host zurückschicken —, daher geht es an UNKNOWN_MAILBOX_STAGE; an jeder anderen Domain (ein Alias-Ziel, das nach außerhalb expandiert wurde) geht es weiter an NEXT_STAGE. Platzieren Sie sie dort, wo nur beabsichtigt lokale Empfänger ankommen — üblicherweise nach der Alias-Expansion (pepsi-stage-aliases(1)). Sie ist nicht terminal: NEXT_STAGE ist zwingend — setzen Sie sie auf eine pepsi-stage-bounce(1), um nicht zustellbare Empfänger zu bouncen, oder auf eine Relay-Stage, um sie nach außerhalb weiterzuleiten. Eine Nachricht, die die Stage ohne konfigurierte NEXT_STAGE erreicht, wird als failed markiert, bevor der MDA kontaktiert wird, sodass nichts zugestellt wird.

Anders als das lokale Maildir-Schreiben benötigt LMTP keinen privilegierten Helper: Der MDA führt die benutzerweise Zustellung selbst durch, sodass diese Stage als unprivilegierter pepsi-Benutzer läuft und kein setuid/setgid-Bit trägt. Sie ist in das vereinheitlichte pepsi-Binärprogramm eingefaltet.

85.1.14.1.4. Optionen

Ausführungsmodus:

worker

Läuft als persistenter pepsi-dispatch(1)-Worker, der workqueue-Datensatz-IDs von der Standardeingabe liest.

Konfiguration (im eigenen [stage-<name>]-Abschnitt der Stage):

PROGRAM

Muss pepsi-stage-relay-to-lmtp sein.

NEXT_STAGE

Erforderlich. Wohin ein Empfänger, den der MDA nicht zustellen konnte, geroutet wird (ein schlechtes Zielpostfach und der Rückfall für die untenstehenden Gründe). Setzen Sie es auf ein pepsi-stage-bounce(1), um unzustellbare Empfänger zu bouncen, oder auf eine Relay-Stage (z. B. pepsi-stage-srs(1) → ein Smarthost), um sie nach außerhalb weiterzuleiten. pepsi-setup lehnt eine Konfiguration ohne es ab.

QUOTA_LIMIT_STAGE

Wohin ein Empfänger geroutet wird, den der MDA wegen Über-Quota abgelehnt hat (RFC 3463 x.2.2). Standardwert ist NEXT_STAGE. Setzen Sie es auf eine Bounce-Stage, wenn NEXT_STAGE ein Relay ist, damit Quota-Ablehnungen bouncen statt nach außerhalb weiterzuleiten.

SIEVE_REJECT_STAGE

Wohin ein von Sieve / lokaler Richtlinie abgelehnter Empfänger geroutet wird (RFC 3463 x.7.x). Standardwert ist NEXT_STAGE.

UNKNOWN_MAILBOX_STAGE

Wohin ein Empfänger an einer der LOCAL_DOMAINS geroutet wird, den der MDA als unbekanntes Postfach abgelehnt hat (x.1.x, ein bloßes 550). Standardwert ist NEXT_STAGE. Setzen Sie sie auf eine Bounce-Stage, wann immer NEXT_STAGE ein Relay erreichen kann: Eine unbekannte Adresse an unserer eigenen Domain weiterzuleiten stellt sie an diesen Host zurück zu. pepsi-setup --wizard setzt sie auf bounce.

LOCAL_DOMAINS

Die Domains, deren Postfächer der MDA hält (durch Leerzeichen oder Kommas getrennt). Standardwert ist [pepsi-ingress] ACCEPTED_DOMAINS. Gelesen für UNKNOWN_MAILBOX_STAGE und von der Empfängerprüfung von pepsi-ingress(1), die den MDA fragt, ob eine Adresse an diesen Domains existiert, bevor sie angenommen wird (siehe VERIFY_RECIPIENTS).

NOTIFY_STAGE

Wohin positive SUCCESS-Zustellbenachrichtigungen und DELAY-Warnungen geroutet werden (als geklonte Nachricht, die state.bounce.kind trägt); setzen Sie es auf ein pepsi-stage-bounce(1), das den Bericht rendert. Wenn nicht gesetzt, werden keine positiven oder Delay-Benachrichtigungen erzeugt. Die Stage baut nie selbst eine Benachrichtigung.

SOCKET

Pfad des LMTP-UNIX-Domain-Sockets des MDA (z. B. /run/dovecot/lmtp). Das übliche Layout für lokale Zustellung; kein TLS und keine Authentifizierung. Genau eines von SOCKET und HOST muss gesetzt sein.

HOST / PORT

Erreicht den MDA stattdessen über TCP (PORT ist standardmäßig 24). Verwenden Sie dies für einen MDA auf einem anderen Host.

TLS

Transportsicherheit für ein HOST-Ziel: off (Standardwert), starttls oder tls (implizit). TLS_VERIFY (Standardwert ja) und TLS_CA steuern die PKIX-Verifikation; TLS_CLIENT_CERT/TLS_CLIENT_KEY legen ein Client-Zertifikat für Mutual TLS / SASL EXTERNAL vor.

AUTH

SASL-Mechanismus für ein TCP-Ziel: none (Standardwert), plain, login oder external. Authentifizierung wird über Klartext abgelehnt, sodass jedes Nicht-none-AUTH TLS = starttls oder tls erfordert (und external ein Client-Zertifikat erfordert). USERNAME/PASSWORD liefern das Credential.

SERVER_NAME

Der in LHLO angekündigte und im Received:-Header gestempelte Name. Standardwert ist [pepsi-ingress] HOSTNAME.

MAX_LIFETIME, RETRY_INITIAL, RETRY_MAX_INTERVAL, RETRY_FACTOR

Zeitsteuerung für Wiederholung und Aufgeben bei vorübergehend aufgeschobenen Empfängern.

DELAY_DSN_AFTER

Gibt eine einmalige „verzögerte“ DSN aus, sobald eine noch nicht zugestellte Nachricht so lange eingereiht war und der Absender NOTIFY=DELAY angefordert hat.

CONNECT_TIMEOUT, COMMAND_TIMEOUT, DATA_TIMEOUT

LMTP-Timeouts pro Operation.

85.1.14.1.5. Siehe auch

pepsi-dispatch(1), pepsi-stage-relay-to-maildir(1), pepsi-stage-aliases(1), pepsi-stage-bounce(1), pepsi.conf(5), pepsi.state(7).

RFC 2033 (LMTP), RFC 5228 (Sieve).