• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
  • Класс: BitrixMailHelperMailboxImap
  • Вызов: Imap::resyncMessages
protected function resyncMessages($dirPath, $uidtoken, &$messages)
{
	$excerpt = array();

	$range = array(
		reset($messages)['UID'],
		end($messages)['UID'],
	);
	sort($range);

	$result = $this->listMessages(array(
		'select' => array('ID', 'MESSAGE_ID', 'IS_SEEN'),
		'filter' => array(
			'=DIR_MD5'  => md5($dirPath),
			'=DIR_UIDV' => $uidtoken,
			'>=MSG_UID' => $range[0],
			'<=MSG_UID' => $range[1],
		),
	), false);

	while ($item = $result->fetch())
	{
		$item['MAILBOX_USER_ID'] = $this->mailbox['USER_ID'];
		$excerpt[$item['ID']] = $item;
	}

	$update = array(
		'Y' => array(),
		'N' => array(),
		'S' => array(),
		'U' => array(),
	);
	foreach ($messages as $id => $item)
	{
		$messageUid = md5(sprintf('%s:%u:%u', $dirPath, $uidtoken, $item['UID']));

		if (array_key_exists($messageUid, $excerpt))
		{
			$excerptSeen = $excerpt[$messageUid]['IS_SEEN'];
			$excerptSeenYN = in_array($excerptSeen, array('Y', 'S')) ? 'Y' : 'N';
			$messageSeen = preg_grep('/^ x5c Seen $/ix', $item['FLAGS']) ? 'Y' : 'N';

			if ($messageSeen != $excerptSeen)
			{
				if (in_array($excerptSeen, array('S', 'U')))
				{
					$excerpt[$messageUid]['IS_SEEN'] = $excerptSeenYN;
					$update[$excerptSeenYN][$messageUid] = $excerpt[$messageUid];

					if ($messageSeen != $excerptSeenYN)
					{
						$update[$excerptSeen][] = $item['UID'];
					}
				}
				else
				{
					$excerpt[$messageUid]['IS_SEEN'] = $messageSeen;
					$update[$messageSeen][$messageUid] = $excerpt[$messageUid];
				}
			}

			unset($excerpt[$messageUid]);
		}
		else
		{
			/*
			addMessage2Log(
				sprintf(
					'IMAP: message lost (%u:%s:%u:%s)',
					$this->mailbox['ID'], $dirPath, $uidtoken, $item['UID']
				),
				'mail', 0, false
			);
			*/
		}
	}

	$countUpdated = 0;
	$countDeleted = count($excerpt);

	foreach ($update as $seen => $items)
	{
		if (!empty($items))
		{
			if (in_array($seen, array('S', 'U')))
			{
				$method = 'S' == $seen ? 'seen' : 'unseen';
				$this->client->$method($items, $dirPath);
			}
			else
			{
				$countUpdated += count($items);

				$this->updateMessagesRegistry(
					array(
						'@ID' => array_keys($items),
					),
					array(
						'IS_SEEN' => $seen,
					),
					$items = array() // @TODO: fix lazyload in MessageEventManager::processOnMailMessageModified()
				);
			}
		}
	}

	if (!empty($excerpt))
	{
		$result = $this->unregisterMessages(
			[
				'@ID' => array_keys($excerpt),
				'=DIR_MD5'  => md5($dirPath),
			],
			[
				'info' => 'deletion of non-existent messages',
			]
		);

		$countDeleted += $result ? $result->getCount() : 0;
	}

	$this->lastSyncResult['updatedMessages'] += $countUpdated;
	$this->lastSyncResult['deletedMessages'] += $countDeleted;
}