Skip to content

Instantly share code, notes, and snippets.

@nyergler
Created January 31, 2012 05:39
  • Star 35 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save nyergler/1709069 to your computer and use it in GitHub Desktop.
Convert maildirs (including subfolders) to mbox format
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
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/
"""
# 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()
dirname=sys.argv[-2]
mboxname=sys.argv[-1]
print(dirname +' -> ' +mboxname)
mboxdirname=mboxname+'.sbd'
maildir2mailbox(dirname,mboxname)
if not os.path.exists(mboxdirname): os.makedirs(mboxdirname)
listofdirs=[dn for dn in os.walk(dirname).next()[1] 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)
print('| ' +curfold +' -> '+curpath[:-4])
maildir2mailbox(os.path.join(dirname,curfold),curpath[:-4])
print('Done')
@scrinzi
Copy link

scrinzi commented Aug 6, 2012

Thanks, inspired me to find salvation after KMail did not work for me in Suse 12.1.
Had to modify, though, find a version that properly descends into KMail generated subdirectories here
git://gist.github.com/3274493.git

@microniko
Copy link

Works great ! Thx !

@AlexandreDomont
Copy link

works very well !

@rrodrigueznt
Copy link

Hi! New to Python, new to Maildir, fighting to find a way of moving my old mailing list arquives to mbox. This script seems to be created to transform email accounts Maildir folders into mbox files, but it doesn't work to transform arquived lists into this format. Please, could you point me in the right direction? Do you know some script to do that job? Thanks for your answer! Thanks for your job!

@jayhendren
Copy link

Here is an updated version that seems to work better: https://github.com/bluebird75/maildir2mbox

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment