Shared folders can be skipped from config file and readonly folders are handled
authorPlamen Dimitrov <plamen.dimitrov@intra2net.com>
Mon, 2 Jul 2012 11:16:29 +0000 (13:16 +0200)
committerPlamen Dimitrov <plamen.dimitrov@intra2net.com>
Mon, 2 Jul 2012 11:16:29 +0000 (13:16 +0200)
src/fix_imap_internaldate.py
src/mail_iterator.py

index 56516c9..a0d698b 100644 (file)
@@ -67,8 +67,22 @@ def load_configuration():
     """Loads the script configuration from a file or creates such."""
     config = configparser.RawConfigParser()    
     success = config.read(CONFIG_FILENAME)
+    try:
+            config.get('basic_settings', 'file_log_level')
+            config.get('basic_settings', 'console_log_level')
+            config.get('basic_settings', 'imap_server')
+            config.getint('basic_settings', 'tolerance_mins')
+            config.get('basic_settings', 'skip_shared_folders')
+            config.get('basic_settings', 'fallback_to_date_header')
+    except configparser.NoOptionError:
+        success = []
+    except ValueError:
+        success = []
+
+    # if corrupted settings save file and load default
     if(len(success)==0):
-        config.add_section('basic_settings')
+        if(not config.has_section('basic_settings')):
+            config.add_section('basic_settings')
         config.set('basic_settings', 'file_log_level', logging.INFO)
         config.set('basic_settings', 'console_log_level', logging.INFO)
         config.set('basic_settings', 'imap_server', 'imap.company.com')
@@ -78,6 +92,7 @@ def load_configuration():
         with open(CONFIG_FILENAME, 'w') as configfile:
             config.write(configfile)
             configfile.write("# 0 NOTSET, 10 DEBUG, 20 INFO, 30 WARNING, 40 ERROR, 50 CRITICAL")
+            
     return config
 
 def prepare_logger(config):
@@ -113,7 +128,8 @@ def synchronize_csv(config, test_mode):
     user_reader = csv.DictReader(open(CSV_FILENAME, "r"), delimiter=',')
     for user in user_reader:
         try:
-            session = MailIterator(server, user['username'], user['password'])
+            session = MailIterator(server, user['username'], user['password'],
+                                   config.get('basic_settings', 'skip_shared_folders')=="ON")
         except UserWarning as ex:
             logging.error(ex)
             continue
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):