Shared folders can be skipped from config file and readonly folders are handled
[imap-fix-internaldate] / src / mail_iterator.py
index 133426d..0ff1089 100644 (file)
@@ -33,8 +33,10 @@ 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."""
         try:
             self.mail_con = imaplib.IMAP4_SSL(server)
@@ -44,11 +46,11 @@ class MailIterator:
             self.logged_in = False
             raise UserWarning("Could not log in as user " + username + ".")
         self.logged_in = True
-        
         try:
             result, self.mailboxes = self.mail_con.list()
         except:
             raise UserWarning("Could not retrieve mailboxes for user " + username + ".")
+        self.skip_shared_folders = skip_shared_folders
 
     def __del__(self):
         """Closes the connection and the user session."""
@@ -64,13 +66,23 @@ class MailIterator:
         for mailbox in self.mailboxes:
             logging.debug("Checking mailbox %s.", mailbox)
             mailbox = MAILBOX_RESP.match(mailbox.decode('iso-8859-1')).groups()
+            # 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
+            # retrieve uidvalidity
             try:
                 result, data = self.mail_con.status(mailbox[2], '(UIDVALIDITY)')
             except:
                 raise UserWarning("Could not retrieve mailbox uidvalidity.")
             uidval = UIDVAL_RESP.match(data[0].decode('iso-8859-1')).groups()
             logging.debug("Extracted mailbox info is %s %s.", data[0], uidval)
-            self.mail_con.select(mailbox[2])
+            # select mailbox if writable
+            try:
+                self.mail_con.select(mailbox[2])
+            except self.mail_con.readonly:
+                logging.warning("Mailbox %s is not writable and therefore skipped.", mailbox[2])               
+                continue
             yield (mailbox[2], uidval[1])
 
     def fetch_messages(self):