Continuing on my last post (), I wanted to show a snippet of Python code that will list a set of IMAP folders and count the number of messages in them. You give it a starting folder and it lists that folder plus all/any sub-folders and their message counts. At the very end it prints a total message count.
from imaplib import IMAP4, IMAP4_PORT
import sys, traceback
# Your IMAP Settings
host = ''
port = IMAP4_PORT
user = ''
password = ''
folder = 'INBOX'
imap = None
def parse_mailbox(data):
flags, b, c = data.partition(' ')
separator, b, name = c.partition(' ')
return (flags, separator.replace('"', ''), name.replace('"', ''))
try:
# Create the IMAP Client
imap = IMAP4(host, port)
# Login to the IMAP server
resp, data = imap.login(user, password)
if resp == 'OK' and bytes.decode(data[0]) == 'LOGIN completed':
totalMsgs = 0
# Get a list of mailboxes
resp, data = imap.list('"{0}"'.format(folder), '*')
if resp == 'OK':
for mbox in data:
flags, separator, name = parse_mailbox(bytes.decode(mbox))
# Select the mailbox (in read-only mode)
imap.select('"{0}"'.format(name), True)
# Get ALL message numbers
resp, msgnums = imap.search(None, 'ALL')
mycount = len(msgnums[0].split())
totalMsgs = totalMsgs + mycount
print('{:<30} : {: d}'.format(name, mycount))
print('{:<30} : {: d}'.format('TOTAL', totalMsgs))
except:
print('Unexpected error : {0}'.format(sys.exc_info()[0]))
traceback.print_exc()
finally:
if imap != None:
imap.logout()
imap = None