• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
  • Класс: BitrixMailHelperMailboxImap
  • Вызов: Imap::blacklistMessages
protected function blacklistMessages($dirPath, &$messages)
{
	$trashDir = $this->getDirsHelper()->getTrashPath();
	$spamDir = $this->getDirsHelper()->getSpamPath();

	$targetDir = $spamDir ?: $trashDir ?: null;
	$dir = $this->getDirsHelper()->getDirByPath($dirPath);

	if (empty($targetDir) || ($dir && ($dir->isTrash() || $dir->isSpam())))
	{
		return;
	}

	$blacklist = array(
		'email'  => array(),
		'domain' => array(),
	);

	$blacklistEmails = MailBlacklistTable::query()
		->addSelect('*')
		->setFilter(array(
			'=SITE_ID' => $this->mailbox['LID'],
			array(
				'LOGIC'       => 'OR',
				'=MAILBOX_ID' => $this->mailbox['ID'],
				array(
					'=MAILBOX_ID' => 0,
					'@USER_ID'    => array(0, $this->mailbox['USER_ID']),
				),
			),
		))
		->exec()
		->fetchCollection();
	foreach ($blacklistEmails as $blacklistEmail)
	{
		if ($blacklistEmail->isDomainType())
		{
			$blacklist['domain'][] = $blacklistEmail;
		}
		else
		{
			$blacklist['email'][] = $blacklistEmail;
		}
	}

	if (empty($blacklist['email']) && empty($blacklist['domain']))
	{
		return;
	}

	$targetMessages = [];
	$emailAddresses = array_map(function ($element)
	{
		/** @var MailInternalsEntityBlacklistEmail $element */
		return $element->getItemValue();
	}, $blacklist['email']);
	$domains = array_map(function ($element)
	{
		/** @var MailInternalsEntityBlacklistEmail $element */
		return $element->getItemValue();
	}, $blacklist['domain']);

	foreach ($messages as $id => $item)
	{
		if (!empty($blacklist['email']))
		{
			if (array_intersect($messages[$id]['__from'], $emailAddresses))
			{
				$targetMessages[$id] = $item['UID'];

				continue;
			}
			else
			{
				foreach ($blacklist['email'] as $blacklistMail)
				{
					/** @var MailInternalsEntityBlacklistEmail $blacklistMail */
					if (array_intersect($messages[$id]['__from'], [$blacklistMail->convertDomainToPunycode()]))
					{
						$targetMessages[$id] = $item['UID'];
						continue;
					}
				}
			}
		}

		if (!empty($blacklist['domain']))
		{
			foreach ($messages[$id]['__from'] as $email)
			{
				$domain = mb_substr($email, mb_strrpos($email, '@'));
				if (in_array($domain, $domains))
				{
					$targetMessages[$id] = $item['UID'];

					continue 2;
				}
			}
		}
	}

	if (!empty($targetMessages))
	{
		if ($this->client->moveMails($targetMessages, $dirPath, $targetDir)->isSuccess())
		{
			$messages = array_diff_key($messages, $targetMessages);
		}
	}
}