• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_mail.php
  • Класс: CIMMail
  • Вызов: CIMMail::MailMessageAgent
static function MailMessageAgent()
{
	global $DB;

	$defSiteID = CSite::GetDefSite();

	$arMark = array();
	$arUnsendMessage = CIMMessage::GetUnsendMessage();

	$arToUser = Array();
	$arFromUser = Array();
	$arDialog = Array();
	$parser = new CTextParser();
	$maxId = 0;

	foreach($arUnsendMessage as $id => $arMessage)
	{
		$maxId = ((int)$id > $maxId) ? (int)$id : $maxId;
		if (!isset($arMark[$arMessage["TO_USER_ID"]][$arMessage["CHAT_ID"]]) || $arMark[$arMessage["TO_USER_ID"]][$arMessage["CHAT_ID"]] < $arMessage["ID"])
			$arMark[$arMessage["TO_USER_ID"]][$arMessage["CHAT_ID"]] = $arMessage["ID"];

		if ($arMessage['TO_EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID || $arMessage['TO_EXTERNAL_AUTH_ID'] == "network")
		{
			unset($arUnsendMessage[$id]);
			continue;
		}

		if ($arMessage['TO_USER_ACTIVE'] != 'Y')
		{
			unset($arUnsendMessage[$id]);
			continue;
		}

		if (!CIMSettings::GetNotifyAccess($arMessage["TO_USER_ID"], 'im', 'message', CIMSettings::CLIENT_MAIL))
		{
			unset($arUnsendMessage[$id]);
			continue;
		}

		if ($arMessage["MESSAGE_OUT"] == IM_MAIL_SKIP)
		{
			unset($arUnsendMessage[$id]);
			continue;
		}

		if ($arMessage["MESSAGE_OUT"] == '')
			$arMessage["MESSAGE_OUT"] = $arMessage["MESSAGE"];

		if (!isset($arToUser[$arMessage["TO_USER_ID"]]))
		{
			$siteID = $arMessage["TO_USER_LID"];
			if ($siteID == false || $siteID == '')
			{
				$siteID = $defSiteID;
				if ($siteID == false || $siteID == '')
					continue;
			}

			$arNotify["USER"] = BitrixImUser::formatFullNameFromDatabase(array(
				"NAME" => $arMessage["TO_USER_NAME"],
				"LAST_NAME" => $arMessage["TO_USER_LAST_NAME"],
				"SECOND_NAME" => $arMessage["TO_USER_SECOND_NAME"] ?? null,
				"LOGIN" => $arMessage["TO_USER_LOGIN"],
				"EXTERNAL_AUTH_ID" => $arMessage["TO_EXTERNAL_AUTH_ID"],
			));

			$arToUser[$arMessage["TO_USER_ID"]] = Array(
				"USER" => $arMessage['USER'] ?? null,
				"USER_ID" => $arMessage["TO_USER_ID"],
				"USER_LOGIN" => $arMessage["TO_USER_LOGIN"],
				"USER_NAME" => $arMessage["TO_USER_NAME"],
				"USER_LAST_NAME" => $arMessage["TO_USER_LAST_NAME"],
				"USER_SECOND_NAME" => $arMessage["TO_USER_SECOND_NAME"] ?? null,
				"TO_USER_LID" => $siteID,
				"EMAIL_TO" => $arMessage["TO_USER_EMAIL"],
			);
		}
		if (!isset($arFromUser[$arMessage["FROM_USER_ID"]]))
		{
			if ($arMessage["FROM_USER_ID"] == 0)
			{
				$arMessage["FROM_USER"] = GetMessage('IM_MAIL_USER_SYSTEM');
			}
			else
			{
				$arMessage["FROM_USER"] = BitrixImUser::formatFullNameFromDatabase(array(
					"NAME" => $arMessage["FROM_USER_NAME"],
					"LAST_NAME" => $arMessage["FROM_USER_LAST_NAME"],
					"SECOND_NAME" => $arMessage["FROM_USER_SECOND_NAME"] ?? null,
					"LOGIN" => $arMessage["FROM_USER_LOGIN"],
					"EXTERNAL_AUTH_ID" => $arMessage["FROM_EXTERNAL_AUTH_ID"],
				));
			}

			$arFromUser[$arMessage["FROM_USER_ID"]] = Array(
				"FROM_USER" => $arMessage["FROM_USER"],
				"FROM_USER_ID" => $arMessage["FROM_USER_ID"],
				"FROM_USER_LOGIN" => $arMessage["FROM_USER_LOGIN"],
				"FROM_USER_NAME" => $arMessage["FROM_USER_NAME"],
				"FROM_USER_LAST_NAME" => $arMessage["FROM_USER_LAST_NAME"],
				"FROM_USER_SECOND_NAME" => $arMessage["FROM_USER_SECOND_NAME"] ?? null,
			);
		}

		$message = $parser->convert4mail(str_replace("#BR#", "n", strip_tags($arMessage["MESSAGE_OUT"])));
		$message = BitrixImText::removeBbCodes($message);
		$arDialog[$arMessage["TO_USER_ID"]][$arMessage["FROM_USER_ID"]][] = Array(
			'DATE_CREATE' => FormatDate("FULL", $arMessage["DATE_CREATE"]),
			'MESSAGE' => $message
		);
	}

	if ($maxId > 0)
	{
		BitrixMainConfigOption::set('im', 'last_send_mail_message', $maxId);
	}

	foreach ($arToUser as $toID=> $arToInfo)
	{
		$message = "";
		$messagesFromUsers = array();
		$bHeader = false;
		$arNames = Array();
		$arFromId = Array();
		$bFirstMessage = true;
		foreach ($arDialog[$toID] as $fromID => $arMessages)
		{
			$fromIdUserMessages = "";

			if ($bFirstMessage)
				$bFirstMessage = false;
			else
				$message .= "n";

			if (count($arDialog[$toID])>1)
			{
				$message .= GetMessage('IM_MAIL_TEMPLATE_NEW_MESSAGE_HEADER', Array('#FROM_USER#' => $arFromUser[$fromID]['FROM_USER']))."n";
				$bHeader = true;
			}
			$arNames[] = $arFromUser[$fromID]['FROM_USER'];
			$arFromId[] = $arFromUser[$fromID]['FROM_USER_ID'];
			foreach ($arMessages as $arMessage)
			{
				$message .= GetMessage('IM_MAIL_TEMPLATE_NEW_MESSAGE_TEXT', Array('#DATE_CREATE#' => $arMessage['DATE_CREATE'], '#MESSAGE#' => $arMessage['MESSAGE']))."n";
				$fromIdUserMessages .= nl2br(GetMessage('IM_MAIL_TEMPLATE_NEW_MESSAGE_TEXT', Array('#DATE_CREATE#' => $arMessage['DATE_CREATE'], '#MESSAGE#' => $arMessage['MESSAGE']))."n");
			}
			$messagesFromUsers[$fromID] = $fromIdUserMessages;
		}
		if ($bHeader)
			$message .= "n".GetMessage('IM_MAIL_TEMPLATE_NEW_MESSAGE_FOOTER');

		$fromUserId = $arToInfo["FROM_USER_ID"] ?? null;

		$arFields = array(
			"USER" => $arToInfo["USER_ID"],
			"USER_ID" => count($arNames) > 1? $arToInfo["USER_ID"]: $fromUserId,
			"USER_LOGIN" => $arToInfo["USER_LOGIN"],
			"USER_NAME" => $arToInfo["USER_NAME"],
			"USER_LAST_NAME" => $arToInfo["USER_LAST_NAME"],
			"USER_SECOND_NAME" => $arToInfo["USER_SECOND_NAME"],
			"EMAIL_TO" => $arToInfo["EMAIL_TO"],
			"TITLE" => $arToInfo["TITLE"] ?? null,
			"MESSAGES" => $message,
			"MESSAGES_FROM_USERS" => serialize($messagesFromUsers),
			"DATE_CREATE" => null,
		);
		$arFields['FROM_USER_ID'] = implode(', ', $arFromId);
		if (count($arNames) > 1)
		{
			$mailTemplate = "IM_NEW_MESSAGE_GROUP";
			$arFields['FROM_USERS'] = implode(', ', $arNames);
		}
		else
		{
			$mailTemplate = "IM_NEW_MESSAGE";
			$arFields['FROM_USER'] = implode(', ', $arNames);
		}

		$event = new CEvent;
		$event->Send($mailTemplate, $arToInfo['TO_USER_LID'], $arFields, "N");
	}

	return "CIMMail::MailMessageAgent();";
}