将评论邮件提醒插件加入每日发送量阈值的功能

2020-09-08 17:43:00
 折腾博客

注意:阅读本文需要一定的 PHP 基础
理论上应该支持所有评论提醒的插件。在插件类中新增类成员mailLimit()

    /**
     * 频数限制
     * 
     * @access public
     * @return bool
     */
    public static function mailLimit() {
        $db= Typecho_Db::get();
        $query= $db->select('date','num')->from('table.maillimiter'); 
        $result = $db->fetchAll($query);
        $num = $result[0]['num'];
        
        //判断是否为当日
        if ( date('Ymd',$result[0]['date']) != date('Ymd',time()) ){
            //如果不是当日,那就更新一个当日的时间戳,并让计数器归零
            $time = time();
            $num = 0;
            $updateToday = $db->update('table.maillimiter')->rows(array('date'=> $time ,"num" => $num ))->where('jikey=?',1);
            $updateTodayRows= $db->query($updateToday);
        }
        
        //判断是否限额
        if ($num < 200){
            //未到上限,数据递增
            $num ++;
            $updateToday = $db->update('table.maillimiter')->rows(array("num" => $num ))->where('jikey=?',1);
            $updateTodayRows= $db->query($updateToday);
            return 1;
        } else {
            //已到上限,返回“否”
            return 0;
        }
    }

此处我设置的阈值为不超过 200 次/天
然后数据库里,新建一张表,表明为表前缀_maillimiter。结构如下
(不要在意默认值的问题,因为这张表是拿我另外一张干别的用的表修改来的。)
然后需要手动新增行。date字段填入一段小于今天时间戳的数字或者是直接填写今天的时间戳,num字段填0,jikey作为主键,务必要填1,否则上面需要改。

本人水平不够,故不提供 SQL 命令。大可通过 phpMyAdmin 自行建表
本人水平不够,故不提供 SQL 命令。大可通过 phpMyAdmin 自行建表

然后在插件中寻找发送邮件的动作,如,我用的这个插件的发信动作为$mail->send();,然后发信的函数和刚才加进去的那个频率限制函数同属一个类的类成员时,那就改成这样

        if (self::mailLimit()){
            $mail->send();
        } else {
            //此处可以加一个Server酱什么的,做一个吿薪处理
        }

然后理论上就可以生效了。