Regex for the optional folder argument and skip shared folders option by default
authorPlamen Dimitrov <plamen.dimitrov@intra2net.com>
Fri, 13 Jul 2012 08:58:27 +0000 (10:58 +0200)
committerPlamen Dimitrov <plamen.dimitrov@intra2net.com>
Fri, 13 Jul 2012 09:55:20 +0000 (11:55 +0200)
src/imap_mark_seen.py
src/mail_iterator.py

index 7902d40..4c9968f 100644 (file)
@@ -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
index ccd91e2..cd49656 100644 (file)
@@ -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()