Joomla 收到大量垃圾询盘信息,在 php 代码中屏蔽关键词

文章目录

    Joomla 网站收到了大量的垃圾询盘信息,几乎一秒一条,即浪费精力去清理,又占用了处理线程,拖慢了网站速度。

    所以必须在发送邮件前,就过滤掉。

    修改哪个代码文件

    太久不看,已经忘记了需要修改哪个代码文件。但是好在记住了一个变量名 emailBody, 这样就定位到了:

    > grep emailBody -r components/
    components/com_sppagebuilder/addons/form_builder/site.php:              $emailBody = '';
    

    先备份

    不想在线上用 git 管理,担心有漏洞,还是简单粗暴的使用 cp 备份稳妥一些。

    cd components/com_sppagebuilder/addons/form_builder/
    cp site.php site.php.bak20241010
    

    判断是否包含关键词

    <?php
    // 判断 $emailBody 这个字符串变量中,是否包含以下垃圾信息关键词
    $emailBody = "这是一封包含垃圾信息关键词的邮件,例如 ГОСЛОТО 和 лотерейный билет。";
    
    // 定义垃圾信息关键词数组
    $spamKeywords = array(
        "ГОСЛОТО",
        "Добрый день",
        "Поздравляем",
        "Подравляем!",
        "лотepeйный",
        "юбилейный",
        "билете",
        "ГосЛото",
        "ГОСЛОТО.",
        "ГосЛото.",
        "лотерейный билет"
    );
    
    // 遍历关键词数组,检查是否包含在邮件内容中
    foreach ($spamKeywords as $keyword) {
        if (strpos($emailBody, $keyword)!== false) {
            echo "邮件中包含垃圾信息关键词:". $keyword. "\n";
        }
    }
    ?>
    

    测试

    先判断本机是否安装了 PHP:

    > php --version
    PHP 7.4.3 (cli) (built: Oct  6 2020 15:47:56) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
        with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
    

    执行:

    > php /mnt/d/temp/a.php
    邮件中包含垃圾信息关键词:ГОСЛОТО
    邮件中包含垃圾信息关键词:лотерейный билет
    

    返回什么

    参考发送成功的逻辑:

    if ($mail->sendMail(...)) {
    		$output['status'] = true;
    		$output['content'] = '<span class="sppb-text-success">' . $success_message_ajax . '</span>';
    }
    
    return json_encode($output);
    

    直接返回

    $output['status'] = true;
    $output['content'] = '<span class="sppb-text-success">' . $success_message_ajax . '</span>';
    return json_encode($output);
    

    只要让垃圾信息发布者不知道发送失败就行。

    最终代码

    <?php
    // 判断 $emailBody 这个字符串变量中,是否包含以下垃圾信息关键词
    $emailBody = "这是一封包含垃圾信息关键词的邮件,例如 ГОСЛОТО 和 лотерейный билет。";
    
    // 定义垃圾信息关键词数组
    $spamKeywords = array(
        "ГОСЛОТО",
        "Добрый день",
        "Поздравляем",
        "Подравляем!",
        "лотepeйный",
        "юбилейный",
        "билете",
        "ГосЛото",
        "ГОСЛОТО.",
        "ГосЛото.",
        "лотерейный билет"
    );
    
    // 遍历关键词数组,检查是否包含在邮件内容中
    foreach ($spamKeywords as $keyword) {
        if (strpos($emailBody, $keyword)!== false) {
            //echo "邮件中包含垃圾信息关键词:". $keyword. "\n";
            $output['status'] = true;
            $output['content'] = '<span class="sppb-text-success">' . $success_message_ajax . '</span>';
            return json_encode($output);
        }
    }
    ?>
    

    更新 2024-12-27

    通过关键词还是不行,俄语垃圾询盘太多了。所以,过滤掉所有的俄语邮件

    function isRussian($text) {
        return preg_match('/[А-Яа-яЁё]/u', $text);
    }
    

    参考:

    https://stackoverflow.com/questions/3212266/detecting-russian-characters-on-a-form-in-php

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式