• Модуль: 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;
	}
}