• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/general/message.php
  • Класс: CAllForumMessage
  • Вызов: CAllForumMessage::SendMailMessage
static function SendMailMessage($MID, $arFields = array(), $strLang = false, $mailTemplate = false)
{
	global $USER;
	$MID = intval($MID);
	$arMessage = array(); $arTopic = array(); $arForum = array(); $arFiles = array();
	$mailTemplate = ($mailTemplate === false ? "NEW_FORUM_MESSAGE" : $mailTemplate);
	$event = new CEvent;
	if ($MID > 0)
	{
		CTimeZone::Disable();
		$arMessage = CForumMessage::GetByIDEx($MID, array("GET_TOPIC_INFO" => "Y", "GET_FORUM_INFO" => "Y", "FILTER" => "Y"));
		CTimeZone::Enable();

		$db_files = CForumFiles::GetList(array("MESSAGE_ID" => "ASC"), array("MESSAGE_ID" => $MID));
		if ($db_files && $res = $db_files->Fetch())
		{
			do
			{
				$arFiles[$res["ID"]] = CFile::GetFileArray($res["FILE_ID"]);
			} while ($res = $db_files->Fetch());
		}
	}
	if (empty($arMessage))
		return false;

	$arTopic = $arMessage["TOPIC_INFO"];
	$arForum = $arMessage["FORUM_INFO"];
	$TID = intval($arMessage["TOPIC_ID"]);
	$FID = intval($arMessage["FORUM_ID"]);

	if (!is_set($arFields, "FORUM_ID")) $arFields["FORUM_ID"] = $arMessage["FORUM_ID"];
	if (!is_set($arFields, "FORUM_NAME")) $arFields["FORUM_NAME"] = $arForum["NAME"];
	if (!is_set($arFields, "TOPIC_ID")) $arFields["TOPIC_ID"] = $arMessage["TOPIC_ID"];
	if (!is_set($arFields, "MESSAGE_ID")) $arFields["MESSAGE_ID"] = $arMessage["ID"];
	if (!is_set($arFields, "TOPIC_TITLE")) $arFields["TOPIC_TITLE"] = $arTopic["TITLE"];

	if (!is_set($arFields, "MESSAGE_DATE")) $arFields["MESSAGE_DATE"] = $arMessage["POST_DATE"];
	if (!is_set($arFields, "AUTHOR")) $arFields["AUTHOR"] = $arMessage["AUTHOR_NAME"];
	if (!is_set($arFields, "TAPPROVED")) $arFields["TAPPROVED"] = $arTopic["APPROVED"];
	if (!is_set($arFields, "MAPPROVED")) $arFields["MAPPROVED"] = $arMessage["APPROVED"];
	if (!is_set($arFields, "FROM_EMAIL")) $arFields["FROM_EMAIL"] = COption::GetOptionString("forum", "FORUM_FROM_EMAIL", "nomail@nomail.nomail");

	//If the message is from socialnetwork, check if mail processor exists for this social network
	if($arTopic["SOCNET_GROUP_ID"]>0)
	{
		if(CModule::IncludeModule("mail") && CModule::IncludeModule("socialnetwork"))
		{
			$arMailParams = CForumEMail::GetForumFilters($FID, $arTopic["SOCNET_GROUP_ID"]);
			//If the processor exists:
			if($arMailParams)
			{
				global $DB;
				if($arMessage["XML_ID"]=='')
				{
					//check if MSG_ID field exists, generate it if not
					$arMessage["XML_ID"] = "M".$MID.".".md5(uniqid())."@".($_SERVER["SERVER_NAME"]!=''?$_SERVER["SERVER_NAME"]:$_SERVER["SERVER_ADDR"]);
					$DB->Query("UPDATE b_forum_message SET XML_ID='".$DB->ForSQL($arMessage["XML_ID"])."' WHERE ID=".$MID);
				}

				//get MSG_ID topics, it would be IN_REPLY_TO
				if($arTopic["XML_ID"]=='')
				{
					$arTopic["XML_ID"] = "T".$TID.".".md5(uniqid())."@".($_SERVER["SERVER_NAME"]!=''?$_SERVER["SERVER_NAME"]:$_SERVER["SERVER_ADDR"]);
					$DB->Query("UPDATE b_forum_topic SET XML_ID='".$DB->ForSQL($arTopic["XML_ID"])."' WHERE ID=".$TID);
				}

				//fill FROM_EMAIL from AUTHOR_NAME + FROM_EMAIL or AUTHOR_EMAIL or from 'b_user' by AUTHOR_ID depending on the settings of mail processor
				if($arMailParams['USE_EMAIL'] == 'Y' && $arMessage["AUTHOR_EMAIL"]!='')
					$arFields["FROM_EMAIL"] = '"'.$arMessage['AUTHOR_NAME'].'" <'.$arMessage['AUTHOR_EMAIL'].'>';
				elseif($arMailParams['USE_EMAIL'] == 'Y' && $arMessage["EMAIL"]!='')
					$arFields["FROM_EMAIL"] = '"'.$arMessage['AUTHOR_NAME'].'" <'.$arMessage['EMAIL'].'>';
				else
					$arFields["FROM_EMAIL"] = '"'.$arMessage['AUTHOR_NAME'].'" <'.$arMailParams['EMAIL'].'>';

				if($arMessage["NEW_TOPIC"]=="Y")
				{
					$arFields["=Message-Id"] = $arFields["MSG_ID"] = "<".$arTopic["XML_ID"].">";
				}
				else
				{
					$arFields["TOPIC_TITLE"] = "Re".($arMessage["TOPIC_INFO"]["POSTS"]>1?"[".$arMessage["TOPIC_INFO"]["POSTS"]."]":"").": ".$arFields["TOPIC_TITLE"];
					$arFields["=Message-Id"] = $arFields["MSG_ID"] = "<".$arMessage["XML_ID"].">";
					$arFields["=In-Reply-To"] = $arFields["IN_REPLY_TO"] = "<".$arTopic["XML_ID"].">";
				}
				//fill REPLY_TO from the settings of the mail processor
				$arFields["=Reply-To"] = $arFields["REPLY_TO"] = $arMailParams["EMAIL"];
				$arFields["FORUM_EMAIL"] = $arMailParams["EMAIL"];

				$arSocNetGroup = CSocNetGroup::GetById($arTopic["SOCNET_GROUP_ID"]);
				$arFields["FORUM_NAME"] = $arSocNetGroup["NAME"];

				if($arMailParams["SUBJECT_SUF"] != '')
					$arFields["TOPIC_TITLE"] .= ' '.$arMailParams["SUBJECT_SUF"];
				if($arMailParams["USE_SUBJECT"] == "Y")
					$arFields["=Subject"] = $arFields["TOPIC_TITLE"];

				$arFields["PATH2FORUM"] = CComponentEngine::MakePathFromTemplate($arMailParams["URL_TEMPLATES_MESSAGE"], array("FID" => $arMessage["FORUM_ID"], "TID" => $arMessage["TOPIC_ID"], "TITLE_SEO" => $arMessage["TOPIC_INFO"]["TITLE_SEO"], "MID" => $arMessage["ID"]));
			}
			else
				return false;
		}
		else
			return false;
	}
	else
	{
		$arForumSites = CForumNew::GetSites($FID);
		foreach ($arForumSites as $site_id => $path):
			$arForumSites[$site_id] = trim(CForumNew::PreparePath2Message($arForumSites[$site_id],
					array("FORUM_ID" => $arMessage["FORUM_ID"], "TOPIC_ID" => $arMessage["TOPIC_ID"], "TITLE_SEO" => $arMessage["TOPIC_INFO"]["TITLE_SEO"], "MESSAGE_ID" => $arMessage["ID"],
						"SOCNET_GROUP_ID" => $arTopic["SOCNET_GROUP_ID"], "OWNER_ID" => $arTopic["OWNER_ID"],
						"PARAM1" => $arMessage["PARAM1"], "PARAM2" => $arMessage["PARAM2"])));
			if (empty($arForumSites[$site_id])):
				$db_lang = CSite::GetByID($site_id);
				$arForumSites[$site_id] = "/";
				if ($ar_lang = $db_lang->Fetch())
					$arForumSites[$site_id] = $ar_lang["DIR"];
				$arForumSites[$site_id] = COption::GetOptionString("forum", "REL_FPATH", "").
						"forum/read.php?FID=#FID#&TID=#TID#&MID=#MID##message#MID#";
			endif;
		endforeach;
		foreach(GetModuleEvents("forum", "onBeforeMailMessageSend", true) as $arEvent)
		{
			if (ExecuteModuleEventEx($arEvent, array(&$mailTemplate, &$arForumSites, &$arFields, $arForum, $arTopic, $arMessage)) === false)
				return false;
		}
	}

	/*
	??
	ALTER TABLE dbo.B_FORUM_MESSAGE ADD
		MSG_ID varchar(255) NULL,
		MAIL_MESSAGE_ID int NULL

	*/

	$arFilter = array(
		"FORUM_ID" => $FID,
		"TOPIC_ID_OR_NULL" => $TID,
		"ACTIVE" => "Y",
		">=PERMISSION" => (($arTopic["APPROVED"] != "Y" || $arMessage["APPROVED"] != "Y") ? "Q" : "E")
		);
	if ($arMessage["NEW_TOPIC"] != "Y")
		$arFilter["NEW_TOPIC_ONLY"] = "N";
	if ($mailTemplate == "NEW_FORUM_MESSAGE")
		$arFilter["LAST_SEND_OR_NULL"] = $MID;

	if($arTopic["SOCNET_GROUP_ID"]>0)
	{
		$mailTemplate = "FORUM_NEW_MESSAGE_MAIL";
		$arFilter["SOCNET_GROUP_ID"] = $arTopic["SOCNET_GROUP_ID"];
	}
	else
		$arFilter["SOCNET_GROUP_ID"] = false;

	$db_res = CForumSubscribe::GetListEx(array("USER_ID" => "ASC"), $arFilter);
	$arID = array(); $arSiteFields = array();
	$currentUserID = false;
	while ($res = $db_res->Fetch())
	{
		// SUBSC_GET_MY_MESSAGE - Send my messages to myself.
		if ($res["SUBSC_GET_MY_MESSAGE"] == "N" && $res["USER_ID"] == $USER->GetId())
			continue;

		// SUBSC_GROUP_MESSAGE  - Group messages.
		if ($currentUserID == $res["USER_ID"])
			continue;

		// Check email
		if (empty($res["EMAIL"]))
			continue;

		if($mailTemplate == "FORUM_NEW_MESSAGE_MAIL" && $res["USER_ID"] == $arMessage["AUTHOR_ID"])
			continue;

		$currentUserID = $res["USER_ID"];
		$arFields_tmp = $arFields;

		if (!is_set($arFields_tmp, "PATH2FORUM"))
		{
			$arFields_tmp["PATH2FORUM"] = $arForumSites[$res["SITE_ID"]];
		}

		if (!is_set($arFields_tmp, "MESSAGE_TEXT"))
		{
			if (!isset(${"parser_".$res["SITE_ID"]}))
				${"parser_".$res["SITE_ID"]} = new forumTextParser($res["SITE_ID"]);
			if (empty($arSiteFields[$res["SITE_ID"]]))
			{
				$arSiteFields[$res["SITE_ID"]] = $event->GetSiteFieldsArray($res["SITE_ID"]);
				$db_site = CSite::GetByID($res["SITE_ID"]);
				if ($db_site && $arSite = $db_site->Fetch())
				{
					$arSiteFields[$res["SITE_ID"]] = array_merge($arSiteFields[$res["SITE_ID"]], $arSite,
						array("LANG_MESS" => IncludeModuleLangFile(__FILE__, $arSiteFields[$res["SITE_ID"]]["LANGUAGE_ID"], true)));
					$arSiteFields[$res["SITE_ID"]]["ATTACHED_FILES"] = $arSiteFields[$res["SITE_ID"]]["LANG_MESS"]["F_ATTACHED_FILES"];
				}
			}
			if (!empty($arSiteFields[$res["SITE_ID"]]["SERVER_NAME"]))
				${"parser_".$res["SITE_ID"]}->serverName = $arSiteFields[$res["SITE_ID"]]["SERVER_NAME"];
			${"parser_".$res["SITE_ID"]}->arFiles = $arFiles;

			$POST_MESSAGE_HTML = $arMessage["POST_MESSAGE"];
			if (COption::GetOptionString("forum", "FILTER", "Y") == "Y")
				$POST_MESSAGE_HTML = (empty($arMessage["POST_MESSAGE_FILTER"]) ? CFilterUnquotableWords::Filter($POST_MESSAGE_HTML) : $arMessage["POST_MESSAGE_FILTER"]);
			$arFields_tmp["MESSAGE_TEXT"] = ${"parser_".$res["SITE_ID"]}->convert4mail($POST_MESSAGE_HTML);
			$arFields_tmp["PARSED_FILES"] = ${"parser_".$res["SITE_ID"]}->arFilesIDParsed;
			$tmp = array_diff(array_keys($arFiles), ${"parser_".$res["SITE_ID"]}->arFilesIDParsed);
			if (!empty($tmp))
			{
				$str = "[FILE ID=".implode("]n[FILE ID=", $tmp)."]";
				${"parser_".$res["SITE_ID"]}->ParserFile($str, ${"parser_".$res["SITE_ID"]}, "mail");
				$arFields_tmp["MESSAGE_TEXT"] .= "nn".$arSiteFields[$res["SITE_ID"]]["ATTACHED_FILES"]."n".$str;
			}
		}

		$arFields_tmp["RECIPIENT"] = $res["EMAIL"];
		$event->Send($mailTemplate, $res["SITE_ID"], $arFields_tmp, "N");
		$arID[] = $res["ID"];
		if (count($arID) > 255)
		{
			CForumSubscribe::UpdateLastSend($MID, implode(",", $arID));
			$arID = array();
		}
	}
	if (count($arID) > 0)
	{
		CForumSubscribe::UpdateLastSend($MID, implode(",", $arID));
	}
	return true;
}