Dovecot Quota mit Postfix abfragen

Abstract

Dovecot 2.2 bringt einen Policy-Service speziell für Postfix. Durch Abfrage des Dovecot-Policy-Services kann Postfix vorab erfahren, wie der Quota-Status der Mailbox eines nachgelagerten Empfängers ist und ob Dovecot die Nachricht annehmen würde. Postfix kann eine Nachricht, die Dovecot später wegen Überfüllung der Mailbox ablehnen würde, so schon selbst vorher...

Dovecot 2.2 bringt einen Policy-Service speziell für Postfix. Durch Abfrage des Dovecot-Policy-Services kann Postfix vorab erfahren, wie der Quota-Status der Mailbox eines nachgelagerten Empfängers ist und ob Dovecot die Nachricht annehmen würde.

Postfix kann eine Nachricht, die Dovecot später wegen Überfüllung der Mailbox ablehnen würde, so schon selbst vorher ablehnen, und ein sonst unvermeidbarer späterer Bounce der Nachricht durch Dovecot entfällt. Dies spart nicht nur Ressourcen (die Mail muss nicht gescannt werden), sondern vermeidet auch unerwünschten Backscatter und möglicherweise daraus resultierendes Blacklisting der eigenen Server.

Status Quo

Bis heute sind Quota und die Aufteilung in Frontend- und Backend-Server problematisch: Der Frontend-Server nimmt Mail ohne Kenntnis des Quota-Status an und transportiert sie zum Backend-System. Dort stellt der Transport fest, dass die Mailbox des Empfängers "over quota" ist und weitere Mails aufgrund der Größenbeschränkungen nicht mehr aufgenommen werden. Weil die Mail nicht zugestellt werden kann, muss ein Bounce generiert werden. Das eigene Mailsystem verkommt ungewollt zur Backscatter-Quelle.

Die Verbesserung

Der neue quota-status-Dienst in Dovecot sorgt dafür, dass dieses Problem nicht mehr auftritt. Er ist besonders bei der Trennung des Mailsystems in Frontend- (z.B. Boundary Filter) und Backend-Server (Mailbox-Server) sinnvoll; das Wissen über den Mailbox-Status ist auf dem Backend-Server, wird aber auf dem Frontend-System gebraucht.

So geht's

Dazu muss im Dovecot-Server auf dem Backend-System, dort wo der Quota-Zustand der Mailbox bekannt ist, in der dovecot.conf der quota-status-Dienst aktiviert werden:

plugin {
    ...
    quota_grace = 10%%
    quota_status_success = DUNNO
    quota_status_nouser = DUNNO
    #quota_status_overquota = "552 5.2.2 Mailbox is full / Mailbox ist voll"
    ...
}

# Service der die Quota fernabfragbar macht
service quota-status {
    executable = quota-status -p postfix
    inet_listener {
        port = 12340
    }
    client_limit = 1
}

Der Wert von quota_grace gibt an, um wieviel die Mailbox "überfüllt" werden kann: Ist die Mailbox knapp unter 100% erlaubter Füllung, so wird in der obigen Konfiguration eine Mail von bis zu 10% des Gesamtquota erlaubt. Die Mailbox ließe sich so auf den maximalen Füllstand von ca. 110% bringen.

Note

Dieser Wert gilt global für alle Subsysteme, die beim Schreiben die Quota beachten müssen (LDA, LMTP, IMAP).

Über die quota_status_*-Einstellungen kann das Antwortverhalten des Policy-Servers angepasst werden. Wir setzen quota_status_success auf DUNNO, da ggf. nachgelagerte Restriktionen die Mail noch abweisen könnten. Ganz am Ende der Restriktionen ist im Beispiel (unten) ohnehin ein OK impliziert.

quota_status_nouser ist ebenfalls DUNNO und damit für Setup mit zwei, unterschiedlichen Mailboxservern geeignet. Dovecot beherrscht das Protokoll, während hingegen beispielsweise Exchange das Protokoll nicht beherrscht. Wenn wir den Dovecot-Server nach Postfächern fragen, die auf dem Exchange liegen, würde die Mail sonst abgewiesen.

Auf diesen quota-status-Dienst kann Postfix nun vom Frontend-Server aus vor der Annahme zugreifen, den Status der Mailbox in Erfahrung bringen und die Mail – je nach Quota-Status – annehmen oder ablehnen.

Damit Postfix den Dovecot-Policy-Service abfragt, muss in der main.cf folgender Eintrag gesetzt werden:

smtpd_recipient_restrictions =
    ...
    check_policy_service inet:mailstore.example.com:12340

Der Frontend-Server fragt zuletzt (oder an geeigneter anderer Stelle) den Policy-Server auf mailstore.example.com und Port 12340 ab.

Tip

Zum Test warn_if_reject in dieselbe Zeile vor den check_policy_service setzen. So werden nur Warnungen und keine echten Abweisungen in der Testphase generiert.

Im Log sieht ein Quota-Reject dann in etwa so aus:

Apr  5 15:03:00 mail2 postfix/smtpd[24261]: NOQUEUE: reject: RCPT from \
inbound.example.com[192.0.2.1]: 552 5.2.2 <firstname.lastname@example.invalid>: \
Recipient address rejected: Quota exceeded (mailbox for user is full); \
from=<r@sys4.de> to=<firstname.lastname@example.invalid> proto=ESMTP \
helo=<sending.domain.invalid>

Update

Man sollte erwarten, dass man von ein- und demselben Absender eine, maximal zwei Rejections innerhalb einer kurzen Zeit sieht. Dem ist nicht so – es scheint MTAs zu geben, die einen 5xx ... Quota-Fehler als temporär betrachten und es dennoch weiter versuchen!

Ralf Hildebrandt, 05. April 2013