Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions config.example.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/lib/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
)
64 changes: 44 additions & 20 deletions src/lib/idle.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand All @@ -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.

Expand All @@ -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

Expand Down