// Inhalt
Hintergrund: Was Benno MailArchiv überhaupt ist, was es leistet und warum Backup kein Archiv ersetzt – das ist in einem eigenen Übersichtsbeitrag erklärt. Hier geht es um die konkrete technische Anbindung.
Wer in Deutschland geschäftlich mailt, muss eingehende und ausgehende Geschäftskorrespondenz revisionssicher aufbewahren – sechs bis zehn Jahre, je nach Dokumentart. Die meisten Mailserver können das nicht aus eigener Kraft. Sie können Mails empfangen, ablegen, durchsuchen – aber „revisionssicher" heißt: unveränderbar, manipulationssicher, mit lückenloser Beweiskette. Dafür braucht es ein eigenes Archiv-System.
Eine Open-Source-Lösung, die ich bei Kunden seit Jahren einsetze, ist Benno MailArchiv. Sie kommt mit allem, was man für GoBD-Konformität braucht – inklusive eines kleinen, aber sehr nützlichen Helpers: benno-imapimport. Mit dem lassen sich beliebige IMAP-Postfächer regelmäßig abholen und ins Archiv überführen, ohne dass man am Mailserver selbst etwas konfigurieren muss.
Diese Anleitung zeigt das konkrete Setup, das ich bei einem Kerio-Connect-Kunden einsetze – inklusive Cron-Automatisierung, Doppelstart-Schutz und sauberem Logging.
Die Aufgabenstellung #
Im konkreten Fall läuft auf Kunden-Seite ein Kerio Connect mit aktivierter Server-Archivierung. Kerio kopiert dabei jede ein- und ausgehende Mail in ein dediziertes Postfach (in diesem Fall „Archiv"). Dieses Postfach ist die Quelle für die Übergabe an Benno – es soll regelmäßig per IMAP abgeholt, ins Archiv überführt und anschließend geleert werden, damit es nicht ins Unermessliche wächst.
Anforderungen ans Skript:
- IMAPS-Verbindung (kein unverschlüsseltes IMAP), inklusive Unterordner
- Erfolgreich importierte Mails werden auf dem Quellserver gelöscht
- Läuft per Cron alle fünf Minuten – ohne dass sich Instanzen überholen
- Maximale Laufzeit von einer Stunde, danach harter Abbruch
- Vollständiges Logging in eine eigene Datei
Voraussetzungen #
- Funktionierende Benno-MailArchiv-Installation
- SSH-Zugang zum Benno-Server mit
sudo-Rechten - IMAP-fähiger Mailserver mit dediziertem Service-Postfach (Kerio, Zimbra, Mailcow, jede beliebige IMAP-Quelle funktioniert)
- Im Kerio Connect: Server-Archivierung aktiviert und auf das Service-Postfach umgeleitet
Das Skript #
Folgendes Shell-Skript landet auf dem Benno-Server unter /usr/local/bin/benno-import.sh. Es kapselt den eigentlichen benno-imapimport-Aufruf in einen sauberen Wrapper mit Lockfile, Timeout und Logging:
#!/bin/sh
set -u
IMAP_HOST="benno.system"
IMAP_USER="archive"
IMAP_PASS="PASSWORT"
INBOX_DIR="/srv/benno/inbox"
LOGFILE="/var/log/benno-imapimport.log"
LOCKDIR="/run/benno-imapimport.lock"
TIMEOUT_SEC=3600
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
}
cleanup() {
rmdir "$LOCKDIR" 2>/dev/null || true
}
trap cleanup EXIT INT TERM
if ! mkdir "$LOCKDIR" 2>/dev/null; then
log "[SKIP] Import läuft bereits" >> "$LOGFILE"
exit 0
fi
{
log "===== START Benno Import ====="
mkdir -p "$INBOX_DIR"
chown benno:benno "$INBOX_DIR" 2>/dev/null || true
timeout "$TIMEOUT_SEC" sudo -n -u benno -H /usr/sbin/benno-imapimport \
-i "$INBOX_DIR" \
-H "$IMAP_HOST" \
-s \
-u "$IMAP_USER" \
-p "$IMAP_PASS" \
-f \
-d \
-v
rc=$?
if [ "$rc" -eq 0 ]; then
log "[OK] Import erfolgreich – Mails wurden gelöscht"
else
log "[ERROR] Import Fehler: $rc"
fi
log "===== ENDE ====="
echo
} >> "$LOGFILE" 2>&1
Anschließend ausführbar machen:
chmod +x /usr/local/bin/benno-import.sh
Was die wichtigen Flags machen #
Die Argumentliste an benno-imapimport ist überschaubar, aber jede Option zählt:
-s– erzwingt eine TLS-Verbindung über IMAPS-Port 993. Ohne dieses Flag würde das Tool unverschlüsselt kommunizieren, was bei produktiven Setups keine Option ist.-f– arbeitet rekursiv durch alle Unterordner des Postfachs. Wer das weglässt, archiviert nur die INBOX und übersieht möglicherweise Sortierungs-Subfolder.-d– löscht jede erfolgreich übertragene Mail vom Quellserver. Kritisch: Erst dann passiert das Aufräumen, wenn der Import wirklich erfolgreich war.-v– verbose Mode für detailliertes Logging. Hilft enorm beim Debuggen, falls eine bestimmte Mail Probleme macht.
Cron-Anbindung #
Mit folgendem Crontab-Eintrag läuft das Skript alle fünf Minuten:
*/5 * * * * /usr/local/bin/benno-import.sh
Fünf Minuten ist ein guter Default – häufig genug, dass Mails zeitnah im Archiv landen, selten genug, dass selbst bei größeren Mail-Volumina der vorherige Import garantiert durch ist. Bei sehr hohem Mailaufkommen (mehrere Tausend Mails pro Stunde) lohnt es sich, das Intervall auf 1–2 Minuten zu drücken.
Warum Lockfile und Timeout? #
Der Wrapper macht zwei Dinge, die in der reinen benno-imapimport-Doku nicht vorgesehen sind, in der Praxis aber den Unterschied zwischen „läuft sauber" und „explodiert irgendwann" machen:
Lockfile via mkdir. Wenn der vorherige Cron-Lauf noch nicht fertig ist (weil viele Mails reinkamen oder der Mailserver lahm ist), würde der nächste Lauf parallel starten. Zwei Importer auf demselben Postfach führen zu Race-Conditions – im besten Fall doppelte Archiv-Einträge, im schlechtesten Fall verlorene Mails. mkdir ist atomar: wenn das Verzeichnis schon existiert, schlägt der Befehl fehl. Damit hat man einen race-condition-freien Sperrmechanismus ohne externe Abhängigkeiten.
Timeout über timeout(1). Falls die IMAP-Verbindung hängt (Netzwerk weg, Mailserver eingefroren, Firewall verschluckt Pakete), würde der Import-Prozess endlos warten und das Lockfile blockieren. timeout 3600 killt den Prozess hart nach einer Stunde – beim nächsten Cron-Lauf ist das Lock weg und es geht weiter.
Stolperstein aus der Praxis: Beim ersten Setup ist mir aufgefallen, dass sudo -n ohne korrekte sudoers-Konfiguration scheitert. Im Skript läuft benno-imapimport als User benno, was eine Zeile in /etc/sudoers.d/benno-import braucht: root ALL=(benno) NOPASSWD: /usr/sbin/benno-imapimport. Sonst silent fail.
Logging im Blick behalten #
Die Logdatei wächst überschaubar – pro Lauf etwa fünf bis zwanzig Zeilen. Trotzdem lohnt sich ein logrotate-Eintrag oder zumindest ein Blick einmal pro Woche:
tail -n 100 /var/log/benno-imapimport.log
Gesucht werden vor allem zwei Muster: häufige [SKIP] Import läuft bereits-Meldungen (heißt: ein Lauf braucht regelmäßig länger als fünf Minuten – Cron-Intervall vergrößern oder Ressourcen aufstocken) und [ERROR]-Zeilen mit Return-Codes, die auf IMAP-Probleme hinweisen.
Praxistipp: bestimmte Ordner ausschließen #
Manche Ordner haben im Archiv nichts verloren – Papierkorb, Spam, Drafts. benno-imapimport kennt dafür den Ausschluss-Schalter -I:
-I "Deleted Items,Junk E-mail,Drafts"
Die Ordnernamen sind dabei case-sensitive und sollten exakt so geschrieben werden, wie sie im IMAP-Server heißen – Vorsicht bei lokalisierten Mailservern (z.B. „Gelöschte Objekte" auf einem deutschen Outlook-IMAP).
Monitoring nicht vergessen #
Ein automatisierter Import ist nur dann ein Gewinn, wenn man auch merkt, wenn er nicht mehr läuft. Bei Kunden setze ich dafür ein einfaches Zabbix-Item auf das Logfile: ein „Last value too old"-Trigger schlägt an, sobald die letzte erfolgreiche [OK]-Zeile mehr als 30 Minuten alt ist. Damit weiß ich es, bevor der Kunde es merkt – und bevor die ersten Tage Mail im Archiv fehlen.
Fazit #
Das Setup ist überschaubar, aber robust: 60 Zeilen Shell, ein Crontab-Eintrag, fertig. Wer Kerio Connect (oder einen anderen IMAP-fähigen Mailserver) GoBD-konform archivieren muss, hat damit eine wartungsarme Lösung, die seit Jahren in Produktion läuft – inklusive sauberer Trennung zwischen produktivem Mailbetrieb und revisionssicherer Aufbewahrung.
Mehr Hintergrund zum Tool selbst gibt es im offiziellen Wiki: wiki.benno-mailarchiv.de.
Sie planen eine GoBD-konforme Archivierung oder eine Migration weg von Kerio Connect? Schreiben Sie mir – ich kenne beide Welten.
