Outlook salva tutto il contenuto dell’account di posta dentro ad un file *.pst che viene trattato similmente ad uno spazio sul disco. Questo significa che quando un messaggio viene cancellato definitivamente (per esempio svuotando il cestino oppure cancellandolo con SHFIT+CANC) in realtà non viene rimosso definitivamente dal file, ma ne rimane traccia finché un nuovo messaggio non andrà a sovrascriverlo. Questa non è una spiegazione perfettamente accurata, ma è quanto ci serve sapere allo scopo.
Per recuperare un messaggio cancellato definitivamente è anzitutto importante non scaricare o inviare nuovi messaggi, non fare cioè alcuna operazione che potrebbe modificare il file *.pst.
Detto questo possiamo tentare di recuperare i dati modificando alcuni byte del file *.pst e utilizzando il programma Scanpst.exe fornito assieme ad Office. Dalla versione Microsoft Office 2016 il programma è eseguibile anche tramite linea di comando.
Vediamo quindi come creare un programma in python che ci permetta di effettuare le due operazioni recuperando quindi i messaggi.
Prima di procedere creiamo una copia del file *.pst per non provocare altri danni.
Quello che dobbiamo fare ora è modificare, mettendoli per esempio a 0, i primi 13 byte a partire dalla 7^ posizione nel file *.pst in questione. Questo farà sì che Scanpst.exe identifichi il file come corrotto e cerchi di recuperare i messaggi perduti. Usando un editor esadecimale, tipo Hex Edit, dovremmo vedere una situazione come la seguente.
Quelli che vogliamo mettere a 0 sono i byte evidenziati. Io lo farò usando python. Creiamo un vettore di byte a zero nel modo seguente:
1 |
byte_vuoti = bytes(13) |
Questo produrrà un vettore di byte che possiamo visualizzare con print( byte_vuoti )
Scriviamo il pezzo di codice necessario per modificare il file *.pst
1 2 3 4 5 6 7 |
file_pst = "Outlook.pst" byte_vuoti = bytes(13) fp = open( file_pst , "r+b" ) fp.seek(7) fp.write( byte_vuoti ) fp.close() |
Con fp.seek(7)
ci posizioniamo sull’ottavo byte, e poi scriviamo i 13 byte a 0 dalla posizione acquisita.
Adesso passiamo il file a Scanpst.exe, potremmo farlo anche a mano, ma nel mio esempio lo farò tramite linea di comando.
Modifichiamo il codice soprastante nel modo seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import os dir_path = os.path.dirname(os.path.realpath(__file__)) file_pst = dir_path + "\\Outlook.pst" byte_vuoti = bytes(13) scanpst = "C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\SCANPST.EXE" cmd = "\"%s\" -backupfile \"%s.bck\" -force -file \"%s\" -silent" % (scanpst,file_pst,file_pst) fp = open( file_pst , "r+b" ) fp.seek(7) fp.write( byte_vuoti ) fp.close() output = os.popen(cmd).read() print(output) print("Fatto!") |
Per maggiori dettagli sui parametri da passare a Scanpst.exe rimando alla pagina ufficiale sul sito della Microsoft: Lo strumento Manutenzione Posta in arrivo (Scanpst.exe) può eseguire controlli multipli in Outlook 2016
Con os.path.dirname(os.path.realpath(__file__))
prendiamo la posizione del programma in python, laddove io suppongo che il file Outlook si trovi nella medesima cartella del programma. Inutile dire che file_pst = dir_path + "\\Outlook.pst"
dipende dalla posizione del file *.pst che potremmo passare anche con il percorso diretto.
Con la riga scanpst = "C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\SCANPST.EXE"
prendiamo la posizione del file Scanpst.exe che nel mio caso ha quel percorso. Anche questo dipende dalla nostra specifica installazione di Office. Ricordiamoci che questo procedimento è valido solo per le versioni di Office 2016 e successive.
Infine con output = os.popen(cmd).read()
mettiamo il programma in attesa finché non verrà completata l’esecuzione del comando. (verrà scritto Fatto!)
Alla fine, se tutto è andato bene, dovremmo vedere qualcosa di questo genere nella cartella del file:
Per visualizzare di nuovo il contenuto del file *.pst è sufficiente collegarlo tra i File dati di Outlook.