Recuperare vecchie email di TheBat!

Matteo - 17 lug 2007

Ieri mi sono imbattuto nell'hard–disk che utilizzavo su PC prima di avere il Mac. Conteneva, tra le altre cose, oltre 7000 email negli archivi di TheBat!, l'ottimo client email che usavo all'epoca. Mi è così balenata l'idea di recuperarle in qualche modo su Mac.

The Bat! immagazzina (almeno all'epoca) le email in file con estensione TBB. Il loro formato è piuttosto semplice ed è descritto in dettaglio sufficiente qui.

L'approccio che ho adottato è stato quello di generare una serie di file EML a partire da ogni file TBB in mio possesso. I file EML contengono semplicemente una email in formato sorgente, ovvero secondo l'RFC 822. Molti client di posta sono in grado di aprirli. Sfortunatamente non Mail di Apple, ma c'è sempre Thunderbird. Non solo Thunderbird apre i file EML ma ha anche una comoda estensione, ImportExportTools, per inserire tutti insieme un gruppo di file EML nella cartella di posta voluta. Una gran comodità quando si desidera farlo per oltre 7000 file piccoli e grandi.

Per l'estrazione dei file EML ho deciso di utilizzare Perl. Per quanto la mia conoscenza di questo linguaggio sia piuttosto scarsa, mi è sembrata una buona occasione per metterlo alla prova. Di primo acchitto mi è sembrato esattamente come descritto da molti: compatto e quindi adatto per uno sviluppo molto rapido e senza badare troppo allo stile.

Ecco lo script (io l'ho chiamato convert_tbb.pl — licenza BSD):

# open the input file
open TBB_FILE, $ARGV[0] or die "Unable to open input file";
binmode TBB_FILE;

# read header (magic number 0x20 0x06 0x79 0x19 + 3080 bytes)
read TBB_FILE, $data, 4 or die "Unable to read from the input file";
die "TBB header not found" if unpack("l", get32BitsFromBuffer($data, 1)) != 0x20067919;

read TBB_FILE, $data, 4 or die "Unable to read from the input file";
my $len = unpack("l", get32BitsFromBuffer($data, 0));
print "Warning: wrong header len: $len.\n" if ($len != 3080);

seek TBB_FILE, $len-8, 1 or die "Unable to seek past header";

# read messages until eof
while(!eof(TBB_FILE))
{
# read message header 0x21 0x09 0x70 0x19
read TBB_FILE, $data, 4 or die "Unable to read from the input file";
die "TBB message header not found" if unpack("l", get32BitsFromBuffer($data, 1)) != 0x21097019;

# read message header len
read TBB_FILE, $data, 4 or die "Unable to read from the input file";
$len = unpack("l", get32BitsFromBuffer($data, 0));
die "Wrong message header len ($len)" if ($len != 48);

seek TBB_FILE, 28, 1 or die "Unable to seek message length";

#read message len
read TBB_FILE, $data, 4 or die "Unable to read from the input file";
$len = unpack("l", get32BitsFromBuffer($data, 0));

seek TBB_FILE, 8, 1 or die "Unable to seek past message header";

# create the output file
open(OUT_FILE, '>', randomFileName()) or die "Unable to create output file";
binmode OUT_FILE;

# read the message body
read TBB_FILE, $buffer, $len or die "Unable to read from the input file";

# write the message to the output file
syswrite OUT_FILE, $buffer, $len or die "Unable to write to the output file";

close OUT_FILE;
$numMsg++;
}

close TBB_FILE;
print "$numMsg message(s) exported.\n";

sub hostIsLittleEndian {
# author: Buzz Andersen http://www.scifihifi.com/
my($magicNum) = pack("s", 42);
my($firstByte, $secondByte) = unpack("c2", $magicNum);
if ($firstByte < $secondByte) {
return 0;
}
else {
return 1;
}
}

sub get32BitsFromBuffer {
# author: Buzz Andersen http://www.scifihifi.com/
my($buffer) = $_[0];
my($bigEndian) = $_[1];
if ((!$bigEndian && &hostIsLittleEndian) || ($bigEndian && !&hostIsLittleEndian)) {
return $buffer;
}
else {
my($byte1, $byte2, $byte3, $byte4) = unpack("c4", $buffer);
return pack("c4", $byte4, $byte3, $byte2, $byte1);
}
}

sub randomFileName {
while(1) {
my $r = sprintf '%.10f', rand();
$r = substr($r, index($r, '.')+1).'.eml';
next if -e $r;
return $r;
}
}

L'uso è piuttosto semplice: è sufficiente passare allo script il percorso di un file TBB ed esso crea un file EML per ogni email trovata al suo interno. I file vengono creati nella cartella corrente.

Nel mio caso specifico ho creato una cartella eml_files dentro la cartella MAIL di TheBat!, ho messo lo script nella mia cartella utente e ho lanciato il seguente comando da dentro la cartella eml_files:

find .. -name *.TBB -exec perl ~/convert_tbb.pl '{}' \;

A questo punto mi sono trovato nella cartella eml_files le mie 7000 email da importare in Thunderbird. 

 

sparite tutte le email

nicola - 18 set 2007 08:57

come devo fare a recuperarle?
Weblog Koan Progetti Foto Contatti