• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/mail/mail.php
  • Класс: BitrixMainMailMail
  • Вызов: Mail::filterHeaderEmails
protected function filterHeaderEmails(array &$headers)
{
	if (!$this->useBlacklist || !InternalBlacklistTable::hasBlacklistedEmails())
	{
		return;
	}

	$list = [];
	$allEmails = [mb_strtolower($this->to)];

	// get all emails for query Blacklist, prepare emails as Address instances
	foreach ($headers as $name => $value)
	{
		// exclude non target headers
		if (!in_array(mb_strtolower($name), static::$emailHeaders))
		{
			continue;
		}

		$list[$name] = [];
		$emails = explode(',', $value);
		foreach ($emails as $email)
		{
			$email = trim($email);
			if (!$email)
			{
				continue;
			}

			$address = new Address($email);
			$email = $address->getEmail();
			if ($email)
			{
				$list[$name][] = $address;
				$allEmails[] = $address->getEmail();
			}
		}
	}

	// get blacklisted emails from all emails
	$allEmails = array_diff($allEmails, $this->blacklistCheckedEmails);
	if (!empty($allEmails))
	{
		$blacklisted = InternalBlacklistTable::getList([
			'select' => ['CODE'],
			'filter' => ['=CODE' => $allEmails]
		])->fetchAll();
		$blacklisted = array_column($blacklisted, 'CODE');

		$this->blacklistedEmails = array_unique(array_merge($this->blacklistedEmails, $blacklisted));
		$this->blacklistCheckedEmails = array_merge($this->blacklistCheckedEmails, $allEmails);
	}

	if (empty($this->blacklistedEmails))
	{
		return;
	}

	// remove blacklisted emails, remove empty headers
	$blacklisted = $this->blacklistedEmails;
	foreach ($headers as $name => $value)
	{
		// exclude non target headers
		if (!in_array(mb_strtolower($name), static::$emailHeaders))
		{
			continue;
		}
		// filter Address instances by blacklist
		$emails = array_filter(
			$list[$name],
			function (Address $address) use ($blacklisted)
			{
				$email = $address->getEmail();
				return $email && !in_array($email, $blacklisted);
			}
		);
		// get emails from Address instances
		$emails = array_map(
			function (Address $address)
			{
				return $address->getName() ? $address->get() : $address->getEmail();
			},
			$emails
		);
		// get header emails as string
		$emails = implode(', ', $emails);
		// remove empty or update headers
		if (!$emails)
		{
			unset($headers[$name]);
		}
		else
		{
			$headers[$name] = $emails;
		}
	}
}