免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: akid
打印 上一主题 下一主题

[Mail] vpopmail quota_warn的BUG [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-05-23 01:05 |只看该作者

vpopmail quota_warn的BUG

[quote]原帖由 "大麻"]  我最近也被 maildirsize 搞的头痛,不知道 courier 和 vpopmail 对这个文件是怎么考虑的,没有必要搞的那么复杂嘛!我在程序里面干脆直接把这个文件每次都删除,反正 vpopmail 会自己建立。[/quote 发表:

大麻可以改folder.php里,根据要删掉的mail文件的文件名得到quota_size,加个负号append到maildirsize文件后面,然后再unlink掉这个文件。对qmail打完maildir++patch是这样的结果。
??不过用这样的办法,maildirsize文件会慢慢增大,什么时候vpopmail才会自动总结一下?
??vpopmail的源代码读起来不爽,我觉得代码写得比较乱。如user_over_maildirquota()函数,看名字应该只是判断用户是否超过负载空间,但是细看这个函数内容,里面竟还有对maildir_addquota()的调用,而这完全应该移到vdelivermail()里去调用的!真是郁闷!

论坛徽章:
0
12 [报告]
发表于 2003-05-23 01:16 |只看该作者

vpopmail quota_warn的BUG

[quote]原帖由 "笨笨鸟"]可以修改源文件,更改计算方式。[/quote 发表:

看不懂怎么改,vpopmail-5.2.1里README.quotas说
qmail-pop3d does not update maildirsize when you delete messages.  This  problem will correct itself within 15 minutes, since the Maildir++ specdictates that the maildirsize file must be recalculated at least every 15 minutes.
我看到docheckquota()函数里确实写了
if (maildirsize_nlines == 1 && tm < stat_buf.st_mtime + 15*60)
                        return (n);
但是我把这段代码注释掉了,vpopmail还是不会重算maildirsize!

论坛徽章:
0
13 [报告]
发表于 2003-05-24 18:09 |只看该作者

vpopmail quota_warn的BUG

不知道各位有没有碰到和小弟这样的问题?
怎么没有人在意啊?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2003-05-25 09:03 |只看该作者

vpopmail quota_warn的BUG

建议你调试一下,写写日志,例如记录一下计算前后的数值。

这样就能看出是否计算了,以及计算是否正确。

论坛徽章:
0
15 [报告]
发表于 2003-05-25 12:56 |只看该作者

vpopmail quota_warn的BUG

  vpopmail 对 maildirsize 的处理很简单,没有该文件,则 vpopmail 会自动建立,我在 iGENUS 中则每次删除文件或者增加邮件以后直接将该文件删除,省的和他打交道。

论坛徽章:
0
16 [报告]
发表于 2003-05-25 13:40 |只看该作者

vpopmail quota_warn的BUG

[quote]原帖由 "大麻"]  vpopmail 对 maildirsize 的处理很简单,没有该文件,则 vpopmail 会自动建立,我在 iGENUS 中则每次删除文件或者增加邮件以后直接将该文件删除,省的和他打交道。[/quote 发表:

??但是,这样子会使vpopmail要重新遍历用户的Maildir去计算maildirsize,如果邮件系统的很多用户在线并且收信频繁,会大大降低系统的速度。我想vpopmail搞这么个maildirsize文件目的是做cache,免得每次delivermail都去遍历Maildir目录。
??为此,我采用以下解决办法:
1、为qmail打patch:patch -0 < qmail-maildir++.patch
??使得qmail的qmail-pop3d和qmail-local支持更新maildirsize
2、为webmail客户端增加支持更新maildirsize功能,如iGENUS,需要修改:
1)folder.php
                //如果是强行删除或者删除垃圾箱,则更新maildirsize
                if ( $get_MoveTo=="force" || ($SMailbox==$DMoveTo && $get_Mailbox='trash') ){
                        list($size,$other)=split(":",$File,2);
                        list($other,$size)=split(",",$size,2);
                        list($other,$size)=split("=",$size,2);
                        if(is_numeric($size)){
                                $MaildirsizeFile="$G_HOME/Maildir/maildirsize";
                                $buff="-$size -1\n";
                                if(file_exists($MaildirsizeFile)){
                                  ($FD=fopen($MaildirsizeFile,"a") || die("Fail to open maildirsize file";
                                  fputs($FD,$buff);
                                  fclose($FD);
                                }
                        }
                       
                }
2)mailbox.php
if( $get_Cmd=='ClearTrash'){

        $Mailbox=".Trash";
        $AllMailSize = 0;
        $AllMailSum = 0;
               
        $home = $G_HOME . "/Maildir/".$Mailbox."/new";
        $handle=opendir($home);

        while (($file = readdir($handle))!==false) {
            if ($file !='.' && $file !='..' && is_file("$home/$file")
                    unlink("$home/$file";

                list($size,$other)=split(":",$file,2);
                list($other,$size)=split(",",$size,2);
                list($other,$size)=split("=",$size,2);
                if(is_numeric($size)) $AllMailSize += $size;
                $AllMailSum += 1;
        }
        closedir($handle);

        $home = $G_HOME . "/Maildir/".$Mailbox."/cur";
        $handle=opendir($home);

        while (($file = readdir($handle))!==false) {
            if ($file !='.' && $file !='..' && is_file("$home/$file")
                    unlink("$home/$file";

                list($other,$size)=split(",",$file,2);
                list($other,$size)=split("=",$size,2);
                if(is_numeric($size)) $AllMailSize += $size;
                $AllMailSum += 1;
        }
        closedir($handle);

        //Update maildirsize by lsh,2003.05.25
        $MaildirsizeFile="$G_HOME/Maildir/maildirsize";
       if(file_exists($MaildirsizeFile)){
          ($FD=fopen($MaildirsizeFile,"a") || die("Fail to open maildirsize file!";
          $buff="-$AllMailSize -$AllMailSum\n";
          fputs($FD,$buff);
          fclose($FD);
        }

        header("Location: index_form.php";
}

3)getpopmail.php
            //move mail from tmp to new
        $AllMailSize = 0;
        $AllMailSum = 0;

            foreach($FileArray as $value){
                        @link("$G_HOME/Maildir/tmp/$value",
                        "$G_HOME/Maildir/new/$value";
                        @unlink("$G_HOME/Maildir/tmp/$value");
                        list($size,$other)=split(":",$value,2);
                        list($other,$size)=split(",",$size,2);
                        list($other,$size)=split("=",$size,2);
                        if(is_numeric($size)) {
                                $AllMailSize += $size;
                                        $AllMailSum += 1;
                        }

            }
        //Update maildirsize by lsh,2003.05.25
        $MaildirsizeFile="$G_HOME/Maildir/maildirsize";
               if(file_exists($MaildirsizeFile)){
          ($FD=fopen($MaildirsizeFile,"a")) || die("Fail to open maildirsize fil
e!");
          $buff="$AllMailSize $AllMailSum\n";
          fputs($FD,$buff);
          fclose($FD);
        }//End of add

        }
       
3、如此解决maildirsize计算的问题,但是,maildirsize文件会慢慢增大,而且由于iGENUS计算MailSize和vpopmail结果有些小误差,所以我修改vpopmail的vdelivermail.c的deliver_mail()函数,使得当maildirsize文件大于1KB时,删除该文件,迫使vpopmail去遍历Maildir重新计算整个maildirsize:
char        *sizefile=(char *)malloc(strlen(address)+sizeof("/maildirsize"));//by lsh
struct stat stat_buf;//by lsh

.....

    if ( strstr(address, "/Maildir/") != NULL ) {

        /* if the user has a quota set */
        if ( strncmp(quota, "NOQUOTA", 2) != 0 ) {

          
            /* If the maildirsize is over 1KB,
             * delete it to force vpopmail to recreate maildirsize file
             * By LinShihai,2003.05.24.
             */
            strcat(strcpy(sizefile, address), "/maildirsize");
            if (stat(sizefile, &stat_buf) == 0 && S_ISREG(stat_buf.st_mode) && stat_buf.st_size>;1024)  unlink(sizefile);
            free(sizefile);

.......

??经过以上改进,现在vpopmail已经没有误报空间警告。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2003-05-25 14:14 |只看该作者

vpopmail quota_warn的BUG

好办法,很全面的解决方案。

如果能做成patch方式就好了。方便大家打补丁。

论坛徽章:
0
18 [报告]
发表于 2008-11-19 14:54 |只看该作者
偶发现,新的vpopmail 版本已解决这问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP