From 51c11570cdfe9732bd7b6137866bb6f0abab4ac3 Mon Sep 17 00:00:00 2001 From: Golbinex <2061409-Golbinex@users.noreply.gitlab.com> Date: Wed, 7 May 2025 20:55:37 +0200 Subject: [PATCH] add ignoreRecentFlag option --- config.example.ini | 6 +++++ src/lib/config.py | 1 + src/lib/idle.py | 64 +++++++++++++++++++++++++++++++--------------- 3 files changed, 51 insertions(+), 20 deletions(-) diff --git a/config.example.ini b/config.example.ini index cdcc26d..12187a2 100644 --- a/config.example.ini +++ b/config.example.ini @@ -23,6 +23,12 @@ password=test1234 # default: INBOX folder=INBOX +# ignore recent flag on new messages, enable this if the command is not executed when a new message is received +# WARNING: the command will be executed when any message is added to the watched mailbox folder (for example: a deleted message moved back to the watched inbox folder) +# possible values: "true", "false", "1", "0" +# default: false +ignore_recent_flag=false + # whether to use encryption # possible values: "none", "ssl", "starttls" # default: none diff --git a/src/lib/config.py b/src/lib/config.py index a307928..6beb7e1 100644 --- a/src/lib/config.py +++ b/src/lib/config.py @@ -128,4 +128,5 @@ def create_imap_idle_handler( connector=connector, callback=callback, folder=get_imap_folder(config=config, section=section), + ignoreRecentFlag=config.get(section, 'ignore_recent_flag', fallback='0').strip().lower() in ('1', 'true'), ) diff --git a/src/lib/idle.py b/src/lib/idle.py index a798d4d..0635851 100644 --- a/src/lib/idle.py +++ b/src/lib/idle.py @@ -61,11 +61,13 @@ def __init__( connector: ImapConnector, callback: CallbackHandler, folder: str = 'INBOX', + ignoreRecentFlag: bool = False, ): self.__name = name.strip() self.__folder = folder.strip() self.__connector = connector self.__callback = callback + self.__ignoreRecentFlag = ignoreRecentFlag self.__logger = create_logger(self.__name) # Prepare thread. @@ -219,7 +221,7 @@ def __idle_loop(self, client: IMAPClient): return self.__logger.info('Received: %s', str(responses)) - message_nr = self.__get_new_message_number(responses) + message_nr = self.__get_new_message_number(responses, self.__ignoreRecentFlag) if not message_nr: # self.__logger.info('Ignore message.') return @@ -235,7 +237,7 @@ def __idle_loop(self, client: IMAPClient): self.__logger.exception('Callback failed. %s', str(ex)) @staticmethod - def __get_new_message_number(responses) -> int | None: + def __get_new_message_number(responses, ignoreRecentFlag) -> int | None: """ Extracts the message number fron an IDLE server response. @@ -248,28 +250,50 @@ def __get_new_message_number(responses) -> int | None: :return: extracted message number or None, if nothing usable found """ - if not (type(responses) is list): - return None - if len(responses) < 2: - return None - response1 = responses[0] - if not (type(response1) is tuple): - return None - if len(response1) < 2: - return None + if ignoreRecentFlag == False: + if not (type(responses) is list): + return None + if len(responses) < 2: + return None - response2 = responses[1] - if not (type(response2) is tuple): - return None - if len(response2) < 2: - return None + response1 = responses[0] + if not (type(response1) is tuple): + return None + if len(response1) < 2: + return None - if response1[1] == b'EXISTS' and response2[1] == b'RECENT': - return response1[0] + response2 = responses[1] + if not (type(response2) is tuple): + return None + if len(response2) < 2: + return None + + if response1[1] == b'EXISTS' and response2[1] == b'RECENT': + return response1[0] + + if response2[1] == b'EXISTS' and response1[1] == b'RECENT': + return response2[0] + else: + + """ + Trigger the script for new messages that look like + [(275, b'EXISTS'))] + """ + + if not (type(responses) is list): + return None + if len(responses) < 1: + return None + + response1 = responses[0] + if not (type(response1) is tuple): + return None + if len(response1) < 2: + return None - if response2[1] == b'EXISTS' and response1[1] == b'RECENT': - return response2[0] + if response1[1] == b'EXISTS': + return response1[0] return None