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;
}