Until recently I was having a bad behavior. I found it easy to delete stuffs from my pc by using shift-delete instead of regular delete. And I learnt my lesson.
Every day at work, I spend some quality time dedicated to filter out my inbox from the unwanted invitations to join ‘Daily frogs'
After years of experience, I had mastered the art of detecting spam only by looking at the subject and senders line. Last Monday morning, I had deleted some of the daily spam from my inbox. Things we so natural.
But later that day, I realized that, during the process of pressing the ‘delete’ key, I had accidentally pressed the ‘End’ key also!!!! so the whole thing became, ‘click’ and then ‘Shift-End-Delete’ and then ‘Enter’, so that every message from the beginning to end was gone in 60 seconds.
I just closed the Thunderbird in panic. :-/
But, Thunderbird is no beast a match for my Python skills!!
I am sharing my lazy Python script that I have managed to scramble to recover my Inbox.
This peice of cake, sorry code, is released under GPL.
#!/usr/bin/python --tt import sys import re # Python Script to recover deleted Thunderbird mails. # When you shift-delete the mails in Thunderbird inbox. The mails are not immedeately deleted from the inbox file, # Instead the status bit field of X-Mozilla-Status: of each message is set as deleted. # So what we need is, just read all the value in after X-Mozilla-Status: and then clear the bit3 of the binary of the value. # this script goes through the inbox and, reads status of each message and clear the delete bit in the status. #The new status is written along with the mail to a new file.So the old one is unchanged.... def main(): fr = open ('./inbox' , 'r') fw = open('./inbox-fixed', 'w') for line in fr: #print line ms_match =re.search(r'X-Mozilla-Status: (\w+)',line) if (ms_match): msgstatus = ms_match.group(1) print "status extracted =", msgstatus msgstatus_in_int = int(msgstatus,16) #convert string to number for easy anding msgstatus_in_int &= ~(0x8) # clear the bit3 ie 3 in  msgstatus_new = hex(msgstatus_in_int) #convert back to string msgstatus_new = msgstatus_new[2:] # remove the 0x in the string #print "length of len(msgstatus_new) ", len(msgstatus_new) if ( len(msgstatus_new) ==1 ): msgstatus_new = "000" + msgstatus_new elif ( len(msgstatus_new) ==2 ): msgstatus_new = "00" + msgstatus_new elif ( len(msgstatus_new) ==3 ): msgstatus_new = "0" + msgstatus_new print "new status=", msgstatus_new # line.replace(msgstatus,msgstatus_new) #replace the status fw.write( line.replace(msgstatus,msgstatus_new)) #replace text and write to file else: fw.write(line) if __name__ == "__main__": main() # end of the python script