- Модуль: mail
- Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox.php
- Класс: BitrixMailHelperMailbox
- Вызов: Mailbox::unregisterMessages
protected function unregisterMessages($filter, $eventData = [], $ignoreDeletionCheck = false)
{
$messageExistInTheOriginalMailbox = false;
$messagesForRemove = [];
$filterForCheck = [];
if(!$ignoreDeletionCheck)
{
$filterForCheck = array_merge(
$filter,
MailMailMessageUidTable::getPresetRemoveFilters(),
[
'=MAILBOX_ID' => $this->mailbox['ID'],
/*
We check illegally deleted messages,
the disappearance of which the user may notice.
According to such data, it is easier to find a message
in the original mailbox for diagnostics.
*/
'!=MESSAGE_ID' => 0,
]
);
$messagesForRemove = MailMailMessageUidTable::getList([
'select' => [
'ID',
'MAILBOX_ID',
'DIR_MD5',
'DIR_UIDV',
'MSG_UID',
'INTERNALDATE',
'IS_SEEN',
'DATE_INSERT',
'MESSAGE_ID',
'IS_OLD',
],
'filter' => $filterForCheck,
'limit' => 100,
])->fetchAll();
if (!empty($messagesForRemove))
{
if (isset($messagesForRemove[0]['DIR_MD5']))
{
$dirMD5 = $messagesForRemove[0]['DIR_MD5'];
$dirPath = $this->getDirsHelper()->getDirPathByHash($dirMD5);
$UIDs = array_map(
function ($item) {
return $item['MSG_UID'];
},
$messagesForRemove
);
$messageExistInTheOriginalMailbox = $this->checkMessagesForExistence($dirPath, $UIDs);
}
}
}
if($messageExistInTheOriginalMailbox === false)
{
return MailMailMessageUidTable::deleteListSoft(
array_merge(
$filter,
[
'=MAILBOX_ID' => $this->mailbox['ID'],
]
)
);
}
else
{
$messageForLog = isset($messagesForRemove[0]) ? $messagesForRemove[0] : [];
/*
For the log, we take a message from the entire sample,
which was definitely deleted by mistake.
*/
foreach($messagesForRemove as $message)
{
if(isset($message['MSG_UID']) && (int)$message['MSG_UID'] === (int)$messageExistInTheOriginalMailbox)
{
$messageForLog = $message;
break;
}
}
if(isset($messageForLog['INTERNALDATE']) && $messageForLog['INTERNALDATE'] instanceof MainTypeDateTime)
{
$messageForLog['INTERNALDATE'] = $messageForLog['INTERNALDATE']->getTimestamp();
}
if(isset($messageForLog['DATE_INSERT']) && $messageForLog['DATE_INSERT'] instanceof MainTypeDateTime)
{
$messageForLog['DATE_INSERT'] = $messageForLog['DATE_INSERT']->getTimestamp();
}
if(isset($filterForCheck['@ID']))
{
$filterForCheck['@ID'] = '[hidden for the log]';
}
AddMessage2Log(array_merge($eventData,[
'filter' => $filterForCheck,
'message-data' => $messageForLog,
]));
return false;
}
}