Pylint improvement and method rename
[imap-mark-seen] / imap_mark_seen.py
CommitLineData
87758662
PD
1'''
2imap-mark-seen.py - Tool to mark all e-mails as seen
3
4Copyright (c) 2012 Intra2net AG
5Author: Plamen Dimitrov and Thomas Jarosch
6'''
7import logging
8import argparse, getpass
9from mail_iterator import MailIterator
10from warnings_handler import WarningsHandler
11
12# logging settings
13LOG_FILENAME = "imap_mark_seen.log"
14LOG_FILE_LEVEL = logging.DEBUG
15LOG_SHELL_LEVEL = logging.INFO
16LOG_UNCLEAN_EXIT_LEVEL = logging.WARNING
17
18def 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:
7c7f439f 41 session.set_message_seen(mid.decode('iso-8859-1'))
87758662
PD
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
49def 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
64def 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
91if __name__ == "__main__":
92 main()