2 imap-mark-seen.py - Tool to mark all e-mails as seen
4 Copyright (c) 2012 Intra2net AG
5 Author: Plamen Dimitrov and Thomas Jarosch
8 import argparse, getpass
9 from mail_iterator import MailIterator
10 from warnings_handler import WarningsHandler
13 LOG_FILENAME = "imap_mark_seen.log"
14 LOG_FILE_LEVEL = logging.DEBUG
15 LOG_SHELL_LEVEL = logging.INFO
16 LOG_UNCLEAN_EXIT_LEVEL = logging.WARNING
21 # prepare configuration
22 args = configure_args()
23 warnings_handler = prepare_logger()
24 logging.info("Marking messages as seen from %s of %s", args.folder, args.user)
25 psw = getpass.getpass()
27 # prepare simple mail iterator and iterate throug mailboxes
28 session = MailIterator(args.server, args.user, psw)
29 for mailbox in session:
30 if args.folder != "all folders" and ("INBOX/" + args.folder) not in mailbox[2]:
33 mail_ids = session.fetch_messages()
34 except UserWarning as ex:
38 logging.debug("Setting message %s from mailbox %s as seen",
39 mid.decode('iso-8859-1'), mailbox[2])
41 session.set_message_seen(mid.decode('iso-8859-1'))
42 except UserWarning as ex:
46 logging.info("Finished marking messages as seen. Exiting with code %s.", warnings_handler.detected_problems)
47 return int(warnings_handler.detected_problems > 0)
50 """Configure arguments and return them."""
53 parser = argparse.ArgumentParser(description="Tool to mark messages as seen.")
54 parser.add_argument('-u', '--user', dest='user', action='store',
55 required=True, help='mark all messages as seen for a single user')
56 parser.add_argument('-f', '--folder', dest='folder', action='store',
57 default="all folders", help='only mark given folder as seen')
58 parser.add_argument('-s', '--server', dest='server', action='store',
59 default="localhost", help='imap server name with default localhost')
60 args = parser.parse_args()
65 """Sets up the logging functionality"""
68 with open(LOG_FILENAME, 'w'):
71 # add basic configuration
72 logging.basicConfig(filename=LOG_FILENAME,
73 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
76 # add a handler for a console output
77 default_logger = logging.getLogger('')
78 console = logging.StreamHandler()
79 console.setLevel(LOG_SHELL_LEVEL)
80 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
81 console.setFormatter(formatter)
82 default_logger.addHandler(console)
84 # add a handler for warnings counting
85 warnings_handler = WarningsHandler()
86 warnings_handler.setLevel(LOG_UNCLEAN_EXIT_LEVEL)
87 default_logger.addHandler(warnings_handler)
89 return warnings_handler
91 if __name__ == "__main__":