diff --git a/imap_filter/imap_filter.py b/imap_filter/imap_filter.py index c9847bf..7b139d3 100644 --- a/imap_filter/imap_filter.py +++ b/imap_filter/imap_filter.py @@ -26,6 +26,14 @@ except ImportError: import click import click_config_file +REQUIRED_MAILBOX_FIELDS = [ + 'mailbox', + 'imap_user', + 'imap_password_file', + 'imap_server', + 'imap_port', + 'imap_ssl' +] class ImapFilter: '''IMAP filter tool''' @@ -46,6 +54,7 @@ class ImapFilter: ) self._init_log() signal(SIGINT, self._signal_handler) + self.imap = None with open(self.config['filters_file'], 'r', encoding='UTF-8') as filters_file: self._log.debug( "Reading filters file '%s'...", @@ -67,7 +76,6 @@ class ImapFilter: "Filters file is empty. Use --help to see more details." ) sys.exit(1) - self.connect_imap() self._process_filters() self._log.debug( "Took %s seconds to process", @@ -77,12 +85,21 @@ class ImapFilter: def _process_filters(self): matches = 0 for mailbox in self.config['mailboxes']: - if 'mailbox' not in mailbox: - self._log.warning( - "No mailbox name in %s, skipping.", - mailbox - ) - break + for field in REQUIRED_MAILBOX_FIELDS: + if field not in mailbox: + self._log.warning( + "Missing required field '%s' in mailbox '%s', skipping.", + field, + mailbox + ) + break + self.connect_imap( + imap_server=mailbox['imap_server'], + imap_port=mailbox['imap_port'], + ssl=mailbox['imap_ssl'], + imap_user=mailbox['imap_user'], + imap_password_file=mailbox['imap_password_file'], + ) if mailbox['mailbox'] == 'INBOX' and self.config['sieve_scripts_path']: self._create_sieve_script(mailbox['filters']) else: @@ -405,38 +422,44 @@ class ImapFilter: return False return True - def connect_imap(self): + def connect_imap(self, imap_server, imap_port, ssl, imap_user, imap_password_file): '''Create connection object to the IMAP server''' self._log.debug( 'Connecting to server %s:%s...', - self.config['imap_server'], - self.config['imap_port'] + imap_server, + imap_port, ) - if self.config['ssl']: + if ssl: try: - self.imap = imaplib.IMAP4_SSL(self.config['imap_server'], self.config['imap_port']) + self.imap = imaplib.IMAP4_SSL(imap_server, imap_port) except Exception as error: self._log.error( "Error connecting securely to IMAP server '%s'. %s", - self.config['imap_server'], - error + imap_server, + error, ) sys.exit(1) else: try: - self.imap = imaplib.IMAP4(self.config['imap_server'], self.config['imap_port']) + self.imap = imaplib.IMAP4(imap_server, imap_port) except Exception as error: self._log.error( "Error connecting to IMAP server '%s'. %s", - self.config['imap_server'], - error + imap_server, + error, ) sys.exit(2) + with open(imap_password_file, 'r', encoding='utf-8') as pass_file: + imap_password = pass_file.read().trim() try: - self._log.debug('Authenticating as user %s...', self.config['imap_user']) - self.imap.login(self.config['imap_user'], self.config['imap_password']) + self._log.debug('Authenticating as user %s...', imap_user) + self.imap.login(imap_user, imap_password) except Exception as error: - self._log.error("Error while login as '%s'. %s'", self.config['imap_user'], error) + self._log.error( + "Error while login as '%s'. %s'", + imap_user, + error, + ) self.imap.close() sys.exit(3)