Your IP : 13.59.201.169


Current Path : /home/bitrix/ext_www/ballu.in.ua/bitrix/components/bitrix/mail.client.message.view/
Upload File :
Current File : /home/bitrix/ext_www/ballu.in.ua/bitrix/components/bitrix/mail.client.message.view/class.php

<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

use Bitrix\Mail\Helper\MessageFolder;
use Bitrix\Main;
use Bitrix\Main\Localization\Loc;
use Bitrix\Mail;
use Bitrix\Mail\Helper\Mailbox\Imap;
use Bitrix\Mail\Internals\MailContactTable;

Loc::loadMessages(__DIR__ . '/../mail.client/class.php');

Main\Loader::includeModule('mail');

class CMailClientMessageViewComponent extends CBitrixComponent implements \Bitrix\Main\Engine\Contract\Controllerable, Main\Errorable
{
	/** @var Main\ErrorCollection */
	private $errorCollection;

	/** @var bool */
	private $isCrmEnable = false;

	/**
	 * @return array
	 */
	public function configureActions()
	{
		$this->errorCollection = new Main\ErrorCollection();

		return array();
	}

	/**
	 * @return mixed|void
	 * @throws Main\ArgumentException
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	public function executeComponent()
	{
		global $USER, $APPLICATION;

		$APPLICATION->setTitle(Loc::getMessage('MAIL_CLIENT_HOME_TITLE'));

		if (!is_object($USER) || !$USER->isAuthorized())
		{
			$APPLICATION->authForm('');
			return;
		}

		$this->isCrmEnable = Main\Loader::includeModule('crm') && \CCrmPerms::isAccessEnabled();
		$this->arResult['CRM_ENABLE'] = ($this->isCrmEnable ? 'Y' : 'N');

		$pageSize = (int) $this->arParams['PAGE_SIZE'];
		if ($pageSize < 1 || $pageSize > 100)
		{
			$this->arParams['PAGE_SIZE'] = ($pageSize = 5);
		}

		$message = Mail\MailMessageTable::getList(array(
			'runtime' => array(
				new Main\Entity\ReferenceField(
					'MESSAGE_UID',
					'Bitrix\Mail\MailMessageUidTable',
					array(
						'=this.MAILBOX_ID' => 'ref.MAILBOX_ID',
						'=this.ID'         => 'ref.MESSAGE_ID',
					),
					array(
						'join_type' => 'INNER',
					)
				),
				new Main\Entity\ReferenceField(
					'MESSAGE_ACCESS',
					Mail\Internals\MessageAccessTable::class,
					array(
						'=this.MAILBOX_ID' => 'ref.MAILBOX_ID',
						'=this.ID' => 'ref.MESSAGE_ID',
					)
				),
			),
			'select' => array(
				'*',
				'UID' => 'MESSAGE_UID.ID',
				'DIR_MD5' => 'MESSAGE_UID.DIR_MD5',
				'MSG_UID' => 'MESSAGE_UID.MSG_UID',
				'MAILBOX_EMAIL' => 'MAILBOX.EMAIL',
				'MAILBOX_NAME' => 'MAILBOX.NAME',
				'MAILBOX_OPTIONS' => 'MAILBOX.OPTIONS',
				'MAILBOX_LOGIN' => 'MAILBOX.LOGIN',
				'IS_SEEN' => 'MESSAGE_UID.IS_SEEN',
				new \Bitrix\Main\Entity\ExpressionField(
					'BIND',
					'GROUP_CONCAT(DISTINCT %s)',
					'MESSAGE_ACCESS.ENTITY_TYPE'
				),
			),
			'filter' => array(
				'=ID' => $this->arParams['VARIABLES']['id'],
			),
			'group' => array('ID'),
		))->fetch();

		if (empty($message))
		{
			showError(Loc::getMessage('MAIL_CLIENT_ELEMENT_NOT_FOUND'));
			return;
		}

		if (!Mail\Helper\Message::hasAccess($message))
		{
			showError(Loc::getMessage('MAIL_CLIENT_ELEMENT_DENIED'));
			return;
		}

		$message['BIND'] = explode(',', $message['BIND']);

		$message['__files'] = Mail\Internals\MailMessageAttachmentTable::getList(array(
			'select' => array(
				'ID', 'FILE_ID', 'FILE_NAME', 'FILE_SIZE', 'CONTENT_TYPE',
			),
			'filter' => array(
				'=MESSAGE_ID' => $message['ID'],
			),
		))->fetchAll();

		$this->prepareMessage($message);
		$message['SENDER_EMAIL'] = $this->getEmailFromFieldFrom($message['FIELD_FROM']);
		$this->arResult['MESSAGE'] = $message;

		$this->arResult['LAST_RCPT'] = $this->loadLastRcpt();
		$this->arResult['EMAILS'] = $this->loadMailContacts();
		$this->arResult['CRM_EMAILS'] = $this->loadCrmMailContacts();

		$this->arResult['LOG'] = array(
			'A' => array(),
			'B' => array(),
		);

		$res = Mail\MailMessageTable::getList(array(
			'runtime' => array(
				new Main\Entity\ReferenceField(
					'CLOSURE',
					Mail\Internals\MessageClosureTable::class,
					array(
						'=this.ID' => 'ref.MESSAGE_ID',
					)
				),
			),
			'select' => array(
				'ID', 'MAILBOX_ID',
				'FIELD_DATE', 'SUBJECT',
				'FIELD_FROM', 'FIELD_REPLY_TO',
				'FIELD_TO', 'FIELD_CC', 'FIELD_BCC',
				'ATTACHMENTS',
				'OPTIONS', 'READ_CONFIRMED'
			),
			'filter' => array(
				'=MAILBOX_ID' => $message['MAILBOX_ID'],
				'=CLOSURE.PARENT_ID' => $message['ID'],
			),
			'order' => array(
				'FIELD_DATE' => 'ASC',
			),
			'offset' => 1,
			'limit' => $pageSize,
		));

		while ($item = $res->fetch())
		{
			$item['MAILBOX_EMAIL'] = $message['MAILBOX_EMAIL'];
			$item['MAILBOX_NAME'] = $message['MAILBOX_NAME'];
			$item['MAILBOX_LOGIN'] = $message['MAILBOX_LOGIN'];

			$item = $this->prepareMessage($item);
			$item['SENDER_EMAIL'] = $this->getEmailFromFieldFrom($item['FIELD_FROM']);

			$item['__log'] = 'A';

			$this->arResult['LOG']['A'][] = $item;
		}

		$this->arResult['LOG']['A'] = array_reverse($this->arResult['LOG']['A']);

		if ($message['__access_level'] == 'full')
		{
			$res = \Bitrix\Mail\MailMessageTable::getList(array(
				'runtime' => array(
					new Main\Entity\ReferenceField(
						'CLOSURE',
						Mail\Internals\MessageClosureTable::class,
						array(
							'=this.ID' => 'ref.PARENT_ID',
						)
					),
				),
				'select' => array(
					'ID', 'MAILBOX_ID',
					'FIELD_DATE', 'SUBJECT',
					'FIELD_FROM', 'FIELD_REPLY_TO',
					'FIELD_TO', 'FIELD_CC', 'FIELD_BCC',
					'ATTACHMENTS',
					'OPTIONS', 'READ_CONFIRMED'
				),
				'filter' => array(
					'=MAILBOX_ID' => $message['MAILBOX_ID'],
					'=CLOSURE.MESSAGE_ID' => $message['ID'],
				),
				'order' => array(
					'FIELD_DATE' => 'DESC',
				),
				'offset' => 1,
				'limit' => $pageSize,
			));

			while ($item = $res->fetch())
			{
				$item['MAILBOX_EMAIL'] = $message['MAILBOX_EMAIL'];
				$item['MAILBOX_NAME'] = $message['MAILBOX_NAME'];
				$item['MAILBOX_LOGIN'] = $message['MAILBOX_LOGIN'];

				$item = $this->prepareMessage($item);
				$item['SENDER_EMAIL'] = $this->getEmailFromFieldFrom($item['FIELD_FROM']);

				$item['__log'] = 'B';

				$this->arResult['LOG']['B'][] = $item;
			}
		}

		if ($message['MSG_UID'] && !in_array($message['IS_SEEN'], array('Y', 'S')))
		{
			$mailMarkerManager = new \Bitrix\Mail\ImapCommands\MailsFlagsManager($message['MAILBOX_ID'], $message['UID']);
			$mailMarkerManager->setMessages([$message]);
			$mailMarkerManager->markMailsSeen();
		}

		$this->prepareUser();
		$this->arResult['avatarParams'] = $this->getAvatarParams(array_merge(
			$this->arResult['LOG']['B'],
			$this->arResult['LOG']['A'],
			[$this->arResult['MESSAGE']]
		));
		$APPLICATION->setTitle($message['SUBJECT']);
		$this->arResult['MESSAGE_UID_KEY'] = $message['UID'] . '-' . $message['MAILBOX_ID'];

		$this->includeComponentTemplate();
	}

	/**
	 * @param $id
	 * @param $log
	 * @param $size
	 *
	 * @return array|void
	 *
	 * @throws Main\ArgumentException
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	public function logAction($id, $log, $size)
	{
		if (!$id)
		{
			$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_AJAX_ERROR'));
			return;
		}

		if (!empty($log) && preg_match('/([ab])(\d+)/i', $log, $matches))
		{
			$type = strtoupper($matches[1]);
			$offset = (int) $matches[2];
		}
		else
		{
			$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_AJAX_ERROR'));
			return;
		}

		$message = Mail\MailMessageTable::getList(array(
			'select' => array(
				'ID', 'MAILBOX_ID',
				'MAILBOX_EMAIL' => 'MAILBOX.EMAIL',
				'MAILBOX_NAME' => 'MAILBOX.NAME',
				'MAILBOX_LOGIN' => 'MAILBOX.LOGIN',
			),
			'filter' => array(
				'=ID' => $id,
			),
		))->fetch();

		if (empty($message))
		{
			$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_AJAX_ERROR'));
			return;
		}

		if (!Mail\Helper\Message::hasAccess($message))
		{
			$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_ELEMENT_DENIED'));
			return;
		}

		if ('A' == $type)
		{
			$res = Mail\MailMessageTable::getList(array(
				'runtime' => array(
					new Main\Entity\ReferenceField(
						'CLOSURE',
						Mail\Internals\MessageClosureTable::class,
						array(
							'=this.ID' => 'ref.MESSAGE_ID',
						)
					),
				),
				'select' => array(
					'ID', 'MAILBOX_ID',
					'FIELD_DATE', 'SUBJECT',
					'FIELD_FROM', 'FIELD_REPLY_TO',
					'FIELD_TO', 'FIELD_CC', 'FIELD_BCC',
					'ATTACHMENTS',
					'OPTIONS', 'READ_CONFIRMED'
				),
				'filter' => array(
					'=MAILBOX_ID' => $message['MAILBOX_ID'],
					'=CLOSURE.PARENT_ID' => $message['ID'],
				),
				'order' => array(
					'FIELD_DATE' => 'ASC',
				),
				'offset' => $offset + 1,
				'limit' => $size > 0 ? $size : 5,
			));
		}
		else
		{
			if ($message['__access_level'] != 'full')
			{
				$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_ELEMENT_DENIED'));
				return;
			}

			$res = \Bitrix\Mail\MailMessageTable::getList(array(
				'runtime' => array(
					new Main\Entity\ReferenceField(
						'CLOSURE',
						Mail\Internals\MessageClosureTable::class,
						array(
							'=this.ID' => 'ref.PARENT_ID',
						)
					),
				),
				'select' => array(
					'ID', 'MAILBOX_ID',
					'FIELD_DATE', 'SUBJECT',
					'FIELD_FROM', 'FIELD_REPLY_TO',
					'FIELD_TO', 'FIELD_CC', 'FIELD_BCC',
					'ATTACHMENTS',
					'OPTIONS', 'READ_CONFIRMED'
				),
				'filter' => array(
					'=MAILBOX_ID' => $message['MAILBOX_ID'],
					'=CLOSURE.MESSAGE_ID' => $message['ID'],
				),
				'order' => array(
					'FIELD_DATE' => 'DESC',
				),
				'offset' => $offset + 1,
				'limit' => $size > 0 ? $size : 5,
			));
		}

		$log = array();
		while ($item = $res->fetch())
		{
			$item['MAILBOX_EMAIL'] = $message['MAILBOX_EMAIL'];
			$item['MAILBOX_NAME'] = $message['MAILBOX_NAME'];
			$item['MAILBOX_LOGIN'] = $message['MAILBOX_LOGIN'];

			$item = $this->prepareMessage($item);
			$item['SENDER_EMAIL'] = $this->getEmailFromFieldFrom($item['FIELD_FROM']);

			$item['__log'] = $type;

			$log[] = $item;
		}

		if (!empty($log))
		{
			if ('A' == $type)
			{
				$log = array_reverse($log);
			}

			$this->arResult['LOG'] = $log;
			$this->arResult['avatarParams'] = $this->getAvatarParams($log);
			ob_start();

			$this->includeComponentTemplate('log');

			return array(
				'html' => ob_get_clean(),
				'count' => count($log),
			);
		}

		return array(
			'html' => '',
			'count' => 0,
		);
	}

	/**
	 * @param $messages
	 *
	 * @return array
	 */
	private function getAvatarParams($messages)
	{
		$params = (new Mail\MessageView\AvatarManager(Main\Engine\CurrentUser::get()->getId()))
			->getAvatarParamsFromMessagesHeaders($messages);
		foreach ($params as $email => $data)
		{
			$params[$email]['avatarSize'] = 23;
		}
		return $params;
	}

	/**
	 * @param $id
	 *
	 * @return string|void
	 * @throws Main\ArgumentException
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	public function logitemAction($id)
	{
		$this->isCrmEnable = Main\Loader::includeModule('crm');
		$this->arResult['CRM_ENABLE'] = ($this->isCrmEnable ? 'Y' : 'N');

		$message = Mail\MailMessageTable::getList(array(
			'runtime' => array(
				new Main\Entity\ReferenceField(
					'MESSAGE_ACCESS',
					Mail\Internals\MessageAccessTable::class,
					array(
						'=this.MAILBOX_ID' => 'ref.MAILBOX_ID',
						'=this.ID' => 'ref.MESSAGE_ID',
					)
				),
			),
			'select' => array(
				'*',
				'MAILBOX_EMAIL' => 'MAILBOX.EMAIL',
				'MAILBOX_NAME' => 'MAILBOX.NAME',
				'MAILBOX_LOGIN' => 'MAILBOX.LOGIN',
				new \Bitrix\Main\Entity\ExpressionField(
					'BIND',
					'GROUP_CONCAT(DISTINCT %s)',
					'MESSAGE_ACCESS.ENTITY_TYPE'
				),
			),
			'filter' => array(
				'=ID' => $id,
			),
		))->fetch();

		if (empty($message))
		{
			$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_ELEMENT_NOT_FOUND'));
			return;
		}

		if (!Mail\Helper\Message::hasAccess($message))
		{
			$this->errorCollection[] = new Main\Error(Loc::getMessage('MAIL_CLIENT_ELEMENT_DENIED'));
			return;
		}

		$message['BIND'] = explode(',', $message['BIND']);

		$message['__files'] = Mail\Internals\MailMessageAttachmentTable::getList(array(
			'select' => array(
				'ID', 'FILE_ID', 'FILE_NAME', 'FILE_SIZE', 'CONTENT_TYPE',
			),
			'filter' => array(
				'=MESSAGE_ID' => $message['ID'],
			),
		))->fetchAll();

		$this->prepareMessage($message);
		$message['SENDER_EMAIL'] = $this->getEmailFromFieldFrom($message['FIELD_FROM']);
		$this->arResult['MESSAGE'] = $message;
		$this->prepareUser();

		$this->arResult['LAST_RCPT'] = $this->loadLastRcpt();
		$this->arResult['EMAILS'] = $this->loadMailContacts();
		$this->arResult['CRM_EMAILS'] = $this->loadCrmMailContacts();

		$this->arParams['LOADED_FROM_LOG'] = true;
		$this->arResult['avatarParams'] = $this->getAvatarParams([$this->arResult['MESSAGE']]);
		ob_start();

		$this->includeComponentTemplate('logitem');

		return ob_get_clean();
	}

	/**
	 * @return void
	 * @throws Main\ArgumentException
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	protected function prepareUser()
	{
		global $USER, $APPLICATION;

		$userFields = \Bitrix\Main\UserTable::getList(array(
			'select' => array('ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'LOGIN', 'PERSONAL_PHOTO'),
			'filter' => array('=ID' => $USER->getId()),
		))->fetch();

		$userImage = \CFile::resizeImageGet(
			$userFields['PERSONAL_PHOTO'], array('width' => 38, 'height' => 38),
			BX_RESIZE_IMAGE_EXACT, false
		);

		$this->arResult['USER_IMAGE'] = !empty($userImage['src']) ? $userImage['src'] : '';
	}

	/**
	 * @param $message
	 *
	 * @return mixed
	 */
	protected function prepareMessage(&$message)
	{
		$message['isSpam'] = MessageFolder::getFolderHashByType(MessageFolder::SPAM, $message['MAILBOX_OPTIONS']) === $message['DIR_MD5'];
		$message['isTrash'] = MessageFolder::getFolderHashByType(MessageFolder::TRASH, $message['MAILBOX_OPTIONS']) === $message['DIR_MD5'];

		if($message['OPTIONS']['trackable'] === true && !$message['READ_CONFIRMED'])
		{
			if(Main\Loader::includeModule('pull'))
			{
				\CPullWatch::Add(Main\Engine\CurrentUser::get()->getId(), Mail\Helper\MessageEventManager::getPullTagName($message['ID']), true);
			}
		}

		return \Bitrix\Mail\Helper\Message::prepare($message);
	}

	/**
	 * @param $messageField
	 *
	 * @return string
	 */
	private function getEmailFromFieldFrom($messageField)
	{
		$address = new Main\Mail\Address($messageField);
		return trim($address->getEmail());
	}


	/**
	 * Load last used Rcpt
	 *
	 * @return array
	 *
	 * @throws Main\ArgumentException
	 * @throws Main\ObjectPropertyException
	 * @throws Main\SystemException
	 */
	private function loadLastRcpt()
	{
		global $APPLICATION;

		$currentUser = \Bitrix\Main\Engine\CurrentUser::get();

		$result = array();

		$lastRcptResult = \Bitrix\Main\FinderDestTable::getList(array(
			'filter' => array(
				'=USER_ID' => $currentUser->getId(),
				'=CONTEXT' => 'MAIL_LAST_RCPT',
			),
			'select' => array('CODE'),
			'order' => array('LAST_USE_DATE' => 'DESC'),
			'limit' => 10,
		));

		$emailUsersIds = array();
		while ($item = $lastRcptResult->fetch())
		{
			$emailUsersIds[] = (int) str_replace('MC', '', $item['CODE']);
		}
		if (count($emailUsersIds) > 0)
		{
			$mailContacts = \Bitrix\Mail\Internals\MailContactTable::getList([
				'filter' => array(
					'@ID' => $emailUsersIds,
					'=USER_ID' => $currentUser->getId(),
				),
				'select' => ['ID', 'NAME', 'EMAIL', 'ICON'],
				'limit' => 10,
			])->fetchAll();

			$contactAvatars = $resultsMailContacts = [];
			foreach ($mailContacts as $mailContact)
			{
				$resultsMailContacts[$mailContact['EMAIL']] = $mailContact;
			}
			foreach ($resultsMailContacts as $mailContact)
			{
				$email = $mailContact['EMAIL'];
				if ($contactAvatars[$email] === null)
				{
					ob_start();
					$APPLICATION->IncludeComponent('bitrix:mail.contact.avatar', '', array(
						'mailContact' => $mailContact,
					));
					$contactAvatars[$email] = ob_get_clean();
				}
				$id = $this->buildUniqueEmailCode($email);
				$result[$id] = [
					'id' => $id,
					'entityType' => 'email',
					'entityId' => $mailContact['ID'],
					'name' => htmlspecialcharsbx($mailContact['NAME']),
					'iconCustom' => $contactAvatars[$email],
					'email' => htmlspecialcharsbx($mailContact['EMAIL']),
					'desc' => htmlspecialcharsbx($mailContact['EMAIL']),
					'isEmail' => 'Y',
				];
			}
		}

		return $result;
	}


	/**
	 * Load mail contacts from the address book.
	 *
	 * @return array
	 *
	 * @throws Main\SystemException
	 */
	private function loadMailContacts()
	{
		global $APPLICATION;

		$result = array();
		return $result;

		$currentUser = \Bitrix\Main\Engine\CurrentUser::get();

		$mailContacts = \Bitrix\Mail\Internals\MailContactTable::getList([
			'order' => [
				'NAME' => 'ASC',
				'EMAIL' => 'ASC',
			],
			'filter' => [
				'=USER_ID', $currentUser->getId()
			],
			'select' => ['ID', 'NAME', 'EMAIL', 'ICON'],
			'limit' => 20,
		])->fetchAll();

		$contactAvatars = $resultsMailContacts = [];
		foreach ($mailContacts as $mailContact)
		{
			$resultsMailContacts[$mailContact['EMAIL']] = $mailContact;
		}
		foreach ($resultsMailContacts as $mailContact)
		{
			$email = $mailContact['EMAIL'];
			if ($contactAvatars[$email] === null)
			{
				ob_start();
				$APPLICATION->IncludeComponent('bitrix:mail.contact.avatar', '',
					[
						'mailContact' => $mailContact,
					]);
				$contactAvatars[$email] = ob_get_clean();
			}
			$id = $this->buildUniqueEmailCode($email);
			$result[$id] = [
				'id' => $id,
				'entityType' => 'mailContacts',
				'entityId' => $mailContact['ID'],
				'name' => htmlspecialcharsbx($mailContact['NAME']),
				'iconCustom' => $contactAvatars[$email],
				'email' => htmlspecialcharsbx($mailContact['EMAIL']),
				'desc' => htmlspecialcharsbx($mailContact['EMAIL']),
				'isEmail' => 'Y',
			];
		}

		return $result;
	}

	/**
	 * Load mail contacts from CRM.
	 *
	 * @return array
	 *
	 * @throws Main\SystemException
	 */
	private function loadCrmMailContacts()
	{
		$result = array();
		return $result;

		if ($this->isCrmEnable)
		{
			$crmCommunications = \CSocNetLogDestination::SearchCrmEntities(array(
				'SEARCH' => '%',
				'ONLY_WITH_EMAIL' => true,
			));
			foreach ($crmCommunications as $communication)
			{
				$email = $communication['email'];
				if (empty($email))
				{
					continue;
				}
				$id = $this->buildUniqueEmailCode($email);
				$communication['id'] = $id;
				$result[$id] = $communication;
			}
		}

		return $result;
	}

	/**
	 * @param $email
	 *
	 * @return string
	 */
	private function buildUniqueEmailCode($email)
	{
		return 'U' . md5($email);
	}
	/**
	 * Getting array of errors.
	 * @return Error[]
	 */
	final public function getErrors()
	{
		return $this->errorCollection->toArray();
	}

	/**
	 * Getting once error with the necessary code.
	 * @param string $code Code of error.
	 * @return Error
	 */
	final public function getErrorByCode($code)
	{
		return $this->errorCollection->getErrorByCode($code);
	}
}