对Spamcontrol patch for qmail安装记录文章改进..
时间:2006-01-19 来源:hamas
Spamcontrol patch for qmail安装记录这篇文章估计不少人都看过,里面分析的非常详细具体可以说是一篇非常不错的文章,可能也有不少人按照文章中的内容进行了配置,我也是其中之一,总的来说,文章的功能大部分都实现了,但是也发现了一点小的问题,在这里写一下,也让遇到类似问题的兄弟们参考参考。
问题主要在 RECIPIENTS Extension 出现,文章里介绍了使用vchkpw认证时,需要列出所有的邮件用户到users/recipients.cdb文件中,文章里给出了两个脚本
vpopmail-alias2recipients
vpopmail-users2recipients
用处就是将 vpopmail 的 domains中的所有用户列出到recipients.cdb文件中。
:::::::::::::: 其中循环中的内容就是将vpopmail中domains目录下所有的目录列出到cdb文件中,但是根据vpopmail的maildir的工作原理,每个文件夹下面的子文件夹不会超过100个,这样可以大大加快文件检索的速度,因此,每个domians目录下的文件夹也不会超过100个,如果可能超过,vpopmail就会在添加用户时生成名字为1,2,3的以数字命名的文件夹,文件夹下面存储用户目录内容,例如:
0 dbjsn dgzdy dhnby dhnmg dhnss djlgdz djxyy dscdz dynyx maohongxia zhnsmx zqhpa zyndh
可以看到名为0,1,2,3,4,5,6的文件夹,下面是文件夹0下的内容 |
dgzkl dhnlyh djsyz dscrc dynly zgdhz zjljl zyndl
dhbjmyl dhnnl djxncds dscybs dynsz zgdst zjlys zynqj
dahhn dhbzj dhnpya djxys dsdbz dzjnb zgdsw zjsha zzjhz
dbhbbd dhljhn dhnsq dlnpj dsdhz hudong zgdts zjxsr zzjjh
dbhbxh dhljqs dhnwy dlzln dsdjn seekyu zgdyj zjxth zzjqz
dbhbxt dhljsd dhnxc1512 dlzlx dsdtz wangzhe zgxlc znmtl zzjyy
dbjsjd dhnds dhnxcsq dlzlxz dsxdt zahfy zgzgy zsxdt
dcqfl dhnhxz dhnys dlztmd dsxhr zbhbcz zhbcb zsxxy
dcqzx dhnlhz dhnyx dlzwjd dsxqx zbhbzz zhbmc zsxyl
dgdss dhnly djsrd dlzym dxaxp zcqqj zhndz zxasl
dgxbs dhnlyde djstz dqhdt dxjyn zfjqz zhnzmd zxjht
dgzgyt dhnlyds djsycqn dqhgem dynky zgdcz zjlcc zxjkt
着下面存储的就是真正的邮件用户名。
而如果按照文章中的脚本,这个目录0下的文件夹名字不可能被遍历到的,因此此类的文件夹中的用户就不会包含到recipients.cdb文件中,直接的后果就是这些用户的电子邮件由于无法通过认证而不能正常收发。
知道了错误的原因,问题就好解决了,我本人对shell脚本的编写并不了解,只能硬着头皮上,下面的是我的脚本:
#!/bin/sh
LANG=C
QMAIL=/var/qmail
VPOPMAIL=/home/vpopmail/domains
j=100
d=0
for i in `ls -l $VPOPMAIL | grep ^d | awk '{print $9}'`
do
cd $VPOPMAIL/$i
echo $VPOPMAIL/$i
ls -l | grep ^d | awk '{print $9"@localhost"}' | sed -e 's/localhost/'$i'/' | sort -u >> $QMAIL/users/recipients
VPOPMAIL1=$VPOPMAIL
d=0
while [ $d -lt $j ]
do
#VPOPMAIL="${VPOPMAIL1}/${i}/${d}"
if [ -d $VPOPMAIL1/${i}/${d} ]
then
echo $VPOPMAIL1/${i}/${d}
cd $VPOPMAIL1/${i}/${d}
ls -l | grep ^d | awk '{print $9"@localhost"}' | sed -e 's/localhost/'$i'/' | sort -u >> $QMAIL/users/recipients
fi
d=$[d+1]
done
done
其实方法很笨,就是遇到了诸如0,1一类的文件夹就进去做循环,遍历所有的子文件夹名称,这样的话如果一个域中用户不超过10000,基本可以解决问题,但是如果超过了10000,那么在/home/vpopmail/domains/aaa.com/0这类的文件夹下,又会出现0,1,2,3,4之类的字文件夹,上面的脚本就不能解决了。
如果哪位高人的shell编程好,麻烦帮助修改一下,以彻底解决这个问题。