• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
  • Класс: BitrixMailHelperMailboxImap
  • Вызов: Imap::syncMessage
protected function syncMessage($dirPath, $message, &$hashesMap = [], $ignoreSyncFrom = false, $isOutgoing = false)
{
	$fields = $message['__fields'];

	if ($fields['MESSAGE_ID'] > 0)
	{
		$hashesMap[$fields['HEADER_MD5']] = $fields['MESSAGE_ID'];
	}
	else
	{
		if (array_key_exists($fields['HEADER_MD5'], $hashesMap) && $hashesMap[$fields['HEADER_MD5']] > 0)
		{
			$fields['MESSAGE_ID'] = $hashesMap[$fields['HEADER_MD5']];
		}
	}

	if (!$this->registerMessage($fields, ($message['__replaces'] ?? null), $isOutgoing))
	{
		return false;
	}

	$minimumSyncDate = $this->getMinimumSyncDate();

	if($minimumSyncDate !== false && !$ignoreSyncFrom && $message['__internaldate']->getTimestamp() < $this->getMinimumSyncDate())
	{
		$this->completeMessageSync($fields['ID']);
		return false;
	}

	if (!empty($message['__created']) && !empty($this->mailbox['OPTIONS']['resync_from']))
	{
		if ($message['__created']->getTimestamp() < $this->mailbox['OPTIONS']['resync_from'])
		{
			$this->completeMessageSync($fields['ID']);
			return false;
		}
	}

	if ($fields['MESSAGE_ID'] > 0)
	{
		$this->completeMessageSync($fields['ID']);
		return true;
	}

	$messageId = 0;

	if (!empty($message['BODYSTRUCTURE']) && !empty($message['BODY[HEADER]']))
	{
		$message['__bodystructure'] = new MailImapBodyStructure($message['BODYSTRUCTURE']);

		$message['__parts'] = $this->downloadMessageParts(
			$message['__fields'],
			$message['__bodystructure'],
			$this->isSupportLazyAttachments() ? self::MESSAGE_PARTS_TEXT : self::MESSAGE_PARTS_ALL
		);

		// #119474
		if (!$message['__bodystructure']->isMultipart())
		{
			if (is_array($message['__parts']) && !empty($message['__parts']['BODY[1]']))
			{
				$message['__parts']['BODY[1.MIME]'] = $message['BODY[HEADER]'];
			}
		}
	}
	else
	{
		// fallback
		$message['__parts'] = $this->downloadMessage($message['__fields']) ?: false;
	}

	if (false !== $message['__parts'])
	{
		$dir = $this->getDirsHelper()->getDirByPath($dirPath);

		$messageId = $this->cacheMessage(
			$message,
			array(
				'timestamp'        => $message['__internaldate']->getTimestamp(),
				'size'             => $message['RFC822.SIZE'],
				'outcome'          => in_array($this->mailbox['EMAIL'], $message['__from']),
				'draft'            => $dir != null && $dir->isDraft() || preg_grep('/^ x5c Draft $/ix', $message['FLAGS']),
				'trash'            => $dir != null && $dir->isTrash(),
				'spam'             => $dir != null && $dir->isSpam(),
				'seen'             => $fields['IS_SEEN'] == 'Y',
				'hash'             => $fields['HEADER_MD5'],
				'lazy_attachments' => $this->isSupportLazyAttachments(),
				'excerpt'          => $fields,
			)
		);
	}

	if ($messageId > 0)
	{
		$hashesMap[$fields['HEADER_MD5']] = $messageId;

		$this->linkMessage($fields['ID'], $messageId);
	}

	$this->completeMessageSync($fields['ID']);

	return $messageId > 0;
}