42. pepsi-stage-relay-to-lmtp

Stellt lokal über LMTP an einen MDA (Dovecot) zu, der Sieve ausführt.

42.1. Rolle

pepsi-stage-relay-to-lmtp ist eine lokale Zustell-Stage, die jede Nachricht über LMTP (RFC 2033) an einen Mail Delivery Agent — typischerweise Dovecot — übergibt. Der MDA legt die Nachricht ab und führt dabei das Sieve-Skript (RFC 5228) des Empfängers aus, sodass serverseitige Filterung an den MDA delegiert wird, statt in Pepsi implementiert zu werden. Es ist eine Alternative zu pepsi-stage-relay-to-maildir: LMTP gewinnt Sieve und einen sauberen Zustellstatus je Empfänger und benötigt keinen setuid-Helper (der MDA führt die Zustellung je Benutzer durch), auf Kosten des Betriebs eines lokalen IMAP/LMTP-Servers.

42.2. LMTP-native Zustellung, Zustellen-und-Routen

Alle Umschlagempfänger werden in einer LMTP-Transaktion angeboten; der MDA gibt nach dem Ende von DATA eine Antwort pro Empfänger zurück (RFC 2033 §4.2). Die Stage baut nie selbst eine Zustellungsstatusbenachrichtigung — sie stellt zu und routet andernfalls jeden Empfänger nach Grund weiter und hält unter state.bounce fest, warum, damit ein nachgelagertes pepsi-stage-bounce (oder ein Relay) darauf reagieren kann:

  • 2xx — zugestellt; eine NOTIFY=SUCCESS-Benachrichtigung (und DELAY-Warnungen) wird zum optionalen NOTIFY_STAGE geroutet;

  • eine dauerhafte Ablehnung wird nach ihrem erweiterten RFC-3463-Status geroutet — ein schlechtes Postfach (x.1.x, x.2.x außer x.2.2, sowie ein bloßes 550 ganz ohne erweiterten Status) zu NEXT_STAGE, Quota-Überschreitung (x.2.2) zu QUOTA_LIMIT_STAGE (sonst NEXT_STAGE), eine Sieve-/Richtlinien-Ablehnung (x.7.x) zu SIEVE_REJECT_STAGE (sonst NEXT_STAGE), alles andere zu NEXT_STAGE;

  • 4xx — vorübergehend: diesen Empfänger wiederholen (exponentieller Backoff) bis MAX_LIFETIME, dann nach derselben Klassifizierung routen.

Zugestellte, geroutete und noch aufgeschobene Empfänger werden in einer Auffächerung abgeglichen: die zugestellten Empfänger verlassen den Datensatz, jeder geroutete Empfänger wird an seiner Ziel-Stage ein Geschwister-pending-Datensatz, auf sich selbst zugeschnitten (sodass ein Relay-Ziel nie erneut an die anderen zustellt), und der Datensatz wird für die nächste Wiederholung auf die aufgeschobenen Empfänger reduziert. Ein Fehlschlag der gesamten Sitzung (Verbindungsaufbau, STARTTLS, Authentifizierung, Datenübertragung) wiederholt die ganze Nachricht oder routet — wenn er dauerhaft ist oder MAX_LIFETIME überschritten wurde — jeden Empfänger zu NEXT_STAGE.

Weil der MDA die maßgebliche Instanz dafür ist, welche Adressen lokal sind, führt die Stage keine eigene Lokalitätsprüfung durch — platzieren Sie sie nach der Alias-Expansion, sodass nur die als lokal vorgesehenen Empfänger sie erreichen. NEXT_STAGE ist verpflichtend (setzen Sie es auf ein pepsi-stage-bounce, um zu bouncen, oder auf eine Relay-Stage, um nach außerhalb weiterzuleiten); eine Nachricht, die die Stage ohne eines erreicht, wird als failed markiert, bevor der MDA kontaktiert wird, sodass nichts zugestellt wird.

42.3. Transport

Das Ziel ist entweder ein UNIX-Domain-Socket (SOCKET, das übliche Dovecot-Layout: kein TLS, keine Zugangsdaten) oder TCP (HOST/PORT, PORT Standardwert 24) mit optionalem TLS = off|starttls|tls und AUTH = none|plain|login|external. Authentifizierung wird über Klartext abgelehnt, sodass jedes AUTH außer none TLS erfordert. Der gemeinsame LMTP-Client verwendet die Transport-, TLS- und SASL-Maschinerie des SMTP-Clients wieder (pepsi_common::smtp::deliver_lmtp).

42.4. Konfiguration

[stage-<name>]: PROGRAM = pepsi-stage-relay-to-lmtp, NEXT_STAGE (verpflichtend), die optionalen Grundziele QUOTA_LIMIT_STAGE / SIEVE_REJECT_STAGE / NOTIFY_STAGE, das Ziel (SOCKET, oder HOST/PORT mit TLS, TLS_VERIFY, TLS_CA, TLS_CLIENT_CERT, TLS_CLIENT_KEY, AUTH und dessen USERNAME/PASSWORD), SERVER_NAME (der LHLO-Name; Standardwert ist [pepsi-ingress] HOSTNAME), die Zeitüberschreitungen (CONNECT_TIMEOUT/COMMAND_TIMEOUT/DATA_TIMEOUT) und die Wiederholungsrichtlinie (RETRY_INITIAL/RETRY_MAX_INTERVAL/RETRY_FACTOR/MAX_LIFETIME/ DELAY_DSN_AFTER). pepsi-setup verlangt NEXT_STAGE und prüft, dass jedes der drei Grundziele eine echte Stage benennt. Diese Stage hat kein BOUNCE_STAGE: Sie baut nie selbst eine DSN.

42.5. State

  • Eingaben: state.dsn (NOTIFY/ORCPT je Empfänger) und die Wiederholungsbuchführung, die sie in einem früheren Durchlauf geschrieben hat.

  • Ausgaben: state.bounce auf jedem gerouteten Geschwister-Datensatz (hält fest, warum der MDA abgelehnt hat, oder dass die Zustellung für eine SUCCESS-/DELAY-Benachrichtigung gelungen ist) sowie attempts/last_error (dazu delay_sent, sobald eine Verzögerungswarnung geroutet wurde) auf dem zurückgestellten Datensatz. state.dsn.rcpt wird im Gleichschritt mit den Empfängern jedes Datensatzes zurechtgeschnitten.

42.6. Siehe auch

pepsi-stage-relay-to-maildir, pepsi-stage-aliases, pepsi-stage-bounce, pepsi-quota, Unterstützte Funktionen, pepsi-stage-relay-to-lmtp(1), pepsi.conf(5).