diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 822b49598..acb582304 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -307,11 +307,19 @@ export class MessageModel extends AbstractModel { hasFlaggedSubMessage: this.hasFlaggedSubMessage() }, (key, value) => value && classes.push(key)); this.flags().forEach(value => { - '\\' !== value[0] && classes.push('flag-'+value); + '\\' !== value[0] && '$forwarded' !== value && classes.push('flag-'+value); }); return classes.join(' '); } + /** + * @return array + * https://datatracker.ietf.org/doc/html/rfc5788 + */ + keywords() { + return this.flags().filter(value => '\\' !== value[0]); + } + /** * @returns {string} */ diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index d66b06254..e4a9b8cab 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -566,20 +566,20 @@ export class MailMessageView extends AbstractViewRight { readReceipt() { let oMessage = currentMessage() if (oMessage.readReceipt()) { - Remote.request('SendReadReceiptMessage', null, { + Remote.request('SendReadReceiptMessage', iError => { + if (!iError) { + oMessage.flags.push('$mdnsent'); +// oMessage.flags.valueHasMutated(); + MessageFlagsCache.store(oMessage); + MessagelistUserStore.reloadFlagsAndCachedMessage(); + } + }, { MessageFolder: oMessage.folder, MessageUid: oMessage.uid, ReadReceipt: oMessage.readReceipt(), Subject: i18n('READ_RECEIPT/SUBJECT', { SUBJECT: oMessage.subject() }), Text: i18n('READ_RECEIPT/BODY', { 'READ-RECEIPT': AccountUserStore.email() }) }); - - oMessage.flags.push('$mdnsent'); -// oMessage.flags.valueHasMutated(); - - MessageFlagsCache.store(oMessage); - - MessagelistUserStore.reloadFlagsAndCachedMessage(); } } diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php index c2e2c2b69..467938643 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php @@ -18,10 +18,17 @@ namespace MailSo\Imap\Enumerations; */ abstract class MessageFlag { -// const RECENT = '\\Recent'; // IMAP4rev2 deprecated - const SEEN = '\\Seen'; - const DELETED = '\\Deleted'; - const FLAGGED = '\\Flagged'; - const ANSWERED = '\\Answered'; - const DRAFT = '\\Draft'; + const +// RECENT = '\\Recent', // IMAP4rev2 deprecated + SEEN = '\\Seen', + DELETED = '\\Deleted', + FLAGGED = '\\Flagged', + ANSWERED = '\\Answered', + DRAFT = '\\Draft', + // https://datatracker.ietf.org/doc/html/rfc9051#section-2.3.2 + FORWARDED = '$Forwarded', + MDNSENT = '$MDNSent', + JUNK = '$Junk', + NOTJUNK = '$NotJunk', + PHISHING = '$Phishing'; } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php index 83989d264..97f69a264 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Messages.php @@ -187,16 +187,10 @@ trait Messages { case 'reply': case 'reply-all': - $this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), - MessageFlag::ANSWERED); + $this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), MessageFlag::ANSWERED); break; case 'forward': - $sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); - if (\strlen($sForwardedFlag)) - { - $this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), - $sForwardedFlag); - } + $this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), MessageFlag::FORWARDED); break; } } @@ -351,22 +345,18 @@ trait Messages $mResult = true; - $sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); - if (!empty($sReadReceiptFlag)) + $sFolderFullName = $this->GetActionParam('MessageFolder', ''); + $iUid = (int) $this->GetActionParam('MessageUid', 0); + + $this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $iUid), '1'); + + if (\strlen($sFolderFullName) && 0 < $iUid) { - $sFolderFullName = $this->GetActionParam('MessageFolder', ''); - $iUid = (int) $this->GetActionParam('MessageUid', 0); - - $this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $iUid), '1'); - - if (\strlen($sFolderFullName) && 0 < $iUid) + try { - try - { - $this->MailClient()->MessageSetFlag($sFolderFullName, new SequenceSet($iUid), $sReadReceiptFlag, true, true); - } - catch (\Throwable $oException) {} + $this->MailClient()->MessageSetFlag($sFolderFullName, new SequenceSet($iUid), MessageFlag::MDNSENT, true, true); } + catch (\Throwable $oException) {} } } } @@ -523,11 +513,10 @@ trait Messages $sFromFolder = $this->GetActionParam('FromFolder', ''); $sToFolder = $this->GetActionParam('ToFolder', ''); - $bMarkAsRead = !empty($this->GetActionParam('MarkAsRead', '0')); $oUids = new SequenceSet(\explode(',', (string) $this->GetActionParam('Uids', ''))); - if ($bMarkAsRead) + if (!empty($this->GetActionParam('MarkAsRead', '0'))) { try { @@ -539,6 +528,25 @@ trait Messages } } + $sLearning = $this->GetActionParam('Learning', ''); + if ($sLearning) + { + try + { + if ('SPAM' === $sLearning) { + $this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::JUNK); + $this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::NOTJUNK, false); + } else if ('HAM' === $sLearning) { + $this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::NOTJUNK); + $this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::JUNK, false); + } + } + catch (\Throwable $oException) + { + unset($oException); + } + } + try { $this->MailClient()->MessageMove($sFromFolder, $sToFolder, $oUids, diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php index 098664c4c..cbd71f682 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/Response.php @@ -194,10 +194,12 @@ trait Response 'FileName' => (\strlen($sSubject) ? \MailSo\Base\Utils::ClearXss($sSubject) : 'message-'.$mResult['Uid']) . '.eml' )); - $sForwardedFlag = \strtolower($this->Config()->Get('labs', 'imap_forwarded_flag', '')); - $sReadReceiptFlag = \strtolower($this->Config()->Get('labs', 'imap_read_receipt_flag', '')); - \strlen($sForwardedFlag) && \in_array($sForwardedFlag, $mResult['Flags']) && \array_push($mResult['Flags'], '$forwarded'); - \strlen($sReadReceiptFlag) && \in_array($sReadReceiptFlag, $mResult['Flags']) && \array_push($mResult['Flags'], '$mdnsent'); + // https://datatracker.ietf.org/doc/html/rfc5788#section-3.4.1 + $key = \array_search('$readreceipt', $mResult['Flags']); + if (false !== $key) { + $mResult['Flags'][$key] = '$mdnsent'; + } + $mResult['Flags'] = \array_unique($mResult['Flags']); if ('Message' === $sParent) @@ -220,6 +222,7 @@ trait Response if (\strlen($mResult['ReadReceipt']) && !\in_array('$forwarded', $mResult['Flags'])) { + // \in_array('$mdnsent', $mResult['Flags']) if (\strlen($mResult['ReadReceipt'])) { try diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 0209bd3fc..94b0a71ce 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -355,8 +355,6 @@ Enables caching in the system'), 'use_imap_thread' => array(true), 'use_imap_move' => array(false), 'use_imap_expunge_all_on_delete' => array(false), - 'imap_forwarded_flag' => array('$Forwarded'), - 'imap_read_receipt_flag' => array('$ReadReceipt'), 'imap_body_text_limit' => array(555000), 'imap_message_list_fast_simple_search' => array(true), 'imap_message_list_count_limit_trigger' => array(0),