Initial submission of working tool
[imap-mark-seen] / imap_mark_seen.py
1 '''
2 imap-mark-seen.py - Tool to mark all e-mails as seen
3
4 Copyright (c) 2012 Intra2net AG
5 Author: Plamen Dimitrov and Thomas Jarosch
6 '''
7 import logging
8 import argparse, getpass
9 from mail_iterator import MailIterator
10 from warnings_handler import WarningsHandler
11
12 # logging settings
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
17
18 def main():
19     """Main function."""
20
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()
26
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]:
31             continue
32         try:
33             mail_ids = session.fetch_messages()
34         except UserWarning as ex:
35             logging.error(ex)
36             continue
37         for mid in mail_ids:
38             logging.debug("Setting message %s from mailbox %s as seen",
39                             mid.decode('iso-8859-1'), mailbox[2])
40             try:
41                 session.update_message(mid.decode('iso-8859-1'), mailbox[2])
42             except UserWarning as ex:
43                 logging.error(ex)
44                 continue
45
46     logging.info("Finished marking messages as seen. Exiting with code %s.", warnings_handler.detected_problems)
47     return int(warnings_handler.detected_problems > 0)
48
49 def configure_args():
50     """Configure arguments and return them."""
51
52     # parse arguments
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()
61
62     return args
63
64 def prepare_logger():
65     """Sets up the logging functionality"""
66
67     # reset the log
68     with open(LOG_FILENAME, 'w'):
69         pass
70
71     # add basic configuration
72     logging.basicConfig(filename=LOG_FILENAME,
73                         format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
74                         level=LOG_FILE_LEVEL)
75
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)
83
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)
88
89     return warnings_handler
90
91 if __name__ == "__main__":
92     main()