From dfc25eb67fc0cfa6e07b4b5fbd9f4e688cfc4504 Mon Sep 17 00:00:00 2001 From: Plamen Dimitrov Date: Fri, 13 Jul 2012 10:58:27 +0200 Subject: [PATCH] Regex for the optional folder argument and skip shared folders option by default --- src/imap_mark_seen.py | 14 +++++++++----- src/mail_iterator.py | 12 ++++++++++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/imap_mark_seen.py b/src/imap_mark_seen.py index 7902d40..4c9968f 100644 --- a/src/imap_mark_seen.py +++ b/src/imap_mark_seen.py @@ -14,7 +14,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of 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 @@ -34,11 +34,13 @@ def main(): 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 through mailboxes - session = MailIterator(args.server, args.user, psw) + # prepare simple mail iterator and iterate throug mailboxes + 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 = mailbox[1] + pattern = '^\"?INBOX' + delimiter + args.folder + "[\"?$|" + delimiter + "]" + if args.folder != "all folders" and re.compile(pattern).match(mailbox[2]) == None: continue try: mail_ids = session.fetch_messages() @@ -53,7 +55,7 @@ def main(): 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) @@ -68,6 +70,8 @@ def configure_args(): 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 diff --git a/src/mail_iterator.py b/src/mail_iterator.py index ccd91e2..cd49656 100644 --- a/src/mail_iterator.py +++ b/src/mail_iterator.py @@ -34,10 +34,14 @@ class MailIterator: mailboxes = None # logged in status logged_in = None + # skip shared folders + skip_shared_folders = None - def __init__(self, server, username, password): + def __init__(self, server, username, password, skip_shared_folders = False): """Creates a connection and a user session.""" + self.skip_shared_folders = skip_shared_folders + # connect to server try: self.mail_con = imaplib.IMAP4_SSL(server) @@ -81,6 +85,10 @@ class MailIterator: for mailbox in self.mailboxes: logging.debug("Checking mailbox %s", mailbox[2]) + # detect if mailbox is shared and if skip flag is set iterate further + if(self.skip_shared_folders and mailbox[2].split(mailbox[1])[0] == '"user'): + logging.info("Mailbox %s is shared and therefore skipped.", mailbox[2]) + continue # select mailbox if writable try: self.mail_con.select(mailbox[2]) @@ -109,7 +117,7 @@ class MailIterator: # Work around unsolicited server responses in imaplib by clearing them self.mail_con.response('STORE') _result, data = self.mail_con.uid('STORE', mid_range, '+FLAGS', "(\Seen)") - logging.info("New flags for messages %s are %s", mid_range, data) + logging.debug("New flags for messages %s are %s", mid_range, data) except (self.mail_con.error) as ex: raise UserWarning("Could not set the flags for some messages: %s", ex) self.mail_con.expunge() -- 1.7.1