• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
  • Класс: BitrixMailHelperMailboxImap
  • Вызов: Imap::syncMessages
public function syncMessages($mailboxID, $dirPath, $UIDs)
{
	$meta = $this->client->select($dirPath, $error);
	$uidtoken = $meta['uidvalidity'];

	//checking the dir for existence or authentication failed
	if (false === $meta)
	{
		return true;
	}

	$dirsHelper = new MailHelperMailboxDirectoryHelper($mailboxID);

	$dir = $dirsHelper->getDirByPath($dirPath);

	$chunks = array_chunk($UIDs, 10);

	$entity = MailMailMessageUidTable::getEntity();
	$connection = $entity->getConnection();

	foreach ($chunks as $chunk)
	{
		$connection->query(sprintf(
			'DELETE FROM %s WHERE %s',
			MailMailMessageUidTable::getTableName(),
			MainEntityQuery::buildFilterSql(
				$entity,
				[
					'@MSG_UID' => $chunk,
					'=MESSAGE_ID' => 0,
					'=MAILBOX_ID' => $mailboxID,
					'=DIR_MD5'	=>	$dir->getDirMd5()
				]
			)
		));

		$messages = $this->client->fetch(
			true,
			$dirPath,
			join(',', $chunk),
			'(UID FLAGS INTERNALDATE RFC822.SIZE BODYSTRUCTURE BODY.PEEK[HEADER])',
			$error,
			'list'
		);

		if (empty($messages))
		{
			if (false === $messages)
			{
				$this->warnings->add($this->client->getErrors()->toArray());
				return true;
			}
			break;
		}

		$this->parseHeaders($messages);

		$this->blacklistMessages($dir->getPath(), $messages);

		$this->removeExistingMessagesFromSynchronizationList($dir->getPath(), $uidtoken, $messages);

		foreach ($messages as &$message)
		{
			$this->fillMessageFields($message, $dir->getPath(), $uidtoken);
		}

		$this->linkWithExistingMessages($messages);

		foreach ($messages as $item)
		{
			$isOutgoing = false;

			if(empty($item['__replaces']))
			{
				$outgoingMessageId = $this->selectOutgoingMessageIdFromHeader($item);

				if($outgoingMessageId)
				{
					$item['__replaces'] = $outgoingMessageId;
					$isOutgoing = true;
				}
			}

			$hashesMap = [];
			$this->syncMessage($dir->getPath(), $item, $hashesMap, true, $isOutgoing);

			if ($this->isTimeQuotaExceeded())
			{
				return false;
			}
		}

	}
	return true;
}