www.kuhmann.de

2. E-Mails einsammeln ✅

2.1 Vorbemerkung

Dieser Projektteil basiert ganz wesentlich auf dem Standard IMAP für den Zugriff auf E-Mail-Konten.

Wer in einem Webmail-Frontend ohne SMTP/IMAP eingesperrt ist ohne die Möglichkeit,

  • per Filter eine automatische Weiterleitung oder „Kopieren in Ordner“ einzurichten und/oder
  • einen globalen BCC-Empfänger für ausgehende Mails einzustellen,

darf → diesen Link drücken.

Wenn wenigstens eine automatische Weiterleitung an eine andere E-Mail-Adresse (Vertretungsregelung, Filter) möglich ist, gibt es einen Hack auf eigene Verantwortung. Dazu später mehr.

2.2 Wieso einsammeln?

Deshalb: Sowohl für das Archivieren der ausgehenden Mails als auch später ggf. für „Fax/Scan to E-Mail“ brauchen wir einen zusätzlichen IMAP-Mailaccount. Dann können wir auch gleich diesen Account nutzen, um die auf den Mailkonten eingehenden Mails in Unterordnern zu sammeln.

Vorteile:

  •  Paperless-ngx muss nicht den Posteingang der Originalaccounts abgrasen.
  • Der von mir benutzte und unten dargestellte imapfilter ist beim Filtern und Suchen von Nachrichten wesentlich leistungsfähiger als  Paperless-ngx.
  • Ich kann mit einem Mailclient dem Sammeln zuschauen und ggf. nachjustieren.

2.3 Der zusätzliche Archiv-Mailaccount

Hier haben es Brandenburger Schulen gut: Das Lehrer- oder Schulmail-System ermöglicht Schulen relativ einfach, zusätzliche datenschutzkonforme Mailaccounts einzurichten. Stichwort: „sonstiges pädagogisches Personal“. Nicht weitersagen 8-)

Alle anderen müssen schauen:

  • ähnliche Möglichkeiten in der Landes-Schul-IT?
  • Schulträger?
  • mailbox.org für 3€/mtl. mit AV-Vertrag?
  • … ?

Im Folgenden haben wir einen solchen Account und nennen ihn archiv@schule.de.

Auf diesen greifen wir mit einem E-Mail-Clienten zu und richten für jeden Mailaccount einen eigenen Unterordner ein:

  • Schulleiter
  • Stellvertreterin
  • OSTKO
  • Sekretariat
  • Schulaufsicht

2.4 Einsammeln ausgehender Mails

Hier gibt es nur eine einzige praktisch sinnvolle Möglichkeit:

Einrichten eines Standard-BCC-Empfänger in allen Mailclienten.

Die üblichen „echten“ Mailclients wie Thunderbird, Claws_Mail, der eM Client aber auch FairEmail für Android und sogar das echte Outlook können das. Hier muss dann natürlich als Ziel archiv@schule.de eingetragen werden.

Ohne diese Funktion können ausgehende E-Mails nicht archiviert werden, siehe wieder → hier.

Man könnte lokal einen eigenen SMTP-Mailserver einrichten1), dann den ausgehenden Mailverkehr darüber lenken und im Transfer Kopien an das Archiv schicken. Könnte man. Will man aber nicht. So einen SMTP-Server zu betreiben ist eine richtige Aufgabe. Sie wurden gewarnt.

Im Archiv-Account müssen die Kopien im Posteingang landen (Kontrolle mit Client). Das Verschieben in den richtigen Unterordner macht später imapfilter automagisch.

PS: Bei jeder neuen Mail kann dann der Nutzer individuell entscheiden, ob eine ausgehende Mail doch nicht im Archiv landet.

2.5 Einsammeln eingehender Mails

Hier gibt es nun einen Vorteil: Praktisch alle Mail-Provider bieten an, eingehende Mails bereits auf dem Server mit Filtern vorzuverarbeiten. Zugang zu diesen Filtern hat man über das Webfrontend des Providers (Webmail). Das nutzen wir natürlich erbarmungslos aus 8-)

Leider ist der Funktionsumfang verschieden. Bei uns gibt es zwei Varianten:

2.5.1 Account bei Strato

⚙️ → Einstellungen → E-Mail → Filterregeln → [ + Neue Regel hinzufügen ]

  • Name „Archivierung“
  • keine Bedingung hinzufügen, Regel gilt für alle eingehenden Nachrichren
  • Aktion hinzufügen → Umleiten nach → [archiv@schule.de]
  • [Speichern]

Gibt es bereits weitere Filterregeln, muss diese neue Regel ganz nach oben geschoben werden. Fertig.

2.5.2 Lehrer- bzw. Schul-Account Brandenburg

Obwohl hier der gleiche Server läuft (Open-Xchange), ist der Umleiten-Filter anders konfiguriert: Er nimmt „umleiten“ wörtlich und löscht das Original. Passt nicht für das Archivieren 8-(

Dafür ist hier [Kopieren nach…] aktiviert2). Also richten wir einen Unterordner „Archivieren“3) ein und konfigurieren den Filter:

⚙️ → E-Mail → Filterregeln → [ + Neue Regel hinzufügen ]

  • Name „Archivierung“
  • keine Bedingung hinzufügen, Regel gilt für alle eingehenden Nachrichren
  • Aktion hinzufügen → Kopieren nach → Ordner auswählen → [Archivieren]
  • [Speichern]

Gibt es bereits weitere Filterregeln, muss diese neue Regel ganz nach oben geschoben werden. Fertig.

Das Verschieben in den Archivaccount macht dann imapfilter (s. u.).

2.5.3 Andere Mail-Provider

Liegt der Mailaccount bei einem anderen Provider, muss genau geschaut und getestet werden, welche Aktionen für Filter angeboten werden und wie diese funktionieren. Das Prinzip sollte mit den beiden obigen Beispielen klar sein.

2.6 Umsortieren mit imapfilter

Jetzt müssen die gefilterten Mails „nur noch“ in die passenden Ordner des Archivaccounts verschoben werden. Hierfür kommt nun die Software imapfilter ins Spiel. Diese läuft auf unserem Archivrechner und sortiert regelmäßig um. Wir melden uns also am Rechner an und wecheln zu root.

2.6.1 Installation und Konfiguration

Installieren geht sehr schnell:

root@archiv.local:~# apt install imapfilter

In der Grundeinstellung arbeitet imapfilter das Lua-Script $HOME/.imapfilter/config.lua ab. Dort könnten wir jetzt alles reinschreiben. Machen wir aber nicht.

Der Ordnung und der Flexibilität wegen richten wir einen neuen Ordner unter /opt ein und legen dort einzelne Lua-Scripte für jeden Mailaccount an:

# cd /opt
# mkdir imapfilter
# cd imapfilter
# touch archiv-schulleiter.lua archiv-stellvertreterin.lua archiv-ostko.lua archiv-sekretariat.lua archiv-schulaufsicht.lua

Mit dem mc geht das natürlich auch interaktiv.

2.6.2 Script für Strato-Account konfigurieren und testen

Am einfachsten öffnet man jetzt eins der angelegten Scripte mit dem mc und F4 und kopiert über die Zwischenablage dieses Script als Vorlage ein:

archiv-sekretariat.lua
-- Sekretariat: Strato-Account, direkte Weiterleitung an Archiv
-- Alle Nachrichten liegen schon im Posteingang des Archivaccounts.
 
-- Account
 
archiv = IMAP {
    server = 'imap.provider.de',
    username = 'archiv@schule.de',
    password = 'GEHEIM',
    ssl = 'auto'
}
 
-- -------------------------------------------------------------
-- Actions
-- -------------------------------------------------------------
 
-- eingehende Mails inklusive BCC
 
eingang = archiv.INBOX:match_to('.*[sS]ekretariat@schule\\.de.*') +
                 archiv.INBOX:match_cc('.*[sS]ekretariat@schule\\.de.*') +
                 archiv.INBOX:match_header('.*BY: [sS]ekretariat@schule\\.de.*') +
                 archiv.INBOX:match_header('.*for .*[sS]ekretariat@schule\\.de.*')
 
eingang:mark_seen()
eingang:move_messages(archiv['Sekretariat'])
 
-- ausgehende Mails
 
ausgang = archiv.INBOX:match_from('.*[sS]ekretariat@schule\\.de.*')
ausgang:mark_seen()
ausgang:move_messages(archiv['Sekretariat'])

Hinweise:

  • Die Syntax ist in der Manpage imapfilter_config sehr ausführlich beschrieben. Mir gefällt Lua ja nicht so besonders, hierfür reichts aber.
  • Die passenden Header-Einträge für BCC-Mails (ohne To:/Cc:) muss man sich in einem Mailclient im Quelltext der Nachricht raussuchen und als regulären Ausdruck einbauen.

Für das automatische Abarbeiten ist es natürlich notwendig, die Passwörter in den Scripten abzulegen. Wird das Projekt nicht von einem Schulleitungsmitglied betreut, empfehle ich eine schriftliche Vereinbarung wegen Vertraulichkeit/Verschwiegenheit und so…

Nach allen Anpassungen an die eigenen Daten kann das Script auf der Kommandozeile getestet werden:

# imapfilter -c /opt/imapfilter/archiv-sekretariat.lua

Wenn im Posteingang bereits passende Nachrichten liegen, müssten Statusmeldungen zum Verschieben erscheinen. Mit einem Mail-Client sollte kontrolliert werden, dass alle Mails von diesem Account tatsächlich im richtigen Unterordner liegen4).

Ansonsten geht die Fehlersuche los… Kennen die Informatiker.

2.6.3 Script für Lehrer- bzw. Schulmail Brandenburg

Hier liegen die eingegangenen Nachrichten noch nicht im Posteingang des Archivs, sondern im Unterordner „Archivieren“ des Originalaccounts. Die Nachrichten müssen also von imapfilter verschoben werden:

archiv-ostko.lua
-- Accounts
 
ostko = IMAP {
    server = 'imap.provider.de',
    username = 'ostko@schule.de',
    password = 'GEHEIM',
    ssl = 'auto',
}
 
archiv = IMAP {
    server = 'imap.provider.de',
    username = 'archiv@schule.de',
    password = 'GEHEIM',
    ssl = 'auto',
}
 
-- -------------------------------------------------------------
-- Actions
-- -------------------------------------------------------------
 
ostko:unsubscribe_mailbox('Archivieren')
 
eingang = ostko['Archivieren']:select_all()
eingang:mark_seen()
eingang:move_messages(archiv['OSTKO'])
 
ausgang = archiv.INBOX:match_from('.*ostko@schule\\.de.*')
ausgang:mark_seen()
ausgang:move_messages(archiv['OSTKO'])
 
-- -------------------------------------------------------------

Hinweise:

  • Die Hinweise oben zur Anpassung, zum Testen und zur Fehlerkontrolle gelten analog.
  • Natürlich kann imapfilter die Mails nicht „einfach so“ zwischen völlig verschiedenen Mailaccounts verschieben. Sie werden einzeln im Quelltext heruntergeladen, im anderen Account hochgeladen und dann im ersteren gelöscht. Das kann - auch beim Testen - je nach Größe der Anhänge einen oder zwei Momente dauern.

2.6.4 Weitere Scripte

Nach obigen Mustern und ggf. notwendigen Anpassungen richtet man nun für jeden zu archivierenden Account so ein Lua-Script ein und testet es einzeln sorgfältig.

Man kann in die obigen Scripte auch zusätzlich einen Spam-Schutz einbauen oder Mails, die eindeutig erkennbar sind und gar nicht archiviert werden sollen, vor der Verarbeitung löschen.

Wir haben z. B. ein Ticketsystem, welches einen Haufen Erinnerungsmails verschickt. Die werden rausfliegen.

Oder der Bürokopierer schickt nervige „Toner fast alle“ Meldungen oder …

Den Einbau dieser Erweiterungen überlasse ich euch als Übung …

2.6.5 Automatischer Aufruf

Alle diese Scripte müssen nun regelmäßig aufgerufen werden, um die Mails einzusammeln und in die richtigen Ordner einzuordnen. Hierzu nutzen wir den auf jedem Linux-Rechner vorhandenen Cron-Dienst, bearbeiten dafür die Datei /etc/crontab und hängen ganz unten an:

#- E-Mail-Archivierung ------------------------------------------------------------------

*/5 *   * * *   root   /usr/bin/imapfilter -c /opt/imapfilter/archiv-ostko.lua > /dev/null
*/5 *   * * *   root   /usr/bin/imapfilter -c /opt/imapfilter/archiv-sekretariat.lua > /dev/null
... usw.

Dann verschicken wir ein paar Testmails hin und her und beobachten gespannt mit einem Mail-Clienten im Archivaccount, ob Kopien da landen wo sie hingehören.

Im Dauerbetrieb müssen die Scripte nicht alle 5 Minuten laufen und könnten sogar zeitlich entzerrt nach Dienstschluss laufen:

#- E-Mail-Archivierung ------------------------------------------------------------------

10 18   * * *   root   /usr/bin/imapfilter -c /opt/imapfilter/archiv-ostko.lua > /dev/null
20 18   * * *   root   /usr/bin/imapfilter -c /opt/imapfilter/archiv-sekretariat.lua > /dev/null
... usw.

Dann wird auch der Import in  Paperless-ngx entzerrt (nicht alles auf einmal).

2.7 Stand bis hierher

Wir haben einen Mailaccount „Archiv“, in welchem in Unterordnern regelmäßig und automatisch Kopien aller ein- und ausgehenden E-Mails der zu archivierenden Mailaccounts gesammelt werden.

Die Arbeit der Kolleg/-innen wird dabei nicht gestört oder beeinflusst. Soweit muss das funktionieren.

PS: Mit Thunderbird z. B. kann man sich im linken Fensterteil bei den Ordnern die Anzahl und die Gesamtgröße anzeigen lassen und schon mal schauen, was da so in einer Woche aufläuft…

1)
z. B. exim oder postfix
2)
kann Strato nicht
3)
nicht Archiv, ist besetzt!
4)
und dort auf das Abholen mit  Paperless-ngx warten…

Diskussion: Meinungen, Nachfragen

Geben Sie Ihren Kommentar ein:
A᠎ Q L K K