function CleanUp() { global $DB; $days = COption::GetOptionInt("mail", "time_keep_log", B_MAIL_KEEP_LOG); $strSql = "DELETE FROM b_mail_log WHERE DATE_INSERT < DATE_ADD(now(), INTERVAL -" . intval($days) . " DAY)"; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $mt = GetMicroTime(); $dbr = $DB->Query("SELECT MS.ID FROM b_mail_message MS, b_mail_mailbox MB WHERE MS.MAILBOX_ID=MB.ID AND MB.MAX_KEEP_DAYS>0 AND MS.DATE_INSERT < DATE_ADD(now(), INTERVAL -MB.MAX_KEEP_DAYS DAY)"); while ($ar = $dbr->Fetch()) { CMailMessage::Delete($ar["ID"]); if (GetMicroTime() - $mt > 10 * 1000) { break; } } return "CMailbox::CleanUp();"; }
{ CMailMessage::MarkAsSpam($ID, false, $dbr_arr); } elseif(($_REQUEST["MARK_SPAM"]=="Y" || $_REQUEST["MARK_SPAM"]=="N")) { CMailMessage::MarkAsSpam($ID, $_REQUEST["MARK_SPAM"]=="Y", $dbr_arr); } if(strlen($_REQUEST["MANUAL_FILTER"])>0) { CMailFilter::FilterMessage($ID, "M", ($_REQUEST["MANUAL_FILTER"]>0?$_REQUEST["MANUAL_FILTER"]:false)); } if($_REQUEST["DELETE_MESSAGE"]=="Y") { CMailMessage::Delete($ID); $_REQUEST["save"] == "Y"; } } if(strlen($_REQUEST["apply"])>0) LocalRedirect($APPLICATION->GetCurPage()."?lang=".LANG."&ID=".$ID."#tb"); elseif(strlen($_REQUEST["next"])>0 || strlen($_REQUEST["prev"])>0) { $md5Path = md5("/bitrix/admin/mail_message_admin.php"); $FILTER = $_SESSION["SESS_ADMIN"][$md5Path]; $arFilter = Array( "ID"=>$FILTER["find_id"], "MAILBOX_ID"=>$FILTER["find_mailbox_id"], "SENDER"=>$FILTER["find_from"], "RECIPIENT"=>$FILTER["find_to"],
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 : "'' OR f.PARENT_FILTER_ID IS NULL") . ")" . $strSqlAdd." ORDER BY f.SORT, f.ID"; $dbr = $DB->Query($strSql, false, "File: ".__FILE__."<br>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 = $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"]."\r\n".$arFields["BODY"]; elseif($type=="RECIPIENT") $arFields[$type] = $arFields["FIELD_CC"]."\r\n".$arFields["FIELD_TO"]."\r\n".$arFields["FIELD_BCC"]; else $arFields[$type] = $arFields["FIELD_FROM"]."\r\n".$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 = strtoupper(Trim($arStrings[$i], "\r")); switch($arCondition["COMPARE_TYPE"]) { case "NOT_CONTAIN": if(strlen($str)>0 && strpos(strtoupper($arFields[$type]), $str)!==false) $bCondOK = false; break; case "NOT_EQUAL": if($str==strtoupper($arFields[$type])) $bCondOK = false; break; } if(!$bCondOK) break; } } else { for($i = 0, $n = count($arStrings); $i < $n; $i++) { $str = strtoupper(Trim($arStrings[$i], "\r")); switch($arCondition["COMPARE_TYPE"]) { case "CONTAIN": if(strlen($str)>0 && strpos(strtoupper($arFields[$type]), $str)!==false) $bCondOK = true; break; case "EQUAL": if($str==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 = strtoupper(Trim($arStrings[$i], "\r")); switch($arCondition["COMPARE_TYPE"]) { case "NOT_CONTAIN": if(strlen($str)>0 && strpos(strtoupper($arr_att["FILE_NAME"]), $str)!==false) $bCondOK = false; break; case "NOT_EQUAL": if($str==strtoupper($arr_att["FILE_NAME"])) $bCondOK = false; break; } } if(!$bCondOK) break; } } else { for($i = 0, $n = count($arStrings); $i < $n; $i++) { $str = strtoupper(Trim($arStrings[$i], "\r")); while($arr_att = $db_att->Fetch()) { switch($arCondition["COMPARE_TYPE"]) { case "CONTAIN": if(strlen($str)>0 && strpos(strtoupper($arr_att["FILE_NAME"]), $str)!==false) $bCondOK = true; break; case "EQUAL": if($str==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(strlen($arFilterParams["PHP_CONDITION"])>0) 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) || strlen($arModFilter["CONDITION_FUNC"]) > 0 ) 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) || strlen($arModFilter["ACTION_FUNC"]) > 0 ) call_user_func_array($arModFilter["ACTION_FUNC"], array(&$arFields, &$arFilterParams["ACTION_VARS"])); if(strlen(Trim($arFilterParams["ACTION_PHP"]))>0) { $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; }