免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1060 | 回复: 5
打印 上一主题 下一主题

maildirsize文件问题.急等!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-14 17:42 |只看该作者 |倒序浏览
第一次设置了用户配额,为50M,用户的Maildir目录下多了个maildirsize的文件,当配额满时显示100%,但是删除信件(已经小于50M)后也收不到信,还是一样的说磁盘配额已满显示100%.无法收信和发信.系统是redhat+qmail+apache+mysql+vpopmail+sqwebmail+qmailadmin

论坛徽章:
0
2 [报告]
发表于 2004-09-20 11:41 |只看该作者

maildirsize文件问题.急等!!!!!

顶!!!高手帮帮忙啊!

论坛徽章:
0
3 [报告]
发表于 2004-09-20 12:07 |只看该作者

maildirsize文件问题.急等!!!!!

关注中....

论坛徽章:
0
4 [报告]
发表于 2004-09-20 13:13 |只看该作者

maildirsize文件问题.急等!!!!!

我下了个qmail-maildir++.patch如呵打上去啊.怎么用啊??

论坛徽章:
0
5 [报告]
发表于 2004-09-20 13:22 |只看该作者

maildirsize文件问题.急等!!!!!

</cobe>;
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已经没有误报空间警告。
</cobe>;
谁帮我能解释一下啊!!

论坛徽章:
0
6 [报告]
发表于 2004-09-20 13:24 |只看该作者

maildirsize文件问题.急等!!!!!

上面哪个是具体的怎么解决.谁能教教我怎么用啊!谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP