Sat 08 February 2014
Last week I moved from Debian to Linux Mint and setup Thunderbird as my new mail client(replacing mutt). Sadly for some reason Thunderbird started tanking and wiped all the mails from my mailserver without actually downloading anything.
I could've restored the mails from a backup but instead I figured I'd take my emails offline and use Thunderbird as my primary mail client. I had a backup of my mails from OfflineImap but the problem was that OfflineImap uses the MailDir format and Thunderbird didn't support it.
Luckily Thunderbird did support maildir and I modified an existing MailDir to Mbox converter written in Python to work with Offlineimaps potentially infinitely recursive folder format. Hopefully it helps someone else.
#!/usr/bin/env python # -*- coding: utf-8 -*- """ Shane Dowling, 8 Feb 2013 Frédéric Grosshans, 19 January 2012 Nathan R. Yergler, 6 June 2010 This file does not contain sufficient creative expression to invoke assertion of copyright. No warranty is expressed or implied; use at your own risk. --- Uses Python's included mailbox library to convert mail archives from maildir [http://en.wikipedia.org/wiki/Maildir] to mbox [http://en.wikipedia.org/wiki/Mbox] format, icluding subfolder. See http://docs.python.org/library/mailbox.html#mailbox.Mailbox for full documentation on this library. --- To run, save as md2mb.py and run: $ python md2mb.py [maildir_path] [mbox_filename] [maildir_path] should be the the path to the actual maildir (containing new, cur, tmp, and the subfolders, which are hidden directories with names like .subfolde.subsubfolder.subsubsbfolder); [mbox_filename] will be newly created, as well as a [mbox_filename].sbd the directory. """ import mailbox import sys import email import os def maildir2mailbox(maildirname, mboxfilename): """ slightly adapted from maildir2mbox.py, Nathan R. Yergler, 6 June 2010 http://yergler.net/blog/2010/06/06/batteries-included-or-maildir-to-mbox-again/ and Frédéric Grosshans, 19 January 2012 http://stackoverflow.com/questions/2501182/convert-maildir-to-mbox """ # open the existing maildir and the target mbox file maildir = mailbox.Maildir(maildirname, email.message_from_file) mbox = mailbox.mbox(mboxfilename) # lock the mbox mbox.lock() # iterate over messages in the maildir and add to the mbox for msg in maildir: mbox.add(msg) # close and unlock mbox.close() maildir.close() #Creates the main mailbox dirname=sys.argv[-2] mboxname=sys.argv[-1] mboxdirname=mboxname+'.sbd' if not os.path.exists(mboxdirname): os.makedirs(mboxdirname) # Iterate over all folders def folder_iterate(dirname, mboxname): listofdirs=[dn for dn in os.walk(dirname).next() if dn not in ['new', 'cur', 'tmp']] for curfold in listofdirs: curlist=[mboxname]+curfold.split('.') curpath=os.path.join(*[dn+'.sbd' for dn in curlist if dn]) if not os.path.exists(curpath): os.makedirs(curpath) try: maildir2mailbox(os.path.join(dirname,curfold),curpath[:-4]) except OSError: print('no maildir folders') folder_iterate(os.path.join(dirname,curfold), mboxname) folder_iterate(dirname, mboxname) print('Done')