← Alle Beiträge
Mail 4. Februar 2026 5 Minuten Lesedauer

Kerio-Postfächer automatisiert nach Benno MailArchiv überführen.

GoBD-konforme Mail-Archivierung mit Cron, Lockfile und sauberem Logging – wie Postfächer aus Kerio automatisch an Benno MailArchiv gehen.

Alexander Fox
Alexander Fox
PlaNetFox · Linux- und Open-Source-Consultant
// 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:

Voraussetzungen #

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:

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.