This commit is contained in:
oGrzegorZo 2026-03-12 10:29:59 +01:00 committed by GitHub
commit 439da0ac39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -51,45 +51,33 @@ class SearchFiltersPlugin extends \RainLoop\Plugins\AbstractPlugin
$Filters = $aSettings['SFilters']; $Filters = $aSettings['SFilters'];
foreach ($Filters as $filter) { foreach ($Filters as $filter) {
$this->Manager()->logWrite(json_encode([ $this->Manager()->logWrite(json_encode(['filter' => $filter]), LOG_WARNING);
'filter' => $filter,
]), LOG_WARNING);
$folder = 'INBOX';
$searchQ = $filter['searchQ']; $searchQ = $filter['searchQ'];
$uids = $this->searchMessages($oImapClient, $searchQ, "INBOX");
//Mark as read/seen // obsługa keyword (multi-folder)
if ($filter['fSeen']) { if (stripos($searchQ, 'keyword=') !== false) {
foreach ($uids as $uid) { $oMailClient = $this->Manager()->Actions()->MailClient();
$oRange = new MailSo\Imap\SequenceSet([$uid]);
$this->Manager()->Actions()->MailClient()->MessageSetFlag( // Pobieramy wszystkie foldery top-level
$folder, $folders = $oMailClient->Folders('', false, '');
$oRange, foreach ($folders as $f) {
MailSo\Imap\Enumerations\MessageFlag::SEEN $folder = $f->FullName ?? null;
); if (!$folder) continue;
$uids = $this->searchMessages($oImapClient, $searchQ, $folder);
if (!empty($uids)) {
$this->applyActions($oImapClient, $filter, $uids, $folder);
} }
} }
//Flag/Star message continue; // przechodzimy do następnego filtra
if ($filter['fFlag']) {
foreach ($uids as $uid) {
$oRange = new MailSo\Imap\SequenceSet([$uid]);
$this->Manager()->Actions()->MailClient()->MessageSetFlag(
$folder,
$oRange,
MailSo\Imap\Enumerations\MessageFlag::FLAGGED
);
}
} }
// Move to folder // normalny search w INBOX
if ($filter['fFolder']) { $uids = $this->searchMessages($oImapClient, $searchQ, 'INBOX');
$folder = $filter['fFolder']; if (!empty($uids)) {
foreach ($uids as $uid) { $this->applyActions($oImapClient, $filter, $uids, 'INBOX');
$oRange = new MailSo\Imap\SequenceSet([$uid]);
$oImapClient->MessageMove("INBOX", $folder, $oRange);
}
} }
} }
} }
@ -99,10 +87,7 @@ class SearchFiltersPlugin extends \RainLoop\Plugins\AbstractPlugin
string $search, string $search,
string $folder = "INBOX" string $folder = "INBOX"
): array { ): array {
$oParams = new \MailSo\Mail\MessageListParams(); try {
$oParams->sSearch = $search;
$oParams->sFolderName = $folder;
$bUseCache = false; $bUseCache = false;
$oSearchCriterias = \MailSo\Imap\SearchCriterias::fromString( $oSearchCriterias = \MailSo\Imap\SearchCriterias::fromString(
$imapClient, $imapClient,
@ -114,7 +99,57 @@ class SearchFiltersPlugin extends \RainLoop\Plugins\AbstractPlugin
$imapClient->FolderSelect($folder); $imapClient->FolderSelect($folder);
return $imapClient->MessageSearch($oSearchCriterias, true); return $imapClient->MessageSearch($oSearchCriterias, true);
} catch (\Throwable $e) {
$this->Manager()->logWrite(
'SearchFilters IMAP error in folder "' . $folder .
'" for search "' . $search . '": ' . $e->getMessage(),
LOG_ERR
);
return [];
} }
}
private function applyActions(
\MailSo\Imap\ImapClient $imapClient,
array $filter,
array $uids,
string $folder
) {
// Mark as read/seen
if (!empty($filter['fSeen'])) {
foreach ($uids as $uid) {
$oRange = new \MailSo\Imap\SequenceSet([$uid]);
$this->Manager()->Actions()->MailClient()->MessageSetFlag(
$folder,
$oRange,
\MailSo\Imap\Enumerations\MessageFlag::SEEN
);
}
}
// Flag/Star message
if (!empty($filter['fFlag'])) {
foreach ($uids as $uid) {
$oRange = new \MailSo\Imap\SequenceSet([$uid]);
$this->Manager()->Actions()->MailClient()->MessageSetFlag(
$folder,
$oRange,
\MailSo\Imap\Enumerations\MessageFlag::FLAGGED
);
}
}
// Move to folder
if (!empty($filter['fFolder']) && $filter['fFolder'] !== -1) {
foreach ($uids as $uid) {
$oRange = new \MailSo\Imap\SequenceSet([$uid]);
$imapClient->MessageMove('INBOX', $filter['fFolder'], $oRange);
}
}
}
public function GetFilters() public function GetFilters()
{ {
@ -173,7 +208,6 @@ class SearchFiltersPlugin extends \RainLoop\Plugins\AbstractPlugin
} else { } else {
$aSettings['SFilters'][$foundIndex] = $newFilter; $aSettings['SFilters'][$foundIndex] = $newFilter;
} }
return $this->jsonResponse(__FUNCTION__, $this->saveUserSettings($aSettings)); return $this->jsonResponse(__FUNCTION__, $this->saveUserSettings($aSettings));
} }
@ -211,3 +245,4 @@ class SearchFiltersPlugin extends \RainLoop\Plugins\AbstractPlugin
return $this->jsonResponse(__FUNCTION__, $this->saveUserSettings($aSettings)); return $this->jsonResponse(__FUNCTION__, $this->saveUserSettings($aSettings));
} }
} }
?>