#!/home/okin/bin/python

"""
Short script that finds all the senders or receivers from a given imap mailbox.
"""

import imaplib, sys, os, re
from email import message_from_string
from email.Utils import getaddresses # Note: In Py2.3, it's Utils, later it's utils
from optparse import OptionParser

def ok(res):
    if res[0] != 'OK':
        print "Error encountered: "+repr(res)
        sys.exit()
    return res[1]
    
# Parse options
parsedOpts = OptionParser()
parsedOpts.add_option( '-d', '--delete', dest='delete', action='store_true' )
parsedOpts.add_option( '-e', '--headers', dest='headers' )
parsedOpts.set_defaults( delete=False, headers='from,to,cc,resent-to,resent-cc' )
parsedOpts.usage = "usage: %prog [options] hostname username password mailbox"
opts, args = parsedOpts.parse_args()
if len(args) != 4:
    parsedOpts.error('Invalid number of arguments')
    sys.exit(-1)
headers = opts.headers.split(',')
hostname, username, password, mailbox = args

# We always use SSL mode
imap = imaplib.IMAP4_SSL(hostname, 993)
imap.login(username, password)
r = ok(imap.select(mailbox))
msgcount = int(r[0])
data = ok(imap.search(None, 'ALL'))
nums = data[0].split()
for num in nums:
    msg = message_from_string(ok(imap.fetch(num, '(RFC822.HEADER)'))[0][1])
    rawaddrs = [msg[header] for header in headers]
    for _, addr in getaddresses([r for r in rawaddrs if r is not None]):
        addr = addr.strip()
        if addr: print addr

if opts.delete and nums:
    ok(imap.store(",".join(nums), '+FLAGS.SILENT', '\deleted'))
    ok(imap.expunge())
            
ok(imap.close())
imap.logout()
