- 论坛徽章:
- 0
|
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>;
谁帮我能解释一下啊!! |
|