| 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 | total_messages = 0 |
| 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 |
| 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) |
| 48 | return int(warnings_handler.detected_problems > 0) |
| 49 | |
| 50 | def 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 | |
| 65 | def 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 | |
| 92 | if __name__ == "__main__": |
| 93 | main() |