Your IP : 3.145.89.175
<?php
namespace Bitrix\Mail\MessageView;
use Bitrix\Main;
use Bitrix\Mail\Internals\MailContactTable;
class AvatarManager
{
private $currentUserId;
public function __construct($currentUserId = null)
{
$this->currentUserId = $currentUserId;
}
public function getAvatarParamsFromEmails($messages)
{
return $this->getAvatarParamsFromMessagesHeaders([['FIELD_FROM' => implode(',', $messages)]]);
}
public function getAvatarParamsFromMessagesHeaders($messages)
{
$mailsNames = $this->getEmailsNames($messages);
$mailContacts = $this->fetchMailContacts(array_map(
function ($item)
{
return $item['email'];
},
$mailsNames
));
$mailContacts = array_combine(array_column($mailContacts, 'EMAIL'), array_values($mailContacts));
$mailContacts = $this->fillFileIdColumn($mailContacts);
foreach ($mailsNames as $email => $data)
{
if (!empty($mailContacts[$email]))
{
if ((!$data['name'] || $data['name'] === $data['email']) &&
($mailContacts[$email]['NAME'] && $mailContacts[$email]['NAME'] !== $mailContacts[$email]['EMAIL']))
{
$mailsNames[$email]['name'] = $mailContacts[$email]['NAME'];
}
$mailsNames[$email]['mailContact'] = $mailContacts[$email];
}
else
{
$mailsNames[$email]['mailContact'] = [
'EMAIL' => $data['email'],
'NAME' => $data['name'],
];
}
}
return $mailsNames;
}
private function getEmailsNames($messages)
{
$emailNames = [];
foreach ($messages as $index => $message)
{
$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_FROM']));
$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_TO']));
$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_CC']));
$emailNames = array_merge($emailNames, $this->extractMailsNamesFrom($message['FIELD_BCC']));
}
$emailNames = $this->getBestNameChoices($emailNames);
return $emailNames;
}
private function getBestNameChoices($emailNames)
{
$results = [];
$bestNames = [];
foreach ($emailNames as $index => $data)
{
if (!isset($bestNames[$data['email']]))
{
$bestNames[$data['email']] = $data['name'];
$results[$data['email']] = [
'email' => $data['email'],
'name' => $data['name'],
];
continue;
}
$newName = $data['name'];
$oldName = $bestNames[$data['email']];
if (!$oldName || $oldName == $data['email'])
{
$bestNames[$data['email']] = $newName;
$results[$data['email']] = [
'email' => $data['email'],
'name' => $newName,
];
}
}
return $results;
}
private function extractMailsNamesFrom($parsedListOfEmails)
{
$emailNames = [];
if ($parsedListOfEmails)
{
$mailsCopy = explode(',', $parsedListOfEmails);
foreach ($mailsCopy as $mailCopy)
{
if (trim($mailCopy))
{
$address = new Main\Mail\Address($mailCopy);
if ($address->validate())
{
$emailNames[] = [
'email' => $address->getEmail(),
'name' => $address->getName() ?: $address->getEmail(),
];
}
}
}
}
return $emailNames;
}
private function fillFileIdColumn($mailContacts)
{
foreach ($mailContacts as $mail => $mailContact)
{
if (!empty($mailContacts[$mail]['AVATAR_ID']))
{
$mailContacts[$mail]['FILE_ID'] = $mailContacts[$mail]['AVATAR_ID'];
}
}
return $mailContacts;
}
protected function fetchMailContacts($emails)
{
if (empty($emails))
{
return [];
}
return MailContactTable::query()
->registerRuntimeField('', new Main\Entity\ReferenceField('ref', Main\UserTable::class, ['=this.EMAIL' => 'ref.EMAIL'], ['join_type' => 'LEFT']))
->addSelect('NAME')
->addSelect('EMAIL')
->addSelect('ICON')
->addSelect('FILE_ID')
->addSelect('ref.PERSONAL_PHOTO', 'AVATAR_ID')
->where('USER_ID', $this->currentUserId)
->whereIn('EMAIL', $emails)
->exec()
->fetchAll();
}
}