#!/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')) count = cur + new return (new, count) 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) _, count = maildir_count(maildir) if count == 0 and ignore_zero: continue if any(re.match(i, name) for i in ignore): continue counts[name] = count if sort_by_count: key = lambda i: i[1] reverse = True else: key = lambda i: i[0] reverse = False try: length_name = max(len(name) for name in counts.keys()) except: length_name = len('Total') try: length_count = max(len(str(count)) for count in counts.values()) except: length_count = 3 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)) total = sum(counts.values()) print('\n{0:{1}}\t{2:{3}d}'.format('Total', length_name, total, length_count))