'''
-imap-mark-seen.py - Tool to mark all e-mails as seen
+imap_mark_seen.py - Tool to mark all e-mails as seen
Copyright (c) 2012 Intra2net AG
-Author: Plamen Dimitrov and Thomas Jarosch
+Author: Plamen Dimitrov
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
'''
-import logging
+import logging, re
import argparse, getpass
from mail_iterator import MailIterator
from warnings_handler import WarningsHandler
# prepare configuration
args = configure_args()
warnings_handler = prepare_logger()
- logging.info("Marking messages as seen from %s of %s", args.folder, args.user)
+ logging.info("Marking messages as seen for user \"%s\" in folder \"%s\"", args.user, args.folder)
psw = getpass.getpass()
# prepare simple mail iterator and iterate throug mailboxes
- session = MailIterator(args.server, args.user, psw)
+ session = MailIterator(args.server, args.user, psw, args.skip_shared_folders)
total_messages = 0
for mailbox in session:
- if args.folder != "all folders" and ("INBOX/" + args.folder) not in mailbox[2]:
+ delimiter = re.escape(mailbox[1])
+ pattern = '^\"?INBOX' + delimiter + re.escape(args.folder) + "[\"?$|" + delimiter + "]"
+ if args.folder != "all folders" and re.compile(pattern).match(mailbox[2]) == None:
+ logging.info("Skipping mailbox %s", mailbox[2])
continue
try:
mail_ids = session.fetch_messages()
try:
if len(mail_ids) > 0:
mail_id_range = min(mail_ids, key=int).decode('iso-8859-1') + ':' + max(mail_ids, key=int).decode('iso-8859-1')
- session.set_seen_messages(mail_id_range)
+ session.set_seen_messages(mailbox, mail_id_range)
total_messages += len(mail_ids)
+ else:
+ logging.info("Skipping empty mailbox %s", mailbox[2])
except UserWarning as ex:
logging.error(ex)
- logging.info("Finished marking %s messages as seen", total_messages)
+ logging.info("Finished marking up to %s messages as seen", total_messages)
logging.info("Exiting with code %s", warnings_handler.detected_problems)
return int(warnings_handler.detected_problems > 0)
default="all folders", help='only mark given folder as seen')
parser.add_argument('-s', '--server', dest='server', action='store',
default="localhost", help='imap server name with default localhost')
+ parser.add_argument('-r', '--shared', dest='skip_shared_folders', action='store_false',
+ default=True, help='skip shared folders flag')
args = parser.parse_args()
return args