• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/mail/sender.php
  • Класс: BitrixMainMailSender
  • Вызов: Sender::prepareUserMailboxes
static function prepareUserMailboxes($userId = null)
{
	global $USER;

	static $mailboxes = array();

	if (!($userId > 0))
	{
		if (is_object($USER) && $USER->isAuthorized())
		{
			$userId = $USER->getId();
		}
	}

	if (!($userId > 0))
	{
		return array();
	}

	if (array_key_exists($userId, $mailboxes))
	{
		return $mailboxes[$userId];
	}

	$mailboxes[$userId] = array();

	if (is_object($USER) && $USER->isAuthorized() && $USER->getId() == $userId)
	{
		$userData = array(
			'ID' => $USER->getId(),
			'TITLE' => $USER->getParam("TITLE"),
			'NAME' => $USER->getFirstName(),
			'SECOND_NAME' => $USER->getSecondName(),
			'LAST_NAME' => $USER->getLastName(),
			'LOGIN' => $USER->getLogin(),
			'EMAIL' => $USER->getEmail(),
		);

		$isAdmin = in_array(1, $USER->getUserGroupArray());
	}
	else
	{
		$userData = MainUserTable::getList(array(
			'select' => array('ID', 'TITLE', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'LOGIN', 'EMAIL'),
			'filter' => array('=ID' => $userId),
		))->fetch();

		$isAdmin = in_array(1, CUser::getUserGroup($userId));
	}

	$userNameFormated = CUser::formatName(CSite::getNameFormat(), $userData, true, false);

	if (CModule::includeModule('mail'))
	{
		foreach (BitrixMailMailboxTable::getUserMailboxes($userId) as $mailbox)
		{
			if (!empty($mailbox['EMAIL']))
			{
				$mailboxName = trim($mailbox['USERNAME']) ?: trim($mailbox['OPTIONS']['name']) ?: $userNameFormated;

				$key = hash('crc32b', mb_strtolower($mailboxName).$mailbox['EMAIL']);
				$mailboxes[$userId][$key] = array(
					'name'  => $mailboxName,
					'email' => $mailbox['EMAIL'],
					'showEditHint' => true,
				);
			}
		}
	}

	// @TODO: query
	$crmAddress = new Address(MainConfigOption::get('crm', 'mail', ''));
	if ($crmAddress->validate())
	{
		$key = hash('crc32b', mb_strtolower($userNameFormated).$crmAddress->getEmail());

		$mailboxes[$userId][$key] = [
			'name'  => $crmAddress->getName() ?: $userNameFormated,
			'email' => $crmAddress->getEmail(),
		];
	}

	$res = SenderTable::getList(array(
		'filter' => array(
			'IS_CONFIRMED' => true,
			array(
				'LOGIC' => 'OR',
				'=USER_ID' => $userId,
				'IS_PUBLIC' => true,
			),
		),
		'order' => array(
			'ID' => 'ASC',
		),
	));
	while ($item = $res->fetch())
	{
		$item['NAME']  = trim($item['NAME']) ?: $userNameFormated;
		$item['EMAIL'] = mb_strtolower($item['EMAIL']);
		$key = hash('crc32b', mb_strtolower($item['NAME']).$item['EMAIL']);

		if (!isset($mailboxes[$userId][$key]))
		{
			$mailboxes[$userId][$key] = [
				'id' => $item['ID'],
				'name' => $item['NAME'],
				'email' => $item['EMAIL'],
				'can_delete' => $userId == $item['USER_ID'] || $item['IS_PUBLIC'] && $isAdmin,
			];
		}
		else if (!isset($mailboxes[$userId][$key]['id']))
		{
			$mailboxes[$userId][$key]['id'] =  $item['ID'];
			$mailboxes[$userId][$key]['can_delete'] =  $userId == $item['USER_ID'] || $item['IS_PUBLIC'] && $isAdmin;
		}
	}

	foreach ($mailboxes[$userId] as $key => $item)
	{
		$mailboxes[$userId][$key]['formated'] = sprintf(
			$item['name'] ? '%s <%s>' : '%s%s',
			$item['name'], $item['email']
		);

		$mailboxes[$userId][$key]['userId'] = $userId;
	}

	$mailboxes[$userId] = array_values($mailboxes[$userId]);

	return $mailboxes[$userId];
}