• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/classes/general/mail.php
  • Класс: CMailFilter
  • Вызов: CMailFilter::Filter
static function Filter($arFields, $event, $FILTER_ID=false, $PARENT_FILTER_ID = false)
{
	global $BX_MAIL_FILTER_CACHE, $DB;
	$PARENT_FILTER_ID = intval($PARENT_FILTER_ID);
	$MAILBOX_ID = intval($arFields["MAILBOX_ID"]);
	$MESSAGE_ID = intval($arFields["ID"]);

	$cache_param = $MAILBOX_ID."|".$PARENT_FILTER_ID."|".$event."|".$FILTER_ID;

	if(is_set($BX_MAIL_FILTER_CACHE, $cache_param))
	{
		$arFilterCond = $BX_MAIL_FILTER_CACHE[$cache_param]["CONDITIONS"];
		$arFilter = $BX_MAIL_FILTER_CACHE[$cache_param]["FILTER"];
	}
	else
	{
		$strSqlAdd = "";
		if($event=="R")
			$strSqlAdd .= "	AND (WHEN_MAIL_RECEIVED='Y')";
		else
			$strSqlAdd .= "	AND (WHEN_MANUALLY_RUN='Y' ".(intval($FILTER_ID)>0?" AND f.ID='".intval($FILTER_ID)."'":"").")";

		$strSql =
			"SELECT f.*, c.*, f.ID, c.ID as CONDITION_ID
			FROM b_mail_filter f LEFT JOIN b_mail_filter_cond c ON f.ID = c.FILTER_ID
			WHERE (f.MAILBOX_ID = ".$MAILBOX_ID." OR MAILBOX_ID IS NULL)
				AND f.ACTIVE = 'Y'
				AND (f.PARENT_FILTER_ID = " . ($PARENT_FILTER_ID > 0 ? $PARENT_FILTER_ID : "0 OR f.PARENT_FILTER_ID IS NULL") . ")" .
				$strSqlAdd."
			ORDER BY f.SORT, f.ID";

		$dbr = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); $arFilter = Array(); $arFilterCond = Array(); $prev_ID = 0; $arr_prev = false; $arConds = Array(); while($arr = $dbr->Fetch()) { $arFilter[$arr["ID"]] = $arr; if($arr["CONDITION_ID"]>0) { if(!is_array($arFilterCond[$arr["ID"]])) $arFilterCond[$arr["ID"]] = Array(); $arFilterCond[$arr["ID"]][] = $arr; } } $BX_MAIL_FILTER_CACHE[$cache_param] = Array("FILTER"=>$arFilter, "CONDITIONS"=>$arFilterCond); } $arFieldsOriginal = $arFields; foreach($arFilter as $filter_id=>$arFilterParams) { $arFields = $arFieldsOriginal; $arFields["MAIL_FILTER"] = $arFilterParams; $arAllConditions = isset($arFilterCond[$filter_id]) ? $arFilterCond[$filter_id] : []; $bCondOK = true; if(!is_array($arAllConditions)) $arAllConditions = Array(); foreach($arAllConditions as $k => $arCondition) { $bCondOK = false; $type = $arCondition["TYPE"]; switch($type) { case "ALL":case "RECIPIENT":case "SENDER": if($type=="ALL") $arFields[$type] = $arFields["HEADER"]."rn".$arFields["BODY"]; elseif($type=="RECIPIENT") $arFields[$type] = $arFields["FIELD_CC"]."rn".$arFields["FIELD_TO"]."rn".$arFields["FIELD_BCC"]; else $arFields[$type] = $arFields["FIELD_FROM"]."rn".$arFields["FIELD_REPLY_TO"]; case "HEADER": case "FIELD_FROM": case "FIELD_REPLY_TO": case "FIELD_TO": case "FIELD_CC": case "SUBJECT": case "BODY": $arStrings = explode("n", $arCondition["STRINGS"]); if($arCondition["COMPARE_TYPE"]=="NOT_EQUAL" || $arCondition["COMPARE_TYPE"]=="NOT_CONTAIN") { $bCondOK = true; for($i = 0, $n = count($arStrings); $i < $n; $i++) { $str = mb_strtoupper(Trim($arStrings[$i], "r")); switch($arCondition["COMPARE_TYPE"]) { case "NOT_CONTAIN": if($str <> '' && mb_strpos(mb_strtoupper($arFields[$type]), $str) !== false) $bCondOK = false; break; case "NOT_EQUAL": if($str == mb_strtoupper($arFields[$type])) $bCondOK = false; break; } if(!$bCondOK) break; } } else { for($i = 0, $n = count($arStrings); $i < $n; $i++) { $str = mb_strtoupper(Trim($arStrings[$i], "r")); switch($arCondition["COMPARE_TYPE"]) { case "CONTAIN": if($str <> '' && mb_strpos(mb_strtoupper($arFields[$type]), $str) !== false) $bCondOK = true; break; case "EQUAL": if($str == mb_strtoupper($arFields[$type])) $bCondOK = true; break; case "REGEXP": if(preg_match("'".str_replace("'", "'", $str)."'i", $arFields[$type])) $bCondOK = true; break; } if($bCondOK) break; } } break; case "ATTACHMENT": $db_att = CMailAttachment::GetList(Array(), Array("MESSAGE_ID"=>$arFields["ID"])); $arStrings = explode("n", $arCondition["STRINGS"]); if($arCondition["COMPARE_TYPE"]=="NOT_EQUAL" || $arCondition["COMPARE_TYPE"]=="NOT_CONTAIN") { $bCondOK = true; while($arr_att = $db_att->Fetch()) { for($i = 0, $n = count($arStrings); $i < $n; $i++) { $str = mb_strtoupper(Trim($arStrings[$i], "r")); switch($arCondition["COMPARE_TYPE"]) { case "NOT_CONTAIN": if($str <> '' && mb_strpos(mb_strtoupper($arr_att["FILE_NAME"]), $str) !== false) $bCondOK = false; break; case "NOT_EQUAL": if($str == mb_strtoupper($arr_att["FILE_NAME"])) $bCondOK = false; break; } } if(!$bCondOK) break; } } else { while($arr_att = $db_att->Fetch()) { for($i = 0, $n = count($arStrings); $i < $n; $i++) { $str = mb_strtoupper(Trim($arStrings[$i], "r")); switch($arCondition["COMPARE_TYPE"]) { case "CONTAIN": if($str <> '' && mb_strpos(mb_strtoupper($arr_att["FILE_NAME"]), $str) !== false) $bCondOK = true; break; case "EQUAL": if($str == mb_strtoupper($arr_att["FILE_NAME"])) $bCondOK = true; break; case "REGEXP": if(preg_match("'".str_replace("'", "'", $str)."'i", $arr_att["FILE_NAME"])) $bCondOK = true; break; } } if($bCondOK) break; } } break; } //switch if(!$bCondOK) break; } //foreach($arAllConditions as $k => $arCondition) if(!$bCondOK) continue; if($arFilterParams["SPAM_RATING"]>0) { $arFields["SPAM_RATING"] = CMailMessage::GetSpamRating($arFields["ID"], $arFields); if($arFilterParams["SPAM_RATING_TYPE"]==">" && $arFields["SPAM_RATING"]<=$arFilterParams["SPAM_RATING"]) continue; if($arFilterParams["SPAM_RATING_TYPE"]!=">" && $arFields["SPAM_RATING"]>=$arFilterParams["SPAM_RATING"]) continue; } if($arFilterParams["MESSAGE_SIZE"]>0) { $MESSAGE_SIZE = $arFields["MESSAGE_SIZE"]; if($arFilterParams["MESSAGE_SIZE_UNIT"]=="k") $MESSAGE_SIZE = intval($MESSAGE_SIZE/1024); elseif($arFilterParams["MESSAGE_SIZE_UNIT"]=="m") $MESSAGE_SIZE = intval($MESSAGE_SIZE/1024/1024); if($arFilterParams["MESSAGE_SIZE_TYPE"]==">" && $MESSAGE_SIZE<=$arFilterParams["MESSAGE_SIZE"]) continue; if($arFilterParams["MESSAGE_SIZE_TYPE"]!=">" && $MESSAGE_SIZE>=$arFilterParams["MESSAGE_SIZE"]) continue; } if($arFilterParams["PHP_CONDITION"] <> '') if(!CMailFilter::DoPHPAction("php_cond_".$arFilterParams["ID"]."_", $arFilterParams["PHP_CONDITION"], $arFields)) continue; $arModFilter = false; if($arFilterParams["ACTION_TYPE"]!="") { $res = CMailFilter::GetFilterList($arFilterParams["ACTION_TYPE"]); if($arModFilter = $res->Fetch()) { if ( (is_array($arModFilter["CONDITION_FUNC"]) && count($arModFilter["CONDITION_FUNC"]) > 0) || $arModFilter["CONDITION_FUNC"] <> '' ) if(!call_user_func_array($arModFilter["CONDITION_FUNC"], Array(&$arFields, &$arFilterParams["ACTION_VARS"]))) continue; } } CMailLog::AddMessage( Array( "MAILBOX_ID"=>$MAILBOX_ID, "MESSAGE_ID"=>$MESSAGE_ID, "FILTER_ID"=>$filter_id, "STATUS_GOOD"=>"Y", "LOG_TYPE"=>"FILTER_OK", "MESSAGE"=>$event, ) ); if($arModFilter) if ( (is_array($arModFilter["ACTION_FUNC"]) && count($arModFilter["ACTION_FUNC"]) > 0) || $arModFilter["ACTION_FUNC"] <> '' ) call_user_func_array($arModFilter["ACTION_FUNC"], array(&$arFields, &$arFilterParams["ACTION_VARS"])); if(Trim($arFilterParams["ACTION_PHP"]) <> '') { $res = CMailFilter::DoPHPAction("php_act_".$arFilterParams["ID"]."_", $arFilterParams["ACTION_PHP"], $arFields); CMailLog::AddMessage( Array( "MAILBOX_ID"=>$MAILBOX_ID, "MESSAGE_ID"=>$MESSAGE_ID, "FILTER_ID"=>$filter_id, "LOG_TYPE"=>"DO_PHP", "MESSAGE"=>"" ) ); } if($arFilterParams["ACTION_SPAM"]=="Y" && $arFields["SPAM"]!="Y") { if($arFields["SPAM"]=="N") CMailFilter::DeleteFromSpamBase($arFields["FOR_SPAM_TEST"], false); CMailFilter::MarkAsSpam($arFields["FOR_SPAM_TEST"], true); CMailMessage::Update($MESSAGE_ID, Array("SPAM"=>"Y")); CMailLog::AddMessage( Array( "MAILBOX_ID"=>$MAILBOX_ID, "MESSAGE_ID"=>$MESSAGE_ID, "FILTER_ID"=>$filter_id, "LOG_TYPE"=>"SPAM", "MESSAGE"=>"" ) ); $arFields["SPAM"] = "Y"; } elseif($arFilterParams["ACTION_SPAM"]=="N" && $arFields["SPAM"]!="N") { if($arFields["SPAM"]=="Y") CMailFilter::DeleteFromSpamBase($arFields["FOR_SPAM_TEST"], true); CMailFilter::MarkAsSpam($arFields["FOR_SPAM_TEST"], false); CMailMessage::Update($MESSAGE_ID, Array("SPAM"=>"N")); CMailLog::AddMessage( Array( "MAILBOX_ID"=>$MAILBOX_ID, "MESSAGE_ID"=>$MESSAGE_ID, "FILTER_ID"=>$filter_id, "LOG_TYPE"=>"NOTSPAM", "MESSAGE"=>"" ) ); $arFields["SPAM"] = "N"; } if($arFilterParams["ACTION_READ"]=="Y" && $arFields["NEW_MESSAGE"]=="Y") { $arFields["NEW_MESSAGE"] = "N"; CMailMessage::Update($MESSAGE_ID, Array("NEW_MESSAGE"=>"N")); } elseif($arFilterParams["ACTION_READ"]=="N" && $arFields["NEW_MESSAGE"]!="Y") { $arFields["NEW_MESSAGE"] = "Y"; CMailMessage::Update($MESSAGE_ID, Array("NEW_MESSAGE"=>"Y")); } if($arFilterParams["ACTION_DELETE_MESSAGE"]=="Y") { CMailLog::AddMessage( Array( "MAILBOX_ID"=>$MAILBOX_ID, "MESSAGE_ID"=>$MESSAGE_ID, "FILTER_ID"=>$filter_id, "STATUS_GOOD"=>"Y", "LOG_TYPE"=>"MESSAGE_DELETED", "MESSAGE"=>"" ) ); CMailMessage::Delete($MESSAGE_ID); } if($arFilterParams["ACTION_STOP_EXEC"]=="Y") { CMailLog::AddMessage( Array( "MAILBOX_ID"=>$MAILBOX_ID, "MESSAGE_ID"=>$MESSAGE_ID, "FILTER_ID"=>$filter_id, "STATUS_GOOD"=>"Y", "LOG_TYPE"=>"FILTER_STOP", "MESSAGE"=>"" ) ); return true; } } return true; }