#!/usr/bin/env python """ List maildirs in your Maildir++ with message counts. """ from __future__ import division, print_function import os import os.path import re import yaml def maildirs(startdir): for dirpath, dirnames, _ in os.walk(startdir): if set(['cur', 'new', 'tmp']).issubset(set(dirnames)): yield dirpath def maildir_count(maildir): def dir_count(dir_): return len(os.listdir(dir_)) cur = dir_count(os.path.join(maildir, 'cur')) new = dir_count(os.path.join(maildir, 'new')) all_ = cur + new return (new, all_) def mailbox_name(maildir, root): name = re.sub(root + r'/?\.?', '', maildir) if name == '': return 'INBOX' else: return name config_filename = '~/.config/maildir-zero.yml' config = {} try: config = yaml.load(open(os.path.expanduser(config_filename))) except: pass ignore_zero = config.get('ignore_zero', True) ignore = config.get('ignore', [r'spam']) sort_by_count = config.get('sort_by_count', True) root = os.path.expanduser('~/Maildir') counts = {} for maildir in maildirs(root): name = mailbox_name(maildir, root) _, all_ = maildir_count(maildir) if all_ == 0 and ignore_zero: continue if any(re.match(i, name) for i in ignore): continue counts[name] = all_ if sort_by_count: key = lambda i: i[1] reverse = True else: key = lambda i: i[0] reverse = False length_name = max(len(name) for name in counts.keys()) length_count = max(len(str(count)) for count in counts.values()) for name, count in sorted(counts.items(), key=key, reverse=reverse): print('{0:{1}}\t{2:{3}d}'.format(name, length_name, count, length_count))