Fix RFC 9051 IMAP4rev2 keywords and $ReadReceipt should be $MDNSent

This commit is contained in:
the-djmaze 2022-05-31 17:12:29 +02:00
parent eb61563db4
commit 1e61171f9c
6 changed files with 68 additions and 44 deletions

View file

@ -307,11 +307,19 @@ export class MessageModel extends AbstractModel {
hasFlaggedSubMessage: this.hasFlaggedSubMessage() hasFlaggedSubMessage: this.hasFlaggedSubMessage()
}, (key, value) => value && classes.push(key)); }, (key, value) => value && classes.push(key));
this.flags().forEach(value => { this.flags().forEach(value => {
'\\' !== value[0] && classes.push('flag-'+value); '\\' !== value[0] && '$forwarded' !== value && classes.push('flag-'+value);
}); });
return classes.join(' '); return classes.join(' ');
} }
/**
* @return array
* https://datatracker.ietf.org/doc/html/rfc5788
*/
keywords() {
return this.flags().filter(value => '\\' !== value[0]);
}
/** /**
* @returns {string} * @returns {string}
*/ */

View file

@ -566,20 +566,20 @@ export class MailMessageView extends AbstractViewRight {
readReceipt() { readReceipt() {
let oMessage = currentMessage() let oMessage = currentMessage()
if (oMessage.readReceipt()) { 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, MessageFolder: oMessage.folder,
MessageUid: oMessage.uid, MessageUid: oMessage.uid,
ReadReceipt: oMessage.readReceipt(), ReadReceipt: oMessage.readReceipt(),
Subject: i18n('READ_RECEIPT/SUBJECT', { SUBJECT: oMessage.subject() }), Subject: i18n('READ_RECEIPT/SUBJECT', { SUBJECT: oMessage.subject() }),
Text: i18n('READ_RECEIPT/BODY', { 'READ-RECEIPT': AccountUserStore.email() }) Text: i18n('READ_RECEIPT/BODY', { 'READ-RECEIPT': AccountUserStore.email() })
}); });
oMessage.flags.push('$mdnsent');
// oMessage.flags.valueHasMutated();
MessageFlagsCache.store(oMessage);
MessagelistUserStore.reloadFlagsAndCachedMessage();
} }
} }

View file

@ -18,10 +18,17 @@ namespace MailSo\Imap\Enumerations;
*/ */
abstract class MessageFlag abstract class MessageFlag
{ {
// const RECENT = '\\Recent'; // IMAP4rev2 deprecated const
const SEEN = '\\Seen'; // RECENT = '\\Recent', // IMAP4rev2 deprecated
const DELETED = '\\Deleted'; SEEN = '\\Seen',
const FLAGGED = '\\Flagged'; DELETED = '\\Deleted',
const ANSWERED = '\\Answered'; FLAGGED = '\\Flagged',
const DRAFT = '\\Draft'; 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';
} }

View file

@ -187,16 +187,10 @@ trait Messages
{ {
case 'reply': case 'reply':
case 'reply-all': case 'reply-all':
$this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), $this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), MessageFlag::ANSWERED);
MessageFlag::ANSWERED);
break; break;
case 'forward': case 'forward':
$sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', ''); $this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), MessageFlag::FORWARDED);
if (\strlen($sForwardedFlag))
{
$this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid),
$sForwardedFlag);
}
break; break;
} }
} }
@ -351,22 +345,18 @@ trait Messages
$mResult = true; $mResult = true;
$sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', ''); $sFolderFullName = $this->GetActionParam('MessageFolder', '');
if (!empty($sReadReceiptFlag)) $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', ''); try
$iUid = (int) $this->GetActionParam('MessageUid', 0);
$this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $iUid), '1');
if (\strlen($sFolderFullName) && 0 < $iUid)
{ {
try $this->MailClient()->MessageSetFlag($sFolderFullName, new SequenceSet($iUid), MessageFlag::MDNSENT, true, true);
{
$this->MailClient()->MessageSetFlag($sFolderFullName, new SequenceSet($iUid), $sReadReceiptFlag, true, true);
}
catch (\Throwable $oException) {}
} }
catch (\Throwable $oException) {}
} }
} }
} }
@ -523,11 +513,10 @@ trait Messages
$sFromFolder = $this->GetActionParam('FromFolder', ''); $sFromFolder = $this->GetActionParam('FromFolder', '');
$sToFolder = $this->GetActionParam('ToFolder', ''); $sToFolder = $this->GetActionParam('ToFolder', '');
$bMarkAsRead = !empty($this->GetActionParam('MarkAsRead', '0'));
$oUids = new SequenceSet(\explode(',', (string) $this->GetActionParam('Uids', ''))); $oUids = new SequenceSet(\explode(',', (string) $this->GetActionParam('Uids', '')));
if ($bMarkAsRead) if (!empty($this->GetActionParam('MarkAsRead', '0')))
{ {
try 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 try
{ {
$this->MailClient()->MessageMove($sFromFolder, $sToFolder, $oUids, $this->MailClient()->MessageMove($sFromFolder, $sToFolder, $oUids,

View file

@ -194,10 +194,12 @@ trait Response
'FileName' => (\strlen($sSubject) ? \MailSo\Base\Utils::ClearXss($sSubject) : 'message-'.$mResult['Uid']) . '.eml' 'FileName' => (\strlen($sSubject) ? \MailSo\Base\Utils::ClearXss($sSubject) : 'message-'.$mResult['Uid']) . '.eml'
)); ));
$sForwardedFlag = \strtolower($this->Config()->Get('labs', 'imap_forwarded_flag', '')); // https://datatracker.ietf.org/doc/html/rfc5788#section-3.4.1
$sReadReceiptFlag = \strtolower($this->Config()->Get('labs', 'imap_read_receipt_flag', '')); $key = \array_search('$readreceipt', $mResult['Flags']);
\strlen($sForwardedFlag) && \in_array($sForwardedFlag, $mResult['Flags']) && \array_push($mResult['Flags'], '$forwarded'); if (false !== $key) {
\strlen($sReadReceiptFlag) && \in_array($sReadReceiptFlag, $mResult['Flags']) && \array_push($mResult['Flags'], '$mdnsent'); $mResult['Flags'][$key] = '$mdnsent';
}
$mResult['Flags'] = \array_unique($mResult['Flags']); $mResult['Flags'] = \array_unique($mResult['Flags']);
if ('Message' === $sParent) if ('Message' === $sParent)
@ -220,6 +222,7 @@ trait Response
if (\strlen($mResult['ReadReceipt']) && !\in_array('$forwarded', $mResult['Flags'])) if (\strlen($mResult['ReadReceipt']) && !\in_array('$forwarded', $mResult['Flags']))
{ {
// \in_array('$mdnsent', $mResult['Flags'])
if (\strlen($mResult['ReadReceipt'])) if (\strlen($mResult['ReadReceipt']))
{ {
try try

View file

@ -355,8 +355,6 @@ Enables caching in the system'),
'use_imap_thread' => array(true), 'use_imap_thread' => array(true),
'use_imap_move' => array(false), 'use_imap_move' => array(false),
'use_imap_expunge_all_on_delete' => 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_body_text_limit' => array(555000),
'imap_message_list_fast_simple_search' => array(true), 'imap_message_list_fast_simple_search' => array(true),
'imap_message_list_count_limit_trigger' => array(0), 'imap_message_list_count_limit_trigger' => array(0),