"""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')
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):
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
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)
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."""
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):