E-Mail mit Dovecot und Postfix archivieren

Abstract

Vor einiger Zeit habe ich eine eigene Mailarchiv-Lösung auf Basis von Postfix und Dovecot getestet. Die Lösung sollte die archivierten Mails nach Datum, Mailadresse sowie ein- und ausgehend automatisch sortieren.

Vor einiger Zeit habe ich eine eigene Mailarchiv-Lösung auf Basis von Postfix und Dovecot getestet. Die Lösung sollte die archivierten Mails nach Datum, Mailadresse sowie ein- und ausgehend automatisch sortieren.

Gegeben war der Mailserver. Das Setup ist vollständig virtuell und wird mit postfixadmin verwaltet. Größe und Last entsprechen einem ISP-Setup.

Mit dem Mailarchiv – das war eines meiner Ziele – sollte der Postmaster einer Domain später in der Lage sein, selbst auf das Archiv seiner Maildomain per IMAP zuzugreifen. Mit dem Mailclient sollte er z.B. versehentlich gelöschte Mails wieder in die originale Mailbox zurück kopieren können. Die bereits erwähnte Vorsortierung in der Archiv-Mailbox sollte dies erleichtern.

Meine Lösung baute ich auf Dovecot 2.1.x auf, den ich in Postfix über LMTP und einen Unix-Domain-Socket anband:

virtual_transport = lmtp:unix:private/dovecot-lmtp

Damit die Original-Header möglichst unverändert archiviert werden, setzte ich folgende Option:

lmtp_destination_recipient_limit = 1

Das Splitten bremst zwar den Server, da der aber so viel Luft nach oben hat, habe ich das als eher akademisches Problem ignoriert.

Um Mails für die Archivierung auszuleiten, benutze ich die Postfix-BCC-Methode.

Note

Die Spamfilterung auf diesem Mailserver über clamav-milter und spamass-milter ist sehr effektiv, es gibt also kaum relevante Spam-Probleme.

Ein globale Sieve-Regel sorgt für alle Mailboxen dafür, dass als Spam markierte E-Mails in den – automatisch erstellten – Unterordner Junk verschoben werden. Dies gilt auch für die Archiv-Mailbox. Außerdem werden Spam-Mails aller existierenden Junk-Ordner, die älter als 30 Tage sind, mit Hilfe des Dovecot-Expire-Plugins und einem täglichen Cron-Job gelöscht.

Note

Mir ist bewusst, dass dies nicht unproblematisch ist, jedoch ist das Teil der Nutzungsbedingungen auf diesem Mailsystem, denen vor Benutzung explizit zugestimmt werden muss.

Ich erwähne dies hier nur noch einmal, damit klar ist, dass es keiner extra Spamfilterung der Archiv-Mailbox bedarf.

Für Postfix-BCC verwende ich einen gesonderten Transport. Diesen habe ich backuplmtp genannt. Für die sichere Erhaltung der Mail-Header setze ich deshalb in der main.cf von Postfix:

backuplmtp_destination_recipient_limit = 1

Dann sind noch die Postfix-BCC-Parameter zu setzen:

recipient_bcc_maps = pcre:/etc/postfix/backup_bcc.pcre
sender_bcc_maps = pcre:/etc/postfix/backup_bcc.pcre

Um eine Unterdomain-Logik und Postfix benutzen zu können, wähle ich hier das pcre-Format.

Note

Wenn man einzelne Mailboxen archivieren will, kann man auch das Postfix-Plus-Adressing verwenden.

In /etc/postfix/backup_bcc.pcre leite ich eine Kopie für den Mailverkehr aus:

/^(.*)@domain\.de$/      domain.de@backup.server.org

Caution!

Die Maildomain backup.server.org sollte im DNS nicht existieren, weil sich keine Mails von irgendwoher zufällig dorthin verirren oder Mails von dieser Domain über SMTP nach außen gesendet werden sollen. Ich habe hierzu der Einfachheit halber die Domain der Mailserver-Maschinen gewählt, d.h. der eigentliche Mailserver heißt z.B. mail.server.org.

Nach diesem Schema lassen sich natürlich auch noch weitere Domains bedienen. Die Domain backup.server.org wird über den postfixadmin angelegt, ebenso wie die Mailbox domain.de@backup.server.org. Wenig überraschend sollte deren Quota möglichst hoch gewählt werden... ;)

Nun gilt es, in /etc/postfix/master.cf den BCC-Transport einzupflegen:

...
backuplmtp      unix  -       -       n       -       -       lmtp
...

Anschließend wird der Transport selbst über /etc/postfix/transport angesprochen:

...
[backup.server.org]        backuplmtp
...

Note

Die Klammern bewirken, dass Postfix nicht per DNS den MX der Domain bestimmt und dorthin sendet, sondern das genannte Ziel unter genau diesem Namen anspricht.

Die Transport-Tabelle ist anschließend mit Postmap einzulesen, danach sollte der Postfix-Server restartet werden.

Für die Mailbox domain.de@backup.server.org habe ich dann folgende Sieve-Regel für die von mir gewünschte Sortierung verwendet:

require
["reject","variables","date","fileinto","mailbox","envelope","subaddress","regex","copy","include"];
# Extract date info
if currentdate :matches "year" "*" { set "year" "${1}"; }
if currentdate :matches "month" "*" { set "month" "${1}"; }
if currentdate :matches "day" "*" { set "day" "${1}"; }
if envelope :detail :matches "to" "*" { set :lower "to" "${1}"; }
if true {
if header :contains "Return-Path" "${to}@domain.de" { fileinto :create "user-backup/${year}/${month}/${day}/${to}/out";}
else { fileinto :create "user-backup/${year}/${month}/${day}/${to}/in";}
stop;
}

Die Anordnung der Unterordner kann geändert werden – möglicherweise soll die Mailadresse auch in der ersten Ebene sein.

Je nach Dovecot-Setup wird es nötig sein, das Dovecot Listescape-Plugin zu benutzen, denn Mailadressen können auch Punkte und andere besondere Zeichenfolgen enthalten.

Note

Wer E-Mails nicht unendlich archivieren will, kann z.B. mit dem Dovecot Expire-Plugin den Datenbestand automatisch ausaltern lassen.

Ein täglicher Cron-Job mit einem Skript sollte die Bereinigung durchführen. Hier ist ein Beispiel, das in /etc/crontab beginnt und das Skript /usr/local/bin/archive-expunge.sh aufruft:

#/bin/bash
YEAR=`/bin/date +%Y`
/usr/bin/doveadm expunge -d -u *@backup.server.org mailbox
user-backup\*$YEAR*\* savedbefore 10d

Ich habe noch ein paar Erweiterungen hierzu getestet. Beispielsweise kann Sieve mit experimentellen Erweiterungen auch Shell-Skripte aufrufen. Damit ist es möglich, die IMAP-ACLs der automatisch erstellten Unterordner in der Archiv-Mailbox automatisch zu setzen.

Eine mögliche Anwendung wäre z.B., den Grad der Self-Service-Optionen zu erhöhen und dem Eigentümer der Nachricht immer die Rechte list,read,copy auf den eigenen Unterordner in der Archiv-Mailbox zu ermöglichen – das erspart dem Postmaster Arbeit. Auch das Signieren jeder Archiv-Mail mit GnuPG ist möglich. Nachträgliche Manipulationen an einer Archiv-Mail würden so sichtbar.

Was ich nicht getestet habe ist, alle Archiv-Mails zusätzlich zu indizieren und die Bereitstellung der Archiv-Mails in z.B. einem HTTPS-Archiv. Aber auch dies sollte ohne Weiteres möglich sein, denn entsprechende Programme hierfür gibt es reichlich (Mail List Archive usw.).

Robert Schetterer, 07. February 2013