Add mmassive e-mail update for performance by using message set STORE command
[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)
9d328275 29 total_messages = 0
87758662
PD
30 for mailbox in session:
31 if args.folder != "all folders" and ("INBOX/" + args.folder) not in mailbox[2]:
32 continue
33 try:
34 mail_ids = session.fetch_messages()
35 except UserWarning as ex:
36 logging.error(ex)
37 continue
9d328275
PD
38 try:
39 if len(mail_ids) > 0:
40 mail_id_range = min(mail_ids, key=int).decode('iso-8859-1') + ':' + max(mail_ids, key=int).decode('iso-8859-1')
41 session.set_seen_messages(mail_id_range)
42 total_messages += len(mail_ids)
43 except UserWarning as ex:
44 logging.error(ex)
45
46 logging.info("Finished marking %s messages as seen", total_messages)
47 logging.info("Exiting with code %s", warnings_handler.detected_problems)
87758662
PD
48 return int(warnings_handler.detected_problems > 0)
49
50def configure_args():
51 """Configure arguments and return them."""
52
53 # parse arguments
54 parser = argparse.ArgumentParser(description="Tool to mark messages as seen.")
55 parser.add_argument('-u', '--user', dest='user', action='store',
56 required=True, help='mark all messages as seen for a single user')
57 parser.add_argument('-f', '--folder', dest='folder', action='store',
58 default="all folders", help='only mark given folder as seen')
59 parser.add_argument('-s', '--server', dest='server', action='store',
60 default="localhost", help='imap server name with default localhost')
61 args = parser.parse_args()
62
63 return args
64
65def prepare_logger():
66 """Sets up the logging functionality"""
67
68 # reset the log
69 with open(LOG_FILENAME, 'w'):
70 pass
71
72 # add basic configuration
73 logging.basicConfig(filename=LOG_FILENAME,
74 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
75 level=LOG_FILE_LEVEL)
76
77 # add a handler for a console output
78 default_logger = logging.getLogger('')
79 console = logging.StreamHandler()
80 console.setLevel(LOG_SHELL_LEVEL)
81 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
82 console.setFormatter(formatter)
83 default_logger.addHandler(console)
84
85 # add a handler for warnings counting
86 warnings_handler = WarningsHandler()
87 warnings_handler.setLevel(LOG_UNCLEAN_EXIT_LEVEL)
88 default_logger.addHandler(warnings_handler)
89
90 return warnings_handler
91
92if __name__ == "__main__":
93 main()