- Модуль: 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;
}
}
}