免费注册 查看新帖 |

Chinaunix

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

[Mail] 关于vpopmail的domain disk quota限制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-09 17:36 |只看该作者 |倒序浏览
前阵子论坛上因为这个问题引发了一场很激烈的争吵或者说是吵架,
我一时好奇, 就架设了一个环境折腾了一下, 发表本贴不代表
偶支持或反对前阵子争论中的任何一方的非技术观点.

1) 架设环境:
完全模拟问题提出者的环境:
mysql-standard-4.0.20-pc-linux-i686.tar.gz
autorespond-2.0.2         
qmail-1.03
ezmlm-0.53               
qmailadmin-1.2.2
ucspi-tcp-0.88
ezmlm-idx-0.40            
vpopmail-5.4.4

相关configure如下:
a. vpopmail(严格参考源代码目录下的README.mysql)
./configure --enable-auth-module=mysql --disable-passwd --enable-clear-passwd --disable-many-domain --enable-auth-logging --enable-mysql-logging --enable-valias --disable-mysql-limits --enable-incdir=/usr/local/mysql/include --enable-libdir=/usr/local/mysql/lib --enable-passwd=n --enable-domainquotas=y --enable-tcprules-prog=/usr/local/bin/tcprules --enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp --enable-vpopuser=vpopmail --enable-vpopgroup=vchkpw --enable-ip-alias-domains=n  --enable-auth-module=mysql

b.
./configure --enable-cgibindir=/usr/local/httpd/cgi-bin --enable-htmldir=/usr/local/httpd/htdocs --enable-ezmlmdir=/var/qmail/bin/ezmlm --enable-autoresponder-bin=/var/qmail/bin/autorespond --enable-modify-quota=y --enable-help --enable-domain-autofill


2) 测试:
        建立虚拟域qmailcn.org.
        建立用户ylei和test, 限额分别为1M, 2M, 域qmailcn.org的限额为1M
                1) ylei给test发送超过1M的附件, 日志显示: domain is over quota
                2) 反弹回邮件给ylei, 日志显示: user is over quota(不再做domain quota check)
                3) 再次bouce给postmaster(无限额), 日志显示:domain is over quota
               
        发现问题:
                限制(用户quota和域quota)功能OK, 设置/修改用户quota时未考虑当前用户的总quota超过域quota限制.
               
               
3) 解决:
        a) 新版本vpopmail和qmailadmin
                vpopmail        NOT 5.4.6 5.5.0 NO
                qmailadmin        1.2.2最新版本  NO
        b) 搜索patch   NO
        b) 自己patch
       
        diff  vpopmail.h vpopmail.h.mod
        diff  vpopmail.c vpopmail.c.mod
       
对vpopmail.h的修改:
109c109
< int vadduser( char *, char *, char *, char *, int);
---
>; int vadduser( char *, char *, char *, char *, int, char*);       
       
       
对vpopmail.c的修改:
437c437
<               int apop )
---
>;               int apop , char* userquota)
445a446,449
>;  char* newquota = NULL;
>;  struct vqpasswd* mypw = NULL;
>;  int  curquota = 0, totalquota = 0;
>;  int  first = 1, len = 0;
481a486,521
>; // 如果该域指定了domain disk quota, 才对增加用户时的用户quota做限制.
>;     if (limits.diskquota != 0)
>;     {
>;       if (userquota != NULL)
>;       {       // 即使是postmaster也不能NOQUOTA
>;           if (strcmp(userquota, "NOQUOTA" == 0)
>;           {
>;               printf("can't set NOQUOTA, domain disk quota: %dM\n", limits.diskquota);
>;               return(VA_NULL_POINTER);
>;           } else {
>;               curquota = atoi(userquota);
>;           }
>;       }
>;       // 获取域的当前所有用户的quota之和(以字节计数)
>;       while ((mypw = vauth_getall(domain, first, 1)) != NULL)
>;       {
>;           first = 0;
>;           len = strlen(mypw->;pw_shell);
>;           newquota = (char *)malloc(len+1);
>;           if (!newquota)
>;               return(VA_NULL_POINTER);
>;           memcpy(newquota, mypw->;pw_shell, len);
>;           newquota[len-1] = '\0';
>;           totalquota += atoi(newquota);
>;           free(newquota);
>;       }
>;
>;       // 配置文件中domain disk quota以Mbytes计数
>;       if ((totalquota + curquota)/1024/1024 >; limits.diskquota)
>;       {
>;           printf("over domain disk quota: %dM\n", limits.diskquota);
>;           return(VA_NULL_POINTER);
>;       }
>;     }
>;
>;
1562a1603
>;   printf("quota: %s; formattedquota: %s\n", quota, formattedquota);       


注意:
        对vpopmail和qmailadmin代码不怎么熟悉, 临时研究了一下, 主要只是想
        能让vadduser添加用户时限制用户总quota不能超过domain disk quota.
        所以很多其他调用vadduser()的地方没考虑. 所以要应用本patch, 得先
        完全编译好vpopmail代码生成相应的二进制程序后, 再应用本patch, 才
        能使得vadduser具有相应功能, 否则, 无法编译通过vpopmail.
       
        跟该问题相关的地方:
                qmailadmin 添加/修改用户
                vpopmail 添加/修改用户
                vpopmail 添加域(生成postmaster用户)
                ...其他...
               
        不考虑修改domain disk quota时检查当前所有用户的quota总和.
       
        如果domain disk quota设置, 该domain内所有用户都得限制quota, 包括postmaster.
       
再次申明:       
        vpopmail/qmailadmin玩得不多, 与quota相关的很多功能都不熟悉, 所以考虑quota
        时很可能顾此失彼, 欢迎指正.
        写这个东西也只是玩一玩, 了解一下vpopmail/qmailadmin, 共同探讨交流, 不是为了让
        大家获取一个成熟可用的东西, 所以, 一切风险自负.

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

关于vpopmail的domain disk quota限制

谢谢楼主资源共享
你的版本和我现在试验的一摸一样:)

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

关于vpopmail的domain disk quota限制

我的邮件系统可以防止用户超过QUOTA ,一旦超过,用户就无法收到邮件,但在用户邮箱大小达90%却不提示?
如何实现提示,请大家指正。


我的环境如下:
REDHAT   AS3
vpopMAIL  5.4.5
QMAILAdmin 1.2.1

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

关于vpopmail的domain disk quota限制

原帖由 "jtzhao" 发表:
我的邮件系统可以防止用户超过QUOTA ,一旦超过,用户就无法收到邮件,但在用户邮箱大小达90%却不提示?
如何实现提示,请大家指正。


我的环境如下:
REDHAT   AS3
vpopMAIL  5.4.5
QMAILAdmin 1.2.1


你可以自己用printf在vpopmail代码里跟踪一下,相应代码如下:

vdelivermail ->; checkuser() ->; deliver_mail():

            if (QUOTA_WARN_PERCENT >;= 0 &&
                vmaildir_readquota(address, format_maildirquota(quota))
                    >;= QUOTA_WARN_PERCENT) {
                deliver_quota_warning(address, format_maildirquota(quota));
            }

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

关于vpopmail的domain disk quota限制

mail1# more .quotawarn.msg
X-Comment: Rename/Copy this file to ~vpopmail/domains/.quotawarn.msg, and make appropriate changes
X-Comment: See README.quotas for more information
From: Mail Delivery System <Mailer-Daemon@example.com>;
Reply-To: support@example.com
To: Valued Customer:;
Subject: Mail quota warning
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit

Your mailbox on the server is now more than 90% full. So that you can continue
to receive mail you need to remove some messages from your mailbox.

原帖由 "jtzhao" 发表:
我的邮件系统可以防止用户超过QUOTA ,一旦超过,用户就无法收到邮件,但在用户邮箱大小达90%却不提示?
如何实现提示,请大家指正。


我的环境如下:
REDHAT   AS3
vpopMAIL  5.4.5
QMAILAdmin 1.2.1

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

关于vpopmail的domain disk quota限制

原帖由 "jtzhao" 发表:
我的邮件系统可以防止用户超过QUOTA ,一旦超过,用户就无法收到邮件,但在用户邮箱大小达90%却不提示?
如何实现提示,请大家指正。


我的环境如下:
REDHAT   AS3
vpopMAIL  5.4.5
QMAILAdmin 1.2.1


我知道原因。不过做起来很累。实际上这是一个BUG

论坛徽章:
0
7 [报告]
发表于 2004-09-10 10:27 |只看该作者

关于vpopmail的domain disk quota限制

xiaohua,反正quota问题不少,好象vpopmail他们至今也没有太成熟的解决。不过qmail-chkuser PATCH中有QUOTA PATCH。我没有仔细研究,代码不少,估计可以解决不少问题。

论坛徽章:
0
8 [报告]
发表于 2004-09-10 10:43 |只看该作者

关于vpopmail的domain disk quota限制

[quote]原帖由 "思一克"]xiaohua,反正quota问题不少,好象vpopmail他们至今也没有太成熟的解决。不过qmail-chkuser PATCH中有QUOTA PATCH。我没有仔细研究,代码不少,估计可以解决不少问题。[/quote 发表:


我在vpopmail mailist archive中搜索过, 关于domain disk quota not work的问题也有好些,不过没有答案。感觉vpopmail的代码挺乱的,
函数功能的模块化做得不好,改动起来比较麻烦。

PS:qmail-chkuser中没有QUOTA相关内容,只是检查rcpt to用户是否
为本地合法用户。如果你指的是这里的PATCH的话:
http://www.interazioni.it/qmail/#Description

前阵子论坛上有人问这个PATCH是干嘛的,我当时看了一下。

你说的那个QUOTA PATCH应该是qmailadmin with domain pooled quota , 是基于qmailadmin-1.0.0版本的, 1.2.2早就包括这个PATCH
的代码了。

论坛徽章:
0
9 [报告]
发表于 2004-09-10 10:48 |只看该作者

关于vpopmail的domain disk quota限制

nsinit,  我知道CHKUSER是做那个的。但他做的不好(我自己觉得),他调VPOPMAIL库,将QMAIL-STMPD从40K搞到了100K。因此我自己实现了一个。

我指的是有个PATCH (bundle), CHKUSER为主,里面有quota patch. 如果找,我还可以找到。

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

关于vpopmail的domain disk quota限制

是这个patch包:

qmail-toaster-0.6-1.patch.bz2
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP