mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 15:45:55 +08:00
Fix RFC 9051 IMAP4rev2 keywords and $ReadReceipt should be $MDNSent
This commit is contained in:
parent
eb61563db4
commit
1e61171f9c
|
@ -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}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Loading…
Reference in a new issue