''' imap-mark-seen.py - Tool to mark all e-mails as seen Copyright (c) 2012 Intra2net AG Author: Plamen Dimitrov and Thomas Jarosch ''' import logging import argparse, getpass from mail_iterator import MailIterator from warnings_handler import WarningsHandler # logging settings LOG_FILENAME = "imap_mark_seen.log" LOG_FILE_LEVEL = logging.DEBUG LOG_SHELL_LEVEL = logging.INFO LOG_UNCLEAN_EXIT_LEVEL = logging.WARNING def main(): """Main function.""" # prepare configuration args = configure_args() warnings_handler = prepare_logger() logging.info("Marking messages as seen from %s of %s", args.folder, args.user) psw = getpass.getpass() # prepare simple mail iterator and iterate throug mailboxes session = MailIterator(args.server, args.user, psw) total_messages = 0 for mailbox in session: if args.folder != "all folders" and ("INBOX/" + args.folder) not in mailbox[2]: continue try: mail_ids = session.fetch_messages() except UserWarning as ex: logging.error(ex) continue try: if len(mail_ids) > 0: mail_id_range = min(mail_ids, key=int).decode('iso-8859-1') + ':' + max(mail_ids, key=int).decode('iso-8859-1') session.set_seen_messages(mail_id_range) total_messages += len(mail_ids) except UserWarning as ex: logging.error(ex) logging.info("Finished marking %s messages as seen", total_messages) logging.info("Exiting with code %s", warnings_handler.detected_problems) return int(warnings_handler.detected_problems > 0) def configure_args(): """Configure arguments and return them.""" # parse arguments parser = argparse.ArgumentParser(description="Tool to mark messages as seen.") parser.add_argument('-u', '--user', dest='user', action='store', required=True, help='mark all messages as seen for a single user') parser.add_argument('-f', '--folder', dest='folder', action='store', default="all folders", help='only mark given folder as seen') parser.add_argument('-s', '--server', dest='server', action='store', default="localhost", help='imap server name with default localhost') args = parser.parse_args() return args def prepare_logger(): """Sets up the logging functionality""" # reset the log with open(LOG_FILENAME, 'w'): pass # add basic configuration logging.basicConfig(filename=LOG_FILENAME, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=LOG_FILE_LEVEL) # add a handler for a console output default_logger = logging.getLogger('') console = logging.StreamHandler() console.setLevel(LOG_SHELL_LEVEL) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console.setFormatter(formatter) default_logger.addHandler(console) # add a handler for warnings counting warnings_handler = WarningsHandler() warnings_handler.setLevel(LOG_UNCLEAN_EXIT_LEVEL) default_logger.addHandler(warnings_handler) return warnings_handler if __name__ == "__main__": main()