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