• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
  • Класс: BitrixMailHelperMailboxImap
  • Вызов: Imap::linkWithExistingMessages
protected function linkWithExistingMessages(&$messages)
{
	$hashes = [];
	$idsForDataBase = [];

	foreach ($messages as $id => $item)
	{
		$hashes[$id] = $item['__fields']['HEADER_MD5'];
		$idsForDataBase[$id] = $item['__fields']['ID'];
	}

	$hashesMap = [];

	foreach ($hashes as $id => $hash)
	{
		if (!array_key_exists($hash, $hashesMap))
		{
			$hashesMap[$hash] = [];
		}

		$hashesMap[$hash][] = $id;
	}

	$existingMessages = $this->searchExistingMessagesByHeaderInDataBase(array_keys($hashesMap));

	/*
		For example, Gmail's labels act like "tags".
		Any individual email message can have multiple labels,
		and thus appear under multiple dirs.
	*/
	while ($item = $existingMessages->fetch())
	{
		foreach ((array)$hashesMap[$item['HEADER_MD5']] as $id)
		{
			$messages[$id]['__created'] = $item['DATE_INSERT'];
			$messages[$id]['__fields']['MESSAGE_ID'] = $item['MESSAGE_ID'];
		}
	}

	$existingMessages = $this->searchExistingMessagesByIdInDataBase($idsForDataBase);

	/*
		To restore messages stored with "broken" directories.
		For example, previously, data for messages in directories containing emojis were stored incorrectly in the database.
	*/
	while ($item = $existingMessages->fetch())
	{
		$id = array_search($item['ID'], $idsForDataBase);
		$messages[$id]['__created'] = $item['DATE_INSERT'];
		$messages[$id]['__fields']['MESSAGE_ID'] = $item['MESSAGE_ID'];
		$messages[$id]['__replaces'] = $item['ID'];
	}
}