Skip to content

Instantly share code, notes, and snippets.

@floweb
Created January 18, 2015 20:23
Show Gist options
  • Save floweb/0dc754826d2c257ca76c to your computer and use it in GitHub Desktop.
Save floweb/0dc754826d2c257ca76c to your computer and use it in GitHub Desktop.
maildir2mailbox
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Florian Le Frioux, 18 January 2015 - PEP8 compliant
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()[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)
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')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment