| gadfly 回复于:2003-05-19 12:28:36 |
| 这个恐怕得pop和投递服务都得支持quota的修改。
sqwebmail和maildrop都支持。 但是让pop3和imap都支持得另外打patch |
| akid 回复于:2003-05-19 12:40:56 |
| [quote:a5213578ca="gadfly"]这个恐怕得pop和投递服务都得支持quota的修改。
但是让pop3和imap都支持得另外打patch[/quote:a5213578ca] 最好修改vpopmail,使之在发送quota_warn警告信之前重新计算maildirsize,这应该说是vpopmail的问题。 |
| akid 回复于:2003-05-19 12:55:39 |
| [quote:7807f48345="peijun.jiang"]我的也有这个问题。
如果我发一封邮件到我服务器的一个帐户,使用sqwebmail登录可以看到邮件空间占用了比如2%,如果我使用sqwebmail删除改邮件,邮件空间占用情况可以看到恢复到了0%,查看用户的maildirquota可以..........[/quote:7807f48345] 用igenus就好了,igenus是自己重新计算一遍的,不过这样会慢一点。 |
| peijun.jiang 回复于:2003-05-19 12:48:31 |
| 我的也有这个问题。
如果我发一封邮件到我服务器的一个帐户,使用sqwebmail登录可以看到邮件空间占用了比如2%,如果我使用sqwebmail删除改邮件,邮件空间占用情况可以看到恢复到了0%,查看用户的maildirquota可以看到在该封邮件记录的下面出现一个-1282 -1。但是如果我是用foxmail客户端收取改邮件,而不是使用sqwebmail删除的话,这是的sqwebmail的空间占用情况还是2%,其实这时的邮件目录下已经没有了邮件,但是不会自动恢复到0%,查看用户的maildirquota文件,在该封邮件1282 1的下面不会出现-1282 -1。 不知道maildirquota是怎样计算的◎! |
| gadfly 回复于:2003-05-19 12:48:31 |
| 你研究一下它怎么发的,可以在判断之前,删除或这个文件看看 |
| ljjsys 回复于:2003-05-22 15:12:35 |
| 去掉.qmail就正常了.
可以如何让.qmail存在,计算空间又正确呢? |
| 大麻 回复于:2003-05-22 15:29:25 |
| 我最近也被 maildirsize 搞的头痛,不知道 courier 和 vpopmail 对这个文件是怎么考虑的,没有必要搞的那么复杂嘛!我在程序里面干脆直接把这个文件每次都删除,反正 vpopmail 会自己建立。 |
| 笨笨鸟 回复于:2003-05-22 16:13:20 |
| 可以修改源文件,更改计算方式。 |
| akid 回复于:2003-05-23 00:55:32 |
| [quote:2d947525fc="ljjsys"]去掉.qmail就正常了.
可以如何让.qmail存在,计算空间又正确呢?[/quote:2d947525fc] 跟.qmail的存在有什么关系呢? |
| akid 回复于:2003-05-23 01:05:20 |
| [quote:10ed1ade12="大麻"] 我最近也被 maildirsize 搞的头痛,不知道 courier 和 vpopmail 对这个文件是怎么考虑的,没有必要搞的那么复杂嘛!我在程序里面干脆直接把这个文件每次都删除,反正 vpopmail 会自己建立。[/quote:10ed1ade12]
大麻可以改folder.php里,根据要删掉的mail文件的文件名得到quota_size,加个负号append到maildirsize文件后面,然后再unlink掉这个文件。对qmail打完maildir++patch是这样的结果。 ??不过用这样的办法,maildirsize文件会慢慢增大,什么时候vpopmail才会自动总结一下? ??vpopmail的源代码读起来不爽,我觉得代码写得比较乱。如user_over_maildirquota()函数,看名字应该只是判断用户是否超过负载空间,但是细看这个函数内容,里面竟还有对maildir_addquota()的调用,而这完全应该移到vdelivermail()里去调用的!真是郁闷! |
| akid 回复于:2003-05-23 01:16:47 |
| [quote:d78c6c1e86="笨笨鸟"]可以修改源文件,更改计算方式。[/quote:d78c6c1e86]
看不懂怎么改,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! |
| 大麻 回复于:2003-05-25 12:56:03 |
| vpopmail 对 maildirsize 的处理很简单,没有该文件,则 vpopmail 会自动建立,我在 iGENUS 中则每次删除文件或者增加邮件以后直接将该文件删除,省的和他打交道。 |
| akid 回复于:2003-05-24 18:09:02 |
| 不知道各位有没有碰到和小弟这样的问题?
怎么没有人在意啊? |
| gadfly 回复于:2003-05-25 09:03:19 |
| 建议你调试一下,写写日志,例如记录一下计算前后的数值。
这样就能看出是否计算了,以及计算是否正确。 |
| akid 回复于:2003-05-25 13:40:42 |
| [quote:e9ddd08f34="大麻"] vpopmail 对 maildirsize 的处理很简单,没有该文件,则 vpopmail 会自动建立,我在 iGENUS 中则每次删除文件或者增加邮件以后直接将该文件删除,省的和他打交道。[/quote:e9ddd08f34]
??但是,这样子会使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已经没有误报空间警告。 |
| gadfly 回复于:2003-05-25 14:14:50 |
| 好办法,很全面的解决方案。
如果能做成patch方式就好了。方便大家打补丁。 |