#!/usr/bin/perl -w # This utility will look at a user's INBOX folder, look at his foldmap # and also the messages under $homedir/messages. It will create a new # folder, called RESCUED, which will contain any message in the directory # but not in foldmap, or any message in foldmap but not in INBOX use GDBM_File; die "Usage: salvage_messages \n\n" if (!$ARGV[0]); $homedir = $ARGV[0]; die "Cannot find messages directory $homedir/messages!\n\n" if (! -d "$homedir/messages"); die "Cant find INBOX folder!\n\n" if (! -e "$homedir/folders/INBOX" and !-e "$homedir/folders/.imap/INBOX"); # open up inbox... it can be either imap or not # assume it's imap first %folder = undef; if (-e "$homedir/folders/.imap/INBOX") { tie %folder, "GDBM_File", "$homedir/folders/.imap/INBOX", O_RDONLY, 0660; } else { tie %folder, "GDBM_File", "$homedir/folders/INBOX", O_RDONLY, 0660; } die "Trouble reading INBOX!\n\n" if (!%folder or %folder eq undef); @msglist = split(':', $folder{"messages"}); foreach $msg (@msglist) { $msglist{$msg} = 1; } %foldmap = undef; # grab foldmap if it exists tie %foldmap, "GDBM_File", "$homedir/foldmap", O_RDONLY, 0660 if (-e "$homedir/foldmap"); opendir (DIR, "$homedir/messages"); @messages = grep {!/^\./} readdir DIR; $rescuelist = ""; foreach $msg (@messages) { print "processing $msg\n"; next if (exists($msglist{$msg})); print "not in INBOX\n"; # ok, not in INBOX... is it in foldmap? only rescue it if foldmap thinks # it belongs to INBOX, or rescue it if not in foldmap either if (!exists($foldmap{$msg}) or (exists($foldmap{$msg}) and $foldmap{$msg} eq "INBOX")) { if ($rescuelist eq "") { $rescuelist = $msg; } else { $rescuelist .= ":$msg"; } } } if ($rescuelist ne "") { print "list of rescued messages: $rescuelist\n"; # create the RESCUED folder tie %rescued, "GDBM_File", "$homedir/folders/RESCUED", O_CREAT|O_RDWR, 0660; $folder{"messages"} = $rescuelist; }