diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c4942b..d444177 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +4.1.5 +----- + +- Only move or delete IMAP emails after they all have been parsed +- Reconnect to IMAP if connection is broken during +`get_dmarc_reports_from_inbox()` + 4.1.4 ----- diff --git a/parsedmarc/__init__.py b/parsedmarc/__init__.py index ca1e706..d260ff8 100644 --- a/parsedmarc/__init__.py +++ b/parsedmarc/__init__.py @@ -44,7 +44,7 @@ import imapclient.exceptions import dateparser import mailparser -__version__ = "4.1.4" +__version__ = "4.1.5" logger = logging.getLogger(__name__) logger.setLevel(logging.ERROR) @@ -1238,8 +1238,19 @@ def get_dmarc_reports_from_inbox(host=None, user=None, password=None, server.select_folder(reports_folder) messages = server.search() for message_uid in messages: - raw_msg = server.fetch(message_uid, - ["RFC822"])[message_uid][b"RFC822"] + try: + raw_msg = server.fetch(message_uid, + ["RFC822"])[message_uid][b"RFC822"] + + except (ConnectionResetError, TimeoutError) as error: + logger.debug("IMAP error: {0}".format(error.__str__())) + logger.debug("Reconnecting to IMAP") + server = imapclient.IMAPClient(host, use_uid=True) + server.login(user, password) + server.select_folder(reports_folder) + raw_msg = server.fetch(message_uid, + ["RFC822"])[message_uid][b"RFC822"] + msg_content = raw_msg.decode("utf-8", errors="replace") try: @@ -1259,16 +1270,43 @@ def get_dmarc_reports_from_inbox(host=None, user=None, password=None, delete_messages([message_uid]) else: move_messages([message_uid], invalid_reports_folder) - if not test: - if delete: - processed_messages = aggregate_report_msg_uids + \ - forensic_report_msg_uids + if not test: + if delete: + processed_messages = aggregate_report_msg_uids + \ + forensic_report_msg_uids + try: delete_messages(processed_messages) - else: - if len(aggregate_report_msg_uids) > 0: + except (ConnectionResetError, TimeoutError) as error: + logger.debug("IMAP error: {0}".format(error.__str__())) + logger.debug("Reconnecting to IMAP") + server = imapclient.IMAPClient(host, use_uid=True) + server.login(user, password) + server.select_folder(reports_folder) + delete_messages(processed_messages) + else: + if len(aggregate_report_msg_uids) > 0: + try: move_messages(aggregate_report_msg_uids, aggregate_reports_folder) - if len(forensic_report_msg_uids) > 0: + except (ConnectionResetError, TimeoutError) as error: + logger.debug("IMAP error: {0}".format(error.__str__())) + logger.debug("Reconnecting to IMAP") + server = imapclient.IMAPClient(host, use_uid=True) + server.login(user, password) + server.select_folder(reports_folder) + move_messages(aggregate_report_msg_uids, + aggregate_reports_folder) + + if len(forensic_report_msg_uids) > 0: + try: + move_messages(forensic_report_msg_uids, + forensic_reports_folder) + except (ConnectionResetError, TimeoutError) as error: + logger.debug("IMAP error: {0}".format(error.__str__())) + logger.debug("Reconnecting to IMAP") + server = imapclient.IMAPClient(host, use_uid=True) + server.login(user, password) + server.select_folder(reports_folder) move_messages(forensic_report_msg_uids, forensic_reports_folder) diff --git a/setup.py b/setup.py index 9fb63e6..7355edc 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ from setuptools import setup from codecs import open from os import path -__version__ = "4.1.4" +__version__ = "4.1.5" description = "A Python package and CLI for parsing aggregate and " \ "forensic DMARC reports"