Durchsuchbare Email-Archivierung mit Agorum core

Die Ausgangssituation

Was Emails angeht, bin ich eher der Jäger und Sammler und lösche eigentlich viel zu wenig, so dass sich mit der Zeit Unmengen an Mails ansammeln. Immerhin bin ich dabei relativ strukturiert, so dass ich gefühlte 10.000 Mails in ebenso gefühlten 498 Ordnern einsortiert habe.

Lösche ich im Aufräumwahn dann aber doch mal uralte Emails, so kann ich mir fast sicher sein, dass ich genau diese Mails zwei Tage später nochmal brauche. Ein echter Teufelskreis!

Es muss also eine externe Archivierung her, um einerseits Thunderbird und den Imap-Server relativ schlank zu halten, andererseits aber auch auf die ältesten Emails zugreifen zu können. Natürlich muss das Archiv Volltextsuche unterstützen und ansonsten ohne manuelle Wartungsarbeiten einfach nur laufen.

Da ich ohnehin Agorum core als DMS einsetze und alle eingehenden Papierbriefe einscanne und dort ablege, liegt es nahe auch die Emails dort zu archivieren. Für Agorum gibt es zwar den MailAdaptor als kostenpflichtiges Zusatzmodul, aber da ich nur die kostenlose Agorum core Open im Einsatz habe, muss ich mir da was eigenes basteln.

Grundsätzliche Überlegungen

  • die Emails sollen automatisiert direkt vom Imap-Server aus archiviert werden ganz ohne mein lokales Thunderbird oder den manuellen Aufruf von irgendwelchen Skripten.
  • auch wenn eine Email auf dem Server gelöscht wird, soll sie im Archiv erhalten bleiben.
  • Es sollen nur ausgewählte Email-Ordner archiviert werden (Logfiles von vor 10 Jahren sind dann wirklich uninteressant, zumindest denke ich das bisher….).
  • die IMAP-Ordnerstruktur soll auf Dateiebene abgebildet werden und jede Email soll eine eigene Datei innerhalb des entsprechenden Ordners sein.
  • Die Mails sollen als EML-Datei gespeichert werden, damit sie direkt aus Agorum core heraus mit einem Mausklick geöffnet werden können.
  • jede Email darf natürlich nur einmal im Archiv stehen, als Kriterium bietet sich daher an die Message-ID als Dateinamen zu verwenden.
  • rechtssichere Archivierung oder Audit-Funktionen spielen keine Rolle, da es sich um rein private Emails handelt.

Die Umsetzung

Ein Perl-Skript ruft die Mails aus ausgewählten Email-Ordnern vom Server ab und speichert sie auf dem gemappten DMS-Laufwerk von Agorum core. Das Skript hat im Bereich Error-Handling noch gewaltig Luft nach oben, aber ist für meine Zwecke ausreichend und bewusst ohne Perl-Magie geschrieben, so dass ich – hoffentlich – auch noch in 2 Jahren verstehe, was ich das eigentlich  gemacht habe.

Benötigt werden die Module IO::Socket::SSL und Mail::IMAPClient, welche sich per CPAN installieren lassen.

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket::SSL;
use Mail::IMAPClient;

# Dieses Programm verbindet sich mit dem Imap-Server mail.gluecksgriff-taschen.de und speichert
# dort alle Mails in bestimmten Foldern in das Agorum-Laufwerk.

# Wo sollen die Mails abgespeichert werden? (das gemappte DMS-Laufwerk von Agorum)
my $base_dir = '/nas/email/Schiffers/Email/Ralf/';

# Aus welchen Ordnern sollen Emails archiviert werden?
my @folder = qw( Aufbewahrung Bestellungen Booklooker Energie Garantie Sent PayPal Zugangsdaten );

# Mit Server verbinden
my $imap = Mail::IMAPClient->new( User => 'ich@gluecksgriff-taschen.de',
                                Password => 'supergheim',
                                Socket => IO::Socket::SSL->new
                                        ( Proto => 'tcp',
                                          PeerAddr => 'mail.gluecksgriff-taschen.de',
                                          PeerPort => 993)
                        ) or die "IMAP-Fehler: $@";

# Eindeutige Uids per Imap-Session verwenden und Setzen des Seen-Flags ausschalten
$imap->Uid(1);
$imap->Peek(1);

# Durch alle ausgewaehlten Email-Ordner gehen

if ( $imap->IsAuthenticated() ) {
        foreach (@folder) {
                my $folder = $_;
                $imap->select($folder) or die "IMAP Select Error: $@\n";
                #
                # Wenn es das Verzeichnis auf Dateiebene noch nicht gibt, dann anlegen
                #
                unless (-d "$base_dir"."$folder")  {
                        mkdir "$base_dir"."$folder" ;
                }
                #
                # Alles Mails im aktuellen Email-Ordner auswaehlen
                #
                my @msgs = $imap->search('ALL');
                foreach my $msg (@msgs) {
                        #
                        # Die Message-ID holen und diese als Dateiname zum Abspeichern verwenden
                        # Wenn es keine Message-ID gibt, dann nicht abspeichern.
                        #
                        my $messageID = $imap->get_header($msg, "Message-Id");
                        if ( defined $messageID) {
                                #
                                # Das < und > am Anfang bzw. Ende der Message-ID abschneiden
                                #
                                $messageID =~ s/^.//;
                                $messageID =~ s/.$//;
                                #
                                # Und noch ein .eml anhaengen, damit die Datei direkt mit Thunderbird geoeffnet werden kann
                                #
                                my $datei = "$base_dir"."$folder"."/"."$messageID"."\.eml";
                                #
                                # Wenn es schon eine Datei mit diesem Namen gibt, dann nicht abspeichern.
                                #
                                unless (-f "$datei") {
                                        $imap->message_to_file ( $datei, $msg );
                                }
                        }
                }
                $imap->close;
        }
}
$imap->logout;

exit 0;

Dieses Skript rufe ich per Cron-Job alle zwei Stunden auf und schon wandern alle Emails brav in Agorum core.

Alle Emails doppelt und dreifach…WTF!

Die anfängliche Freude über diese einfache Art der Archivierung verflog leider schnell, als ich feststellte, dass alle Emails x-fach in Agorum core vorhanden sind (bei jedem Aufruf des Skript kommt eine weitere Kopie der Email hinzu).

Aber ich hatte doch extra die Message-ID als Filenamen verwendet, um genau so etwas zu verhinden. In Agorum kommt aber nicht etwa die Message-ID als Dateiname an, sondern die Message-ID mit einer anschließenden Zahl (wo auch immer die herkommen mag), aus der beabsichtigten Datei msg111@gluecksgriff-taschen.de.eml wird also in Agorum core eine Datei namens msg111@gluecksgriff-taschen.de_1117722.eml.

Aber wer benennt die Datei denn nun um? Mein Skript, Agorum core, das Perl-Modul Mail::IMAPClient oder ist doch schwarze Magie am Werk?

Schreibe ich die Dateien nicht in das Agorum-Laufwerk, sondern in ein normales Verzeichnis, tritt dieser seltsame Effekt der Umbenennung nicht auf, das Skript an sich scheint also ok zu sein und die Namensänderung wird von Agorum core durchgeführt.

Agorum core Konfiguration

In Agorum core kann man definieren was mit bestimmten Dateitypen passieren soll, wenn diese auf das DMS-Laufwerk kopiert werden. Und für die Dateiendung eml ist – welch Wunder – eingestellt, dass der Dateiname mit der interen Dokumentennummer von Agorum code ergänzt werden soll. Warum das die Default-Einstellung ist, erschließt sich mir nicht, aber vielleicht ist das in Zusammenhang mit dem mir unbekannten kommerziellen MailAdaptor-Modul sinnvoll.

Jedenfalls kann man glücklicherweise die Umbenennung von eml-Dateien ausschalten.

Hierzu geht man in die MetaDB und navigiert zu MAIN_MODULE_MANAGEMENT / roi / control / contenttask / EML

Unter dem Eintrag NewName sieht man dann die Ursache des Übels und nach einer Änderung auf ${OriginalName}.${Extension} ist das Mysterium gelöst und auch eml-Dateien behalten nun den ihnen zugedachten Dateinamen.

Den Eintrag DeleteFileAfterTask setze ich sicherheitshalber noch explizit auf false, man weiß ja nie.

Umbenennen von EML-Dateien in Agorum Core ausschalten
Umbenennen von EML-Dateien in Agorum Core ausschalten Umbenennung von EML-Dateien ist nun ausgeschaltet.

Fazit

Emails werden nun wunderbar archiviert, Agorum core findet wie gewohnt jeden Suchbegriff und ich habe keine Ausrede mehr endlich mal Ordnung ins Email-Chaos zu bringen.

Auf das Archivieren des Inbox-Ordners verzichte ich bewusst, da die interessanten Emails ohnehin manuell oder per sieve in die passenden Email-Ordner geschoben werden und dann dort archiviert werden.