Adam’s Super Simple Guide to mbox->maildir conversion

There are a lot of pages out there explaining how to convert your mail from mbox to maildir. I’m going to add one more, resurrecting the “tips” section of my blog. (All the tips from my blosxom days are grouped together on one page — someday I’ll get around to breaking those up properly.)

If nothing else, I’ll never have to write these instructions in an email to someone again, instead I’ll just send them the link to this entry. I hope these steps are specific enough so anyone savvy enough to even have this problem in the first place will be able to follow them.

One thing I find consistently concerns people when converting to maildir is how to make sure no mail is lost in the transition. The steps below address that concern. It’s really not hard at all once you understand how maildir works.

First, I’m assuming you have mb2md installed and procmail support. Also, if you plan to access your mail through IMAP, your IMAP server needs to know to use ~/Maildir if ~/Mail does not exist. This is often default behavior (at least it is for Dovecot).

Finally, I assume that your inbox is in /var/mail/username, and your other mail folders are in ~/mail.

So, here goes:

  1. Edit your .procmailrc. The first two lines should read:
    MAILDIR=$HOME/Maildir
    DEFAULT=$MAILDIR/

    This will cause all new mail to be delivered (after you save your .procmailrc) to be stored in maildir format under ~/Maildir. The key for procmail to know to use the maildir format is the trailing slash in the “DEFAULT” line. Note that under the new system, your inbox and all your folders are kept in ~/Maildir, rather than having an inbox in /var/mail and your folders under your home directory. (This is nice because it makes it easier to back up all your mail together, among other things).
  2. If you have any specific procmail rules in your .procmailrc, you’ll also need to change the target folders for that. For example, if you have a spam filtering rule like this:
    :0 H
    * ^X-Spam-Level: *****
    spam
    It needs to be changed to this:

    :0 H
    * ^X-Spam-Level: *****
    .spam/

    The trailing slash, again, tells procmail to use maildir rather mbox format for delivery. The leading dot will make the folder appear properly for your IMAP client (there’s a trick I suggest below for making “dot” folders easy to access with a command line client like mutt).

    If you have mail being delivered to a nested mail folder, an additional change is needed because maildir has a flat hierarchy. So if your mail was being delivered to “misc/other/spam” the new target should be “.misc.other.spam/”.

  3. Save your .procmailrc. From this point forward, all mail will be delivered to your maildir folders. You can now import all your old mail to the new folders without concern. Since maildir stores each individual message as a separate unique file, you don’t need to worry about any overwriting issues while you are making the transition. New mail will be delivered to newly named files; old mail will be imported to other, unique, newly named files.
  4. Import your mail folders:
    mb2md -s ~/mail -R
    The -R just means to import recursively through all your folders; if your mail folder is Mail rather than mail, use that instead. No destination is needed because mb2md uses ~/Maildir by default.
  5. Import your inbox:
    mb2md -m
  6. Move your old inbox out of the way. Most people won’t actually be able to move or delete files in /var/mail (since they don’t have directory write privileges), so the easiest thing is probably to just open the inbox in your IMAP client or with mutt and save or delete all the messages.
  7. Move your old mail folder out of the way:mv ~/mail{,.bak}Once you’ve confirmed that everything is okay, you should be able to delete ~/mail.bak (or compress it and move it elsewhere.) If you saved your inbox to mail folder in step 6, that will get moved out of the way here as well.
  8. That’s it, you’re done.
  9. Okay, so you’re not quite done if you access your mail with mutt rather than an IMAP client. (You could just point your mutt at your local IMAP server, of course). I’ve found the most convenient way to access the “dot” folders with mutt is to create a parallel symlinked folder structure without the dots. Here’s a hacked-together shell script that will do that. This could obviously be rewritten to be much more elegant (probably in perl). But we all have our messy scripts, right?

    #!/bin/bash

    cd ~/Maildir

    for x in .*
    do
    y=${x##.}
    if ( echo $y | grep -q '.' )
    then
    mkdir -p ~/mymail/${y%.*}
    fi
    ln -s ~/Maildir/$x ~/mymail/`echo $y | sed "s/.///g"`
    done

    for x in *
    do
    ln -s ~/Maildir/$x ~/mymail
    done

    Then, just add these lines to your .muttrc file:
    set folder="~/mymail"
    set spoolfile="~/mymail"

Any questions?

3 comments

  1. Henrik Apr 19

    Just FWIW, if you only ever access your maildirs directly with mutt, you don’t need to have dirs starting with a dot.

  2. John Flinchbaugh Apr 26

    Thanks for the great little tutorial here. I started playing around testing some of these steps, and before I knew it, I had my whole mail system converted.

    On Mutt, you can ‘set mask = “”‘ (or unset mask, I guess) and have your dot folders displayed. Even more conveniently, I use the “mailboxes” directive to list my maildirs into which procmail is delivering mail, and it then automatically shows the first one with new mail when I press “c” to switch folders. ex: mailboxes =.inbox-linux =.inbox-java =.inbox-security

  3. Bender Feb 7

    Mutt will mask the leading dot if you ask for the folder in the imap namespace. For example, if your mail delivery folder is ~/Maildir/.myfolder, ask mutt to go to folder “=myfolder” and it should find it (the `=’ says to complete the folder name through the imap server and not your file system).

Leave a Reply

(Markdown Syntax Permitted)