Bei einer Migration von einem Courier IMAP Server nach Exchange stellte sich die Frage, wie am besten eine Liste der IMAP Ordner inklusive Unterordner und die Anzahl der jeweils darin enthaltenen E-Mails erzeugt werden kann, um zu prüfen, ob wirklich alles sauber kopiert wurde.
Der Courier IMAP Server speichert in dem Fall alle E-Mails im Ordner „Maildir“ des jeweiligen Benutzers. Dort ist die Ordnerstruktur der IMAP Ordner abgebildet, wobei der Ordnername jeweils mit einem Punkt beginnt. In jedem IMAP Ordner befindet sich ein Ordner „new“ für ungelesene und ein Ordner „cur“ für gelesenen Mails.
Im aktuellen Fall ging es mir nur um die gelesenen Mails, weshalb ich die Ordnerstruktur erst einmal in eine Textdatei eingelesen habe:
find /home/benutzer/Maildir/ -type d -wholename \*/cur* |sort > ordnernamen.txt
Diese habe ich dann an ein kleines Perl Script verfüttert, welches Leerzeichen und eventuell vorhandene Sonderzeichen maskiert, die Ordner in der Datei durchläuft, die Namen für die Ausgabe anpasst und dann zusammen mit der Anzahl der jeweils vorhandenen E-Mails in eine CSV Datei schreibt:
#!/usr/bin/perl
use warnings;
use strict;
my $file = $ARGV[0];
open (INFILE,$file) or die „Kann $file nicht oeffnen\n“;
open (OUTFILE,“>“.$file.“.csv“) or die „Kann $file.csv nicht oeffnen\n“;
while (<INFILE>) {
chomp $_;
$_ =~ s/ /\\ /g;
$_ =~ s/\&/\\&/g;
$_ =~ s/\(/\\(/g;
$_ =~ s/\)/\\)/g;
my $fullpath = $_;
my $zahl = `find $_ -type f |wc -l`;
chomp $zahl;
$fullpath =~ s/\/home\/benutzer\/Maildir\/\.//g;
$fullpath =~ s/\/cur//g;
$fullpath =~ s/\./\//g;
$fullpath =~ s/\\ / /g;
print OUTFILE „\““.$fullpath.“\“ , \““.$zahl.“\““.“\n“;
}
close (INFILE);
close (OUTFILE);
Das Script ist sicher noch an vielen Punkten verbesserungsfähig, in dem Fall hat es aber genau das gewünschte Resultat gebracht.