From 95467f6327d438677b45c013ff21b0044e44a703 Mon Sep 17 00:00:00 2001 From: Plamen Dimitrov Date: Mon, 2 Jul 2012 13:16:29 +0200 Subject: [PATCH] Shared folders can be skipped from config file and readonly folders are handled --- src/fix_imap_internaldate.py | 20 ++++++++++++++++++-- src/mail_iterator.py | 18 +++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/fix_imap_internaldate.py b/src/fix_imap_internaldate.py index 56516c9..a0d698b 100644 --- a/src/fix_imap_internaldate.py +++ b/src/fix_imap_internaldate.py @@ -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 diff --git a/src/mail_iterator.py b/src/mail_iterator.py index 133426d..0ff1089 100644 --- a/src/mail_iterator.py +++ b/src/mail_iterator.py @@ -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): -- 1.7.1