From 47e3fc90f22b0d8c413eb5ea0bea4c85d6ece2ad Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Mon, 26 Jun 2023 12:41:47 +0200 Subject: [PATCH] Resolve #1186 --- dev/View/Popup/Domain.js | 2 + snappymail/v/0.0.0/app/domains/default.json | 1 + .../app/libraries/MailSo/Imap/ImapClient.php | 3 ++ .../app/libraries/MailSo/Imap/Settings.php | 3 ++ .../app/libraries/MailSo/Mail/MailClient.php | 44 +++++++++++++------ .../templates/Views/Admin/PopupsDomain.html | 7 +++ 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/dev/View/Popup/Domain.js b/dev/View/Popup/Domain.js index 6e8a261f1..c984ee019 100644 --- a/dev/View/Popup/Domain.js +++ b/dev/View/Popup/Domain.js @@ -35,6 +35,7 @@ const imapDisable_move: false, imapDisable_sort: false, imapDisable_thread: false, + imapDisable_binary: false, imapExpunge_all_on_delete: false, imapFast_simple_search: true, imapFetch_new_messages: true, @@ -84,6 +85,7 @@ const disable_move: !!oDomain.imapDisable_move(), disable_sort: !!oDomain.imapDisable_sort(), disable_thread: !!oDomain.imapDisable_thread(), + disable_binary: !!oDomain.imapDisable_binary(), folder_list_limit: pInt(oDomain.imapFolder_list_limit()), message_list_limit: pInt(oDomain.imapMessage_list_limit()) /* diff --git a/snappymail/v/0.0.0/app/domains/default.json b/snappymail/v/0.0.0/app/domains/default.json index 43a9369e3..b2d2358bd 100644 --- a/snappymail/v/0.0.0/app/domains/default.json +++ b/snappymail/v/0.0.0/app/domains/default.json @@ -27,6 +27,7 @@ "disable_move": false, "disable_sort": false, "disable_thread": false, + "disable_binary": false, "use_expunge_all_on_delete": false, "fast_simple_search": true, "force_select": false, diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php index d95388128..078c91940 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php @@ -317,6 +317,9 @@ class ImapClient extends \MailSo\Net\NetClient if ($this->Settings->disable_list_status) { $aList = \array_diff($aList, ['LIST-STATUS']); } + if ($this->Settings->disable_binary) { + $aList = \array_diff($aList, ['BINARY']); + } if (8 > PHP_INT_SIZE) { $aList = \array_diff($aList, ['CONDSTORE']); } diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php index 218bdb309..c50d3767b 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Settings.php @@ -27,6 +27,7 @@ class Settings extends \MailSo\Net\ConnectSettings $disable_move = false, $disable_sort = false, $disable_thread = false, + $disable_binary = false, $expunge_all_on_delete = false, $fast_simple_search = true, $fetch_new_messages = true, @@ -51,6 +52,7 @@ class Settings extends \MailSo\Net\ConnectSettings 'disable_move', 'disable_sort', 'disable_thread', + 'disable_binary', 'expunge_all_on_delete', 'fast_simple_search', 'fetch_new_messages', @@ -88,6 +90,7 @@ class Settings extends \MailSo\Net\ConnectSettings 'disable_move' => $this->disable_move, 'disable_sort' => $this->disable_sort, 'disable_thread' => $this->disable_thread, + 'disable_binary' => $this->disable_binary, 'use_expunge_all_on_delete' => $this->expunge_all_on_delete, // 'body_text_limit' => $this->body_text_limit, 'fast_simple_search' => $this->fast_simple_search, diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 64f534bf7..ca5d4a67e 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -239,21 +239,37 @@ class MailClient } } - $aFetchResponse = $this->oImapClient->Fetch(array( -// FetchType::BINARY_SIZE.'['.$sMimeIndex.']', - // Push in the aFetchCallbacks array and then called by \MailSo\Imap\Traits\ResponseParser::partialResponseLiteralCallbackCallable - array( - $sPeek.'['.$sMimeIndex.']', - function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncoding, $sContentType, $sFileName) - { - if (\strlen($sLiteralAtomUpperCase) && \is_resource($rImapLiteralStream) && 'FETCH' === $sParent) { - $mCallback($sMailEncoding - ? \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, $sMailEncoding) - : $rImapLiteralStream, - $sContentType, $sFileName, $sMimeIndex); - } + $callback = function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) + use ($mCallback, $sMimeIndex, $sMailEncoding, $sContentType, $sFileName) + { + if (\strlen($sLiteralAtomUpperCase) && \is_resource($rImapLiteralStream) && 'FETCH' === $sParent) { + $mCallback($sMailEncoding + ? \MailSo\Base\StreamWrappers\Binary::CreateStream($rImapLiteralStream, $sMailEncoding) + : $rImapLiteralStream, + $sContentType, $sFileName, $sMimeIndex); } - )), $iIndex, true); + }; + + try { + $aFetchResponse = $this->oImapClient->Fetch(array( +// FetchType::BINARY_SIZE.'['.$sMimeIndex.']', + // Push in the aFetchCallbacks array and then called by \MailSo\Imap\Traits\ResponseParser::partialResponseLiteralCallbackCallable + array( + $sPeek.'['.$sMimeIndex.']', + $callback + )), $iIndex, true); + } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { + if (FetchType::BINARY_PEEK === $sPeek && \preg_match('/UNKNOWN-CTE|PARSE/', $oException->getMessage())) { + $this->logException($oException, \LOG_WARNING); + $aFetchResponse = $this->oImapClient->Fetch(array( + array( + FetchType::BODY_PEEK . '[' . $sMimeIndex . ']', + $callback + )), $iIndex, true); + } else { + throw $e; + } + } return ($aFetchResponse && 1 === \count($aFetchResponse)); } diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html b/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html index 57998244c..bb015038c 100644 --- a/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html +++ b/snappymail/v/0.0.0/app/templates/Views/Admin/PopupsDomain.html @@ -114,6 +114,13 @@ label: 'THREAD' } }"> +