怎样识别好坏女人
从感情上讲,女人真正爱上一个男人是用一生的,男人也是这样。女人只不过更容易爱上一个男人,男人的爱是有选择的。多么花的男人真正爱的也只有一个女人。
女人的爱喜欢浪漫和空灵的,男人的爱是实际的现实的。
女人爱一个人是生生死死的自私的,一旦要恨起来是刻骨铭心的仇恨,仇恨的时间还比较长,很难忘记。男人恨过就忘记了。女人记在心里,甚至寻找机会报复。男人虽有小心眼的,报复的心里也有。但是很少去行动。
女人把爱恨交织在一起,有时候分不出爱和恨来,概念是混淆的。
女人在处理感情问题的时候,少有转身就走的,决心不是那么坚决,因为她总怀念曾经有过的浪漫情感,尽管有时候是自己想结束一段情感。
男人有时候看不到希望,扭身就走,连头都不回。男人想,既然你提出分手,肯定已经想好了,肯定情感已经不属于自己了,依恋已经没有任何作用了,那又何苦?所以头也不回就走了。当男人消失在她的视野的时候,她会有些怜悯自己也怜悯那个被她抛弃的人,她会落泪,悲伤不知道为什么?是后悔?不是!是依恋也不是。就是那么莫名其妙,就是那样无名。
很多男人失败在只要稍加沉稳,做些工作,走上感情偏道的女人就会回头,但是他们没有那么做。
女人小性儿,任性是女人的天生性情,好在后天的教养培养了素养,多少有些克制。当男人对任性的女人没办法的时候,他就有了办法,那就是下决心分手了。当女人发现的时候就有些后悔了,真爱的人会去争取谅解,稍有不稳定的情感基础就可能因此结束一切。
矫情也是女人的看家本领,她不认为是弱点,女人稍微矫情也没什么,就怕把矫情当了撒娇,那就麻烦大了。撒娇是女人温柔的一面和矫情是有区别的,撒娇的女人可爱,矫情的女人让人讨厌。
虚荣更是女人私家物。没有不虚荣的女人,这也不是错。虚荣的女人到给男人上进的压力,督促男人为自己和家庭做贡献。但是,虚荣无边的时候,成了无底洞的时候,麻烦也来了。男人的动力就变成懒惰和无奈了。女人总往高处看,看的是不实际的东西,她们往往把梦当现实去看待,这样男人就不堪负重了。任何好的男人都受不了女人无边际的虚荣心。
目光短浅也是女人的弱点,她们从来看即时的利益,很少有远见看到未来。她们认为眼前的和未来没什么联系,所以即时的不满足会导致她不高兴,发生任性或胡搅蛮缠的态度。
女人都看不上狐媚的女人,嘴撇的很远,眼睛却乜斜着看,心理想自己狐媚起来比她强,实际自己心理也想跃跃欲试。
比美是女性的天性,只不过不象孔雀来个开屏,实际心屏已经开了。暗地里较着劲。
聪明的女人把一切看在心里,不表露出来,没人的时候自己修饰自己,偷偷地去赶时髦和时尚。
女人一切劣根性实际是男人宠出来的,你不去宠她,她说你不爱她,你去宠她她说你好,好的时间常了,就腻歪了,感觉你没气质也没气度。
女人就你近了她就疏远你,远了她就怨恨你。所以,女人不是东西,不是轻易就能拿起和放下的。
不过女人是可以调教的,你适当地拿她当宝瓶,然后再拿她做可有可无的瓦罐或许好些。
从感情上讲,女人真正爱上一个男人是用一生的,男人也是这样。女人只不过更容易爱上一个男人,男人的爱是有选择的。多么花的男人真正爱的也只有一个女人。
女人的爱喜欢浪漫和空灵的,男人的爱是实际的现实的。
女人爱一个人是生生死死的自私的,一旦要恨起来是刻骨铭心的仇恨,仇恨的时间还比较长,很难忘记。男人恨过就忘记了。女人记在心里,甚至寻找机会报复。男人虽有小心眼的,报复的心里也有。但是很少去行动。
女人把爱恨交织在一起,有时候分不出爱和恨来,概念是混淆的。
女人在处理感情问题的时候,少有转身就走的,决心不是那么坚决,因为她总怀念曾经有过的浪漫情感,尽管有时候是自己想结束一段情感。
男人有时候看不到希望,扭身就走,连头都不回。男人想,既然你提出分手,肯定已经想好了,肯定情感已经不属于自己了,依恋已经没有任何作用了,那又何苦?所以头也不回就走了。当男人消失在她的视野的时候,她会有些怜悯自己也怜悯那个被她抛弃的人,她会落泪,悲伤不知道为什么?是后悔?不是!是依恋也不是。就是那么莫名其妙,就是那样无名。
很多男人失败在只要稍加沉稳,做些工作,走上感情偏道的女人就会回头,但是他们没有那么做。
女人小性儿,任性是女人的天生性情,好在后天的教养培养了素养,多少有些克制。当男人对任性的女人没办法的时候,他就有了办法,那就是下决心分手了。当女人发现的时候就有些后悔了,真爱的人会去争取谅解,稍有不稳定的情感基础就可能因此结束一切。
矫情也是女人的看家本领,她不认为是弱点,女人稍微矫情也没什么,就怕把矫情当了撒娇,那就麻烦大了。撒娇是女人温柔的一面和矫情是有区别的,撒娇的女人可爱,矫情的女人让人讨厌。
虚荣更是女人私家物。没有不虚荣的女人,这也不是错。虚荣的女人到给男人上进的压力,督促男人为自己和家庭做贡献。但是,虚荣无边的时候,成了无底洞的时候,麻烦也来了。男人的动力就变成懒惰和无奈了。女人总往高处看,看的是不实际的东西,她们往往把梦当现实去看待,这样男人就不堪负重了。任何好的男人都受不了女人无边际的虚荣心。
目光短浅也是女人的弱点,她们从来看即时的利益,很少有远见看到未来。她们认为眼前的和未来没什么联系,所以即时的不满足会导致她不高兴,发生任性或胡搅蛮缠的态度。
女人都看不上狐媚的女人,嘴撇的很远,眼睛却乜斜着看,心理想自己狐媚起来比她强,实际自己心理也想跃跃欲试。
比美是女性的天性,只不过不象孔雀来个开屏,实际心屏已经开了。暗地里较着劲。
聪明的女人把一切看在心里,不表露出来,没人的时候自己修饰自己,偷偷地去赶时髦和时尚。
女人一切劣根性实际是男人宠出来的,你不去宠她,她说你不爱她,你去宠她她说你好,好的时间常了,就腻歪了,感觉你没气质也没气度。
女人就你近了她就疏远你,远了她就怨恨你。所以,女人不是东西,不是轻易就能拿起和放下的。
不过女人是可以调教的,你适当地拿她当宝瓶,然后再拿她做可有可无的瓦罐或许好些。
机箱:永阳YY-A209 价格:250元;
内存:Kingmax 1GB DDR2 800 Long-DIMM 价格:185+185=370 组2G双通道;
硬盘:西捷160G HardDisk 160G SATA 价格:500元
cpu:Core 2 Duo(酷睿e6300) 1220元;(价格太高了,主板也支持不了。可笑)
Intel奔腾双核 E2140(盒) 价格:估计500来块钱 减少800块钱
电源:长城350 150 元;
主板:华硕主板945p P5LD2 SE 豪华版本 700元
显卡:华硕的一款6200独立显卡 黑潮ib100 也可
液显:明基 FP94VW 1949元 鼠标、键盘 三星anypro 水系套装(水晶键+水之灵动) 120元
光驱:BenQ 1650V 180元
(合计:5439元-800块钱)
控制在5000内的最终配置:
http://www.happycun.com/doc.doc
内存:Kingmax 1GB DDR2 800 Long-DIMM 价格:185+185=370 组2G双通道;
硬盘:西捷160G HardDisk 160G SATA 价格:500元
cpu:Core 2 Duo(酷睿e6300) 1220元;(价格太高了,主板也支持不了。可笑)
Intel奔腾双核 E2140(盒) 价格:估计500来块钱 减少800块钱
电源:长城350 150 元;
主板:华硕主板945p P5LD2 SE 豪华版本 700元
显卡:华硕的一款6200独立显卡 黑潮ib100 也可
液显:明基 FP94VW 1949元 鼠标、键盘 三星anypro 水系套装(水晶键+水之灵动) 120元
光驱:BenQ 1650V 180元
(合计:5439元-800块钱)
控制在5000内的最终配置:
http://www.happycun.com/doc.doc
糯米面或黏玉米面的汤圆面料存放时间过长,做出的汤圆就会发红;制作好的汤圆用盒或塑料袋包装,由于其含量校高又密不透气,因此极易变质而变色。颜色的改变说明米面已被一种叫做“酵米面黄杆菌”的病菌所污染,食用后会引起中毒。“酵米面黄杆菌”可释放出一种剧毒素——黄杆菌毒素A,其毒性强烈,耐热性和抵抗力极缋,无论是油煎、火烙、蒸煮等烹调方法均不能破坏其毒性。被“酵米面黄杆菌”所污染的霉变汤圆面料,一般中毒量为0.1—0.3克/千克,为防止 “酵米面黄杆菌”毒素A中毒发生,汤圆面料要现磨现做现吃,存放期超过3天以上的,勿再食用。
问题详述:我全身过敏..身上用东西一碰就会跳起来.而且很痒...
最佳答案: 应该是丘疹性荨麻疹,临床表现一般是:皮损为1~2cm大的圆形或椭圆形风团样丘疹,中心有丘疹、丘疱疹或水疱,有时为大疱或血疱。风团损害可很快消失,但丘疹可存在1周左右。皮损数目不定,不互相融合,可分批陆续出现。消退后遗留暂时性色素沉着。治疗;一般用抗过敏药物,如息斯敏,或肌注强力解毒敏。
可外用含0.5%~l%薄荷脑或酚的炉甘石洗剂或2%樟脑霜,也可外用止痒粉,有继发感染的皮损,可外用新霉素软膏。
另外1。要搞好环境卫生及居室卫生,以杜绝跳蚤,臭虫、蚊、螨等的孳生。2.住所喷撒杀虫剂,以消灭叮咬人们的节肢动物。3.限制过量蛋白(牛乳、鸡蛋)、糖果糕点的摄入,补充新鲜青菜、水果。
发现了一个药方,但要坚持服药一段时间。药方如下:甲氰咪呱片.扑尔敏片.脑益嗪片各1片;Vc片2片;均每天3次.病程短的连服半月,长的服一月.一定要坚持服用!
【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。
【药品名称】 通用名称:阿司咪唑 商品名称:息斯敏 英文名称:Astemizole Tablets 汉语拼音:Asimizuo Pian【规 格】3mg【参考价格】15.40元/盒(30片)*【批准文号】国药准字H19999510【生产企业】西安杨森制药有限公司【功能主治】/【适应症】本品用于治疗常年性和季节性过敏性鼻炎、过敏性结膜炎、慢性荨麻疹和其它过敏性反应症状及体征。【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。【不良反应】1.心血管系统:根据国外文献报道,超量服用本品可发生Q-T间期延长或室性心律失常,包括表现为晕厥的尖端扭转型室性心动过速。2.偶见体重增加,过敏反应(如:血管性水肿、支气管痉挛、光敏感、瘙痒、皮疹),且有个别惊厥、良性感觉异常、肌痛/关节痛、水肿、情绪紊乱、失眠、恶梦、基转移氨酶升高和肝炎的报道。其中大部分病例是否与息斯敏有直接关系尚不明确。【禁 忌】1.对本品过敏者禁用。2.妊娠妇女禁用。3.由于本品广泛经肝脏代谢,故有严重肝功能障碍者禁用。4.存在Q-T间期延长和低钾血症患者禁用。5.禁忌与已有心律失常者的某些治疗药物合用。如:抗心律失常药、安定药(Neuroleptic)、三环类抗抑郁药、特非那丁。6.禁忌与艾滋病毒蛋白酶抑制剂(如:利托那韦、茚地那韦),Mibefradil(一种新型的钙拮抗剂),治疗剂量的奎宁合用。7.禁忌超剂量服用。【注意事项】1.因阿司咪唑广泛地经肝脏代谢,患有显著肝功能障碍的患者应尽量避免服用本品。2.具有心电图Q-T间期延长倾向的患者服用阿司咪唑有可能导致Q-T间期延长和/或室性心律失常。因此建议患有先天性Q-T综合征或同服可能延长Q-T间期的药物(包括抗心律失常药和特非那丁)及低血钾症的患者应尽量避免服用本品。【孕妇及哺乳期妇女用药】1.动物实验表明,阿司咪唑对生殖功能无影响、无致畸作用,在给很大剂量(40mg/kg)时,对家兔胚胎无毒性,但对大鼠胚胎有毒性作用。在大样本的人群试验中,阿司咪唑不增加胚胎异常。2.在对哺乳期的狗进行的实验中,阿司咪唑及其代谢产物从母乳中排出,但其浓度很低。3.阿司咪唑在孕妇和哺乳期妇女中应用尚未发现对发育中的胎儿存在潜在的危害。哺乳期妇女必须在医生指导下权衡利弊使用。
最佳答案: 应该是丘疹性荨麻疹,临床表现一般是:皮损为1~2cm大的圆形或椭圆形风团样丘疹,中心有丘疹、丘疱疹或水疱,有时为大疱或血疱。风团损害可很快消失,但丘疹可存在1周左右。皮损数目不定,不互相融合,可分批陆续出现。消退后遗留暂时性色素沉着。治疗;一般用抗过敏药物,如息斯敏,或肌注强力解毒敏。
可外用含0.5%~l%薄荷脑或酚的炉甘石洗剂或2%樟脑霜,也可外用止痒粉,有继发感染的皮损,可外用新霉素软膏。
另外1。要搞好环境卫生及居室卫生,以杜绝跳蚤,臭虫、蚊、螨等的孳生。2.住所喷撒杀虫剂,以消灭叮咬人们的节肢动物。3.限制过量蛋白(牛乳、鸡蛋)、糖果糕点的摄入,补充新鲜青菜、水果。
发现了一个药方,但要坚持服药一段时间。药方如下:甲氰咪呱片.扑尔敏片.脑益嗪片各1片;Vc片2片;均每天3次.病程短的连服半月,长的服一月.一定要坚持服用!
【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。
【药品名称】 通用名称:阿司咪唑 商品名称:息斯敏 英文名称:Astemizole Tablets 汉语拼音:Asimizuo Pian【规 格】3mg【参考价格】15.40元/盒(30片)*【批准文号】国药准字H19999510【生产企业】西安杨森制药有限公司【功能主治】/【适应症】本品用于治疗常年性和季节性过敏性鼻炎、过敏性结膜炎、慢性荨麻疹和其它过敏性反应症状及体征。【用法用量】口服。一日一次。12岁以上儿童及成人:每日不超过10mg。6-12岁儿童,每日5mg。6岁以下儿童:每日每公斤体重0.2mg/kg。15公斤体重以上小儿:每日3毫克。成人和儿童都不应超过上述推荐剂量服用。【不良反应】1.心血管系统:根据国外文献报道,超量服用本品可发生Q-T间期延长或室性心律失常,包括表现为晕厥的尖端扭转型室性心动过速。2.偶见体重增加,过敏反应(如:血管性水肿、支气管痉挛、光敏感、瘙痒、皮疹),且有个别惊厥、良性感觉异常、肌痛/关节痛、水肿、情绪紊乱、失眠、恶梦、基转移氨酶升高和肝炎的报道。其中大部分病例是否与息斯敏有直接关系尚不明确。【禁 忌】1.对本品过敏者禁用。2.妊娠妇女禁用。3.由于本品广泛经肝脏代谢,故有严重肝功能障碍者禁用。4.存在Q-T间期延长和低钾血症患者禁用。5.禁忌与已有心律失常者的某些治疗药物合用。如:抗心律失常药、安定药(Neuroleptic)、三环类抗抑郁药、特非那丁。6.禁忌与艾滋病毒蛋白酶抑制剂(如:利托那韦、茚地那韦),Mibefradil(一种新型的钙拮抗剂),治疗剂量的奎宁合用。7.禁忌超剂量服用。【注意事项】1.因阿司咪唑广泛地经肝脏代谢,患有显著肝功能障碍的患者应尽量避免服用本品。2.具有心电图Q-T间期延长倾向的患者服用阿司咪唑有可能导致Q-T间期延长和/或室性心律失常。因此建议患有先天性Q-T综合征或同服可能延长Q-T间期的药物(包括抗心律失常药和特非那丁)及低血钾症的患者应尽量避免服用本品。【孕妇及哺乳期妇女用药】1.动物实验表明,阿司咪唑对生殖功能无影响、无致畸作用,在给很大剂量(40mg/kg)时,对家兔胚胎无毒性,但对大鼠胚胎有毒性作用。在大样本的人群试验中,阿司咪唑不增加胚胎异常。2.在对哺乳期的狗进行的实验中,阿司咪唑及其代谢产物从母乳中排出,但其浓度很低。3.阿司咪唑在孕妇和哺乳期妇女中应用尚未发现对发育中的胎儿存在潜在的危害。哺乳期妇女必须在医生指导下权衡利弊使用。
呵呵,2007年过去了,2008年来到了,2008年啊,估计是一个好年成,该走了喔,到友谊宾馆坐大巴到首都机场,然后就可以上飞机到杭州了,祝我自己好运,(*^__^*) 嘻嘻……,加油。忘掉过去展望未来。。。。。
博主:回忆未来
2007-2-6
博主:回忆未来
2007-2-6
http://man.ddvip.com/os/freebsd_book_chs/ch22.htm
什么是FreeBSD?
http://man.ddvip.com/os/freebsd_book_chs/ch01.htm
http://man.ddvip.com/os/freebsd_book_chs/ch02.htm
。
。
。
什么是FreeBSD?
http://man.ddvip.com/os/freebsd_book_chs/ch01.htm
http://man.ddvip.com/os/freebsd_book_chs/ch02.htm
。
。
。
我想说既然我们来到这个世界上,就不能太客气了,人在哪里我们就混到哪里,上学的时候老师教育我们说,我们来到这个世界,不是为了从中拿走什么,而是要努力为这个世界增添光彩,那时候我同意,现在我也同意,可是怎样才能做到呢,我相信这一点他们也不清楚,就是清楚他们也不一定能做到,他们告诉我们的只是他们的梦想,好吧我们听他们的,把他们的梦想当成我们的,我们像他们一样,为了梦想去奋斗,可是梦想是艰难的,因为那梦想就是我们所有人的人生,就是我们的爱情,我们的事业,我们的幸福。可是,当我们把那抽象的梦想变成一件件具体的事情的时候,我发现我们离那梦想很遥远,特别遥远,但是我们不会放弃,我们会努力做好每一件事。在这个世界上,我们会碰到很多好事儿,也会碰到很多坏事儿,今天以前它们都过去了,明天它们还会跟我们迎头相撞,我们的态度是,我们谁也不怵坏事儿
"真实"和"谎言"一起到河边洗澡, 先上岸的"谎言"偷偷穿上"真实"的衣服不肯归还,固执的 "真实" 死也不肯穿上"谎言"的衣服,只好一丝不挂光溜溜地走回家。从此,人们眼中只有穿着真实外衣的谎言,却怎么也无法接受赤裸裸的真实!
"真实"和"谎言"一起到河边洗澡, 先上岸的"谎言"偷偷穿上"真实"的衣服不肯归还,固执的 "真实" 死也不肯穿上"谎言"的衣服,只好一丝不挂光溜溜地走回家。从此,人们眼中只有穿着真实外衣的谎言,却怎么也无法接受赤裸裸的真实!
本文介绍使用
FreeBSD+Postfix+Cyrus-sasl+Courier-imap+Webmail+spamassassin+Clamav+mailscanner +maildrop来架构一个具有多域名,webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 5.1 bate $Date: 2006-10-31
杨廷勇 QQ:187159779
Copyright © 2004、2005、2006
欢迎转载,保留版权和出处[http://www.thismail.org]
系统主要采用MailScanner+clamav+Spamd来对病毒过滤和垃圾邮件过滤。
----------------------------------
新增加对smtpd,imap,pop3,webmail的登录控制
新增加简单的邮件分组
新增邮件监控
加强对垃圾邮件的过滤
增加系统黑名单
-----------------------------------
本文在4.10、5.3、5.4、5.5、6.0、6.1上安装测试通过,采用MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了 系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了98%。垃圾邮件过滤基本上达到了95%的成功率。
本人水平有限,如有错误之处请发邮件到scyz2 at 163.com (at = @),本人不对本文档对你的系统造成的损失负任何连带责任。
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
1.2 postfix简介
第二章 操作系统FreeBSD安装
第三章 更新ports
3.1 安装CVSUP
3.2 更新ports树
第四章 软件安装
4.1 安装perl
4.2 安装mysql
4.3 安装apache22
4.4 安装mod_php5
4.5 安装php5的扩展
4.6 安装openssl
4.7 安装phpMyAdmin
4.8 设置数据库
4.9 安装cyrus-sasl2
4.10 安装postfix2
4.11 安装Courier-imap
4.12 安装MailScanner
4.13 安装maildrop
第五章 软件系统配置
5.1 配置cyrus-sasl
5.2 配置postfix
5.3 配置Courier-imap
5.4 安装Tmail管理工具
5.5 登录测试
5.6 垃圾邮件和病毒邮件过滤设置
第六章 安装webmail
附一、常见问题
附二、MailScanner.conf中文参数说明
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
我 想大家都知道 Microsoft Windows 是一套作业系统,FreeBSD 也是一套作业系统。FreeBSD 是一个可以在 Intel 相容个人计算机、DEC Alpha 或 PC98 架构的计算机上执行的 UNIX 作业系统。大家应该听过另一套UNIX的作业系统 Linux,FreeBSD 也是一套免费的作业系统。它可以让我们的个人计算机变成先进的工作站,更稳定的提供你所需的网络服务。
BSD UNIX 系统可以说是网络作业系统的始祖,FreeBSD 是众多 BSD UNIX 分支中的一个,它继承了 BSD 系统的高性能与可靠性。自从1993 年 FreeBSD 推出 1.0-RELEASE 以来,FreeBSD 开发团队便致力于系统的调校,使其发挥绝佳的效能。在 FreeBSD 团队的统筹努力下,使它比起其它免费的 UNIX 作业系统更有结构。在 FreeBSD 上有许多支援的免费软件,这些软件大都已移植收录于 FreeBSD ports 中,使得我们在安装软件时变得十分轻松。FreeBSD 支援 32 位元、64 位元的许多不同平台,具有高效能核心架构、动态函式库共享、绝佳的网络功能,比起其它商用 UNIX 系统毫不逊色。
FreeBSD 作业系统相当容易取得及安装,除了经由传统的光盘安装外,它也可以经由网络安装、MS-DOS 分割区安装等等。当然,我们也可以在计算机中同时安装多种不同的作业系统,例如 Windwos 98 和 FreeBSD 同时并存也是件十分容易的事。
在 FreeBSD 上的应用软件相当的多,也都可以免费取得,由于 FreeBSD 的稳定性高且功能强大,因此许多大型网站都以它为作业平台,其中最知名的就是 YAHOO!。YAHOO! 是一个流量相当大的入口网站,他们选择以 FreeBSD 为作业平台,由此可知 FreeBSD 的优异性。除此之外,在台湾,FreeBSD 普遍被应用于学术网络上,许多大专院校的服务器都是使用 FreeBSD 来提供网络服务。
但是您别以为 FreeBSD 只能用来做为网络服务器,FreeBSD 也可以是一个良好的个人作业系统。事实上,Mac OS X 就是使用 FreeBSD 做为系统核心。大家都知道 Mac OS 是个人计算机上有名的作业系统,它会使用 FreeBSD 做为系统核心,可见 FreeBSD 的质量亦深获 Apple 的肯定。
在宽带网络逐渐普及的台湾,每个人都可以自行架设一台网路服务器,以 FreeBSD 来提供网络服务(如网页、邮件、档案存取等)。值得一提的是 FreeBSD 并不像 MS-Windows 一样每每要求使用者升级计算机才能使用。FreeBSD 对于硬件的要求很低,你可以用一台 Intel 586-133MHz 的旧计算机来安装 FreeBSD,这也算是癈物利用吧。
1.2 为什么要选择FreeBSD?
现在的个人计算机作业系统市场中,是以 MS-Windows 独大,但在网络服务器市场中,UNIX 系统的使用率可不输 MS-Windows 喔。我个人认为 MS-Windows 之所以会有那么多的使用者主要是因为他的使用者介面对初学者而言较容易操作,再加上许多软件的配合及盗版的助长,安装软件只要一直按下一步就完成。使得使 用者即便它的稳定性不高也得乖乖的接受。
其实初学者没有试过其它的作业系统才会有这样的误解,因为一直用 MS-Windows 才会认为当机是无可避免的事,当机对于 MS-Windows 或许是无可避免,但在其它 UNIX 系统中可不常见。在 UNIX 系列的作业系统中,也可以有像 MS-Windows 的图形介面,几乎所有在 MS-Windows 上可以做的事,在 FreeBSD 上都可以做得到,唯一的不同点是你不必花钱去取得你想要的功能。包括排版、图形处理、MP3、多媒体、网络芳邻等等都可以在 FreeBSD 中做到。
重 点是,对于一台网路服务器而言,图形介面会占用系统资源,而且必须安装一堆有的没的软件。笔者偏好乾干脆净净的系统,而 FreeBSD 正好具有这个优点。不过这并不代表您不能使用图形介面,您还是可以安装类似 Windows 的图形介面,让您使用它来做为平日使用的个人计算机。此外,FreeBSD 把自己定位为最佳的网络服务器,它承袭了 BSD 优良的网络血统,在提供服务时能有绝佳的效能表现。而且,它是免费的。
然而,有这么多的免费 UNIX 作业系统中,为什么要选择 FreeBSD 而不使用其它作业系统(如 Linux )呢?在网络上在讨论这个问题时,每每会引发每个作业系统使用者的激辩。对于要使用何种作业系统,除了使用者偏好外,还有许多指标可以提供我们参考。
FreeBSD 是一套完整的作业系统
我 们平常所说的 Linux 指的是它的核心 (Kernel),Kernel 只是整个作业系统的一部份,除了 Kernel 外,我们还需要一些基本的指令、系统及目录架构、图形介面等。Linux 的 Distribution 就是各个不同的组织或公司自行收集一些系统必备的程序,制作出一个作业系统。Linux 系统有很多的 Distribution,如 Redhat、SUSE、Debian 等。因为每个 Distribution 都有自己的程序或架构,所以每个 Distribution 都长的不一样。如果您使用的是 Linux,在 Linux 三十多种 Distribution 中,每一种之间都有些许差异,在设定上用法都不同。
而 FreeBSD 指的不只是核心而已,它是一套完整的作业系统。从系统核心到使用者介面、各种常用指令都是由 FreeBSD 总部所统一推出。因此,FreeBSD 每一个版本之间有着共同的架构,不同软件之间的整合搭配性较为完整,不管是设定、学习都很容易。
由核心团队统筹开发
FreeBSD 整个系统都是由总部的核心团队所维护,所以整个系统都搭配得很好。而 Linux 只有 Kernel 由 Linus Torvlds 所维护。因为 FreeBSD 整个系统都是由总部所开发,不只系统整体较有规划,各个程序之间搭配起来也比较紧密。如果您使用 Linux,由于 Kernel 和其它的程序是由不同组织所维护,在升级时,比较麻烦。而 FreeBSD 就简单多了,每次一有新的版本,一定是整个系统一起升级。
我 觉得 FreeBSD 总部统筹发展 FreeBSD 是一件很棒的事,所有的问题回报都可以统筹管理并予以更新。FreeBSD 推陈出新的速度相当快,每一次安装都确保这个版本不会有上一版的缺失。所以在 Linux 或 MS-Windows 中「新版本不一定是最好」的定律并不适用于 FreeBSD。但这并不意味着你必须不断重新安装系统,FreeBSD 总部随时会发布最新更新的档案提供下载,而且如果使用 CVSUP 就可以和更新版的 FreeBSD 保持同步更新。
完整的使用手册
FreeBSD 的使用手册非常完整,而且会随着软件一起更新。每次一有新的版本推出,FreeBSD 的文件也会做相对的更新。在 FreeBSD 的官方网站上,我们可以轻松的取得这些高质量的手册及文件。
软件安装的便利性
FreeBSD 支援的软件相当多,它将常用的软件分类管理,当需要安装软件时,使用者不必自行到网络上找寻,只要到 FreeBSD ports 目录中下个指令就安装完成。
条理分明的系统架构
FreeBSD 目录结构非常有组织,结构严谨,对于系统管理者而言比较不会紊乱。FreeBSD 将系统预设的目录和管理者自行安装的程序目录划分得十分清楚,管理者在进行升级、维护时可以一目了然。
完美的程序开发平台
安 装完 FreeBSD 后,系统所有程序原始码非常有条理的存放在特定目录中。对于想要进行程序修改的管理者而言,不必四处寻找某支程序原始码。笔者在 FreeBSD 及 Linux 上开发程序多年,我觉得 FreeBSD 原始码及系统架构十分有组织,是程序开发最好的平台。
而且 FreeBSD 的版权较为宽松,对于想要以 FreeBSD 为基础开发产品的公司而言,它可以保护您的修改不会被其它对手抄袭。
1.3 为什么不选择FreeBSD?
许 多企业选择使用目前大多数人使用的 MS windows 做为一般作业用个人计算机的作业系统当然无可厚非。但以 MS windows 做服务器,除了资讯人员的偏好外(或许因为不会使用其它系统吧),还有部份原因是为了在企业内资讯人员技术不足时,能求助于系统供应商。而 FreeBSD 是免费的,企业也害怕有状况时无人可以支援,这对企业是很重要的一项因素。
然而,FreeBSD 的使用人数其实很多,而且使用者都十分热心,在台湾的 BBS 讨论区上,许多问题都可以获得解决。这当然还不够,现在有很多顾问公司提供 FreeBSD 的顾问服务,可以提供企业这方面的服务。虽然说 FreeBSD 的系统稳定,但在应用上如果没有资讯人员的支援,很难能在企业中存活。但正因市场上了解 FreeBSD 的人较少,若我们能主动学习,必能为自己创造更多价值。
FreeBSD 目前支援的平台不多,若您不是使用 X86 的系统,而是使用 ARM、MIPS 等平台,您就必须寻求其它的解决方案。
1.2 postfix简介
Postfix 是一个非常优秀的MTA,她素以高效、安全的特点而著称。Postfix是作者在UNIX上所见过的MTA中在反垃圾邮件(Anti-Spam或Anti -UCE)方面做得最好的一个,甚至有很多公司在Postfix代码的基础上进行二次开发而推出反垃圾邮件网关产品。MTA的反垃圾邮件功能,实际上就是 在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要 的MTA过滤技术。postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。和Sendmail相比Postfix更快、更容易管理、更灵活、更安全,同时 还与sendmail保持足够的兼容性。
第二章 操作系统FreeBSD安装
FreeBSD6.1系统安装手册
官方安装手册:
QUOTE:
http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/install.html
注意在系统安装过程中,分区方面一定要注意,最好是一个独立的mail分区来存放用户的邮件数据,因为默认的VAR分区读写频繁,数据存放在这样的分区中是很危险的;在安装系统的过程中,建议最小化安装加ports。
第三章 更新ports
3.1 安装CVSUP
QUOTE:
mail# cd /usr/ports/net/cvsup-without-gui
mail# make install clean
安装过程中由于依赖的关系,它会自动安装gettext,会出现下面的选项。
以下是我的选择。
QUOTE:
Options for gettext 0.14.5_2
[X] EXAMPLES install example files
[X] HTMLMAN install man pages in HTML format
3.2 更新ports树
(更新日期2006-07-09)
编辑ports-supfile
QUOTE:
mail# ee /usr/share/examples/cvsup/ports-supfile
QUOTE:
第51行
*default host=CHANGE_THIS.FreeBSD.org
改为:
*default host=cvsup2.freebsdchina.org
QUOTE:
mail# /usr/local/bin/cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
Parsing supfile "ports"
Connecting to Cvsup2.FreeBSD.org.cn
Connected to Cvsup2.FreeBSD.org.cn
Server software version: SNAP_16_1h
Negotiating file attribute support
Exchanging collection information
Establishing multiplexed-mode data connection
Running
Updating collection ports-all/cvs
……
……
Shutting down connection to server
Finished successfully
出现上面的提示,表示更新成功。
第四章 软件安装
4.1 安装perl-5.8.8
QUOTE:
mail# cd /usr/ports/lang/perl5.8
mail# make install clean
4.2 安装mysql-5.0.27
4.2 安装mysql
QUOTE:
mail# cd /usr/ports/databases/mysql50-server
编辑Makefile
mail# ee Makefile
在CONFIGURE_ARGS这段话的
--enable-thread-safe-client前面加上三句参数
BUILD_OPTIMIZED=yes \
BUILD_STATIC=yes \
PTHREAD_LIBS=-lkse \
mail# make WITH_CHARSET=gb2312 WITH_XCHARSET=all BUILD_OPTIMIZED=yes BUILD_STATIC=yes install clean
在rc.conf中加入Mysql的启动参数
QUOTE:
mail# echo 'mysql_enable="YES"' >> /etc/rc.conf
启动mysql
QUOTE:
mail# /usr/local/etc/rc.d/mysql-server start
Starting mysql.
查看mysql是否启动成功
QUOTE:
mail# sockstat -4 | grep 3306
mysql mysqld 1510 3 tcp4 *:3306 *:*
出现上面的端口表示mysql启动成功
4.3 安装httpd-2.2.3
QUOTE:
mail# cd /usr/ports/www/apache22
mail# make install clean
在rc.conf中加入apache的启动参数
QUOTE:
mail# echo 'apache_enable="YES"' >> /etc/rc.conf
启动apache
QUOTE:
mail# /usr/local/etc/rc.d/apache22 start
Starting apache.
查看apache是否启动成功
QUOTE:
mail# sockstat -4 | grep 80
www httpd 10679 16 tcp4 *:80 *:*
www httpd 10678 16 tcp4 *:80 *:*
www httpd 10677 16 tcp4 *:80 *:*
www httpd 10676 16 tcp4 *:80 *:*
www httpd 10675 16 tcp4 *:80 *:*
root httpd 10674 16 tcp4 *:80 *:*
出现上面的80端口表示apache启动成功
4.4 安装php-5.1.6
QUOTE:
mail# cd /usr/ports/lang/php5
mail# make install clean
以下是我的选择
QUOTE:
Options for php5 5.1.6_3
[ ] CLI Build CLI version
[ ] CGI Build CGI version
[X] APACHE Build Apache module
[ ] DEBUG Enable debug
[ ] SUHOSIN Enable Suhosin protection system
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6 Enable ipv6 support
[ ] REDIRECT Enable force-cgi-redirect support (CGI only)
[ ] DISCARD Enable discard-path support (CGI only)
[ ] FASTCGI Enable fastcgi support (CGI only)
[ ] PATHINFO Enable path-info-check support (CGI only)
QUOTE:
mail# echo 'AddType application/x-httpd-php .php' >> /usr/local/etc/apache/httpd.conf
mail# echo 'AddType application/x-httpd-php-source .phps' >> /usr/local/etc/apache/httpd.conf
编辑httpd.conf加入index.php
QUOTE:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
4.5 安装php5的扩展
QUOTE:
mail# cd /usr/ports/lang/php5-extensions
mail# make install clean
QUOTE:
Options for php5-extensions 1.0
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CTYPE ctype functions
[X] CURL CURL support
[ ] DBA dba support
[ ] DBASE dBase library support
[X] DOM DOM support
[ ] EXIF EXIF support
[ ] FILEINFO fileinfo support
[ ] FILEPRO filePro support
[ ] FRIBIDI FriBidi support
[X] FTP FTP support
[X] GD GD library support
[ ] GETTEXT gettext library support
[ ] GMP GNU MP support
[X] HASH HASH Message Digest Framework
[X] ICONV iconv support
[ ] IMAGICK ImageMagick support
[X] IMAP IMAP support
[ ] INTERBASE Interbase 6 database support (Firebird)
[ ] LDAP OpenLDAP support
[ ] MBSTRING multibyte string support
[X] MCRYPT Encryption support
[X] MHASH Crypto-hashing support
[ ] MING ming shockwave flash support
[ ] MSSQL MS-SQL database support
[X] MYSQL MySQL database support
[ ] MYSQLI MySQLi database support
[ ] NCURSES ncurses support (CLI only)
[ ] ODBC unixODBC support
[ ] OPENSSL OpenSSL support
[ ] PANDA panda support
[ ] PCNTL pcntl support (CLI only)
[X] PCRE Perl Compatible Regular Expression support
[ ] PDF PDFlib support (implies GD)
[X] PDO PHP Data Objects Interface (PDO)
[ ] PGSQL PostgreSQL database support
[X] POSIX POSIX-like functions
[ ] PSPELL pspell support
[ ] READLINE readline support (CLI only)
[ ] RECODE recode support
[X] SESSION session support
[ ] SHMOP shmop support
[X] SIMPLEXML simplexml support
[ ] SNMP SNMP support
[ ] SOAP SOAP support
[ ] SOCKETS sockets support
[X] SQLITE sqlite support
[ ] SYBASE_CT Sybase database support
[ ] SYSVMSG System V message support
[ ] SYSVSEM System V semaphore support
[ ] SYSVSHM System V shared memory support
[ ] TIDY TIDY support
[X] TOKENIZER tokenizer support
[ ] WDDX WDDX support (implies XML)
[X] XML XML support
[X] XMLREADER XMLReader support
[ ] XMLRPC XMLRPC-EPI support
[X] XMLWRITER XMLWriter support
[ ] XSL XSL support (Implies DOM)
[ ] YAZ YAZ support (ANSI/NISO Z39.50)
[X] ZIP ZIP support
[X] ZLIB ZLIB support
重启apache安装完成。
4.6 安装openssl-0.9.7l
QUOTE:
mail# cd /usr/ports/security/openssl
mail# make install clean
4.7 安装phpMyAdmin-2.9.0.2
QUOTE:
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
QUOTE:
mail# cd /usr/ports/distfiles
mail# tar –zxvf phpMyAdmin-2.9.0.2.tar.gz
mail# mv /usr/local/www/phpMyAdmin-2.9.0.2 /usr/local/www/apache22/data/dbadmin
修改/usr/local/www/apache22/data/dbadmin/config.inc.php
QUOTE:
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
4.8 设置数据库
建立postfix数据库(注意:数据库名称为postfix):
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
把下面的sql语句导入到postfix数据库中去:
QUOTE:
-- phpMyAdmin SQL Dump
-- version 2.9.0.2
-- http://www.phpmyadmin.net
--
-- 主机: localhost:3306
-- 生成日期: 2006 年 10 月 30 日 22:17
-- 服务器版本: 4.0.26
-- PHP 版本: 5.1.6
--
-- 数据库: `tmail`
--
-- --------------------------------------------------------
--
-- 表的结构 `address`
--
CREATE TABLE `address` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`name` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
UNIQUE KEY `id` (`id`),
KEY `pw_id` (`pw_id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `address`
--
-- --------------------------------------------------------
--
-- 表的结构 `admin`
--
CREATE TABLE `admin` (
`id` int(10) unsigned NOT NULL auto_increment,
`site_id` int(10) unsigned NOT NULL default '0',
`domain` varchar(128) NOT NULL default '',
`quota` smallint(5) unsigned NOT NULL default '0',
`total` smallint(5) unsigned NOT NULL default '0',
`createtime` timestamp(14) NOT NULL,
`login` char(1) NOT NULL default '',
`cur_total` smallint(5) NOT NULL default '0',
`cur_quota` smallint(5) NOT NULL default '0',
`gid` varchar(11) NOT NULL default '',
`expiration_time` timestamp(14) NOT NULL default '00000000000000',
`flag` int(10) unsigned NOT NULL default '0',
`maxmsg` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `admin`
--
-- --------------------------------------------------------
--
-- 表的结构 `card`
--
CREATE TABLE `card` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`LinkMan` varchar(64) NOT NULL default '',
`CompanyName` varchar(100) NOT NULL default '',
`Address` varchar(255) NOT NULL default '',
`Position` varchar(32) NOT NULL default '',
`PhoneNumber` varchar(16) NOT NULL default '',
`Mobile` varchar(12) NOT NULL default '',
`Email` varchar(128) NOT NULL default '',
`Partaker` varchar(32) NOT NULL default '',
`Memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=27 ;
--
-- 导出表中的数据 `card`
--
-- --------------------------------------------------------
--
-- 表的结构 `lastauth`
--
CREATE TABLE `lastauth` (
`user` char(32) NOT NULL default '',
`domain` char(64) NOT NULL default '',
`remote_ip` char(18) NOT NULL default '',
`timestamp` bigint(20) NOT NULL default '0',
PRIMARY KEY (`user`,`domain`)
) TYPE=MyISAM;
--
-- 导出表中的数据 `lastauth`
--
-- --------------------------------------------------------
--
-- 表的结构 `logs`
--
CREATE TABLE `logs` (
`pw_id` int(5) default '0',
`ip` varchar(15) NOT NULL default '',
`action` varchar(15) NOT NULL default '',
`time` datetime default NULL,
`content` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default ''
) TYPE=MyISAM;
--
-- 导出表中的数据 `logs`
--
-- --------------------------------------------------------
--
-- 表的结构 `message`
--
CREATE TABLE `message` (
`id` int(5) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`createtime` datetime NOT NULL default '0000-00-00 00:00:00',
`updatetime` datetime NOT NULL default '0000-00-00 00:00:00',
`pw_domain` varchar(64) NOT NULL default '',
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
--
-- 导出表中的数据 `message`
--
-- --------------------------------------------------------
--
-- 表的结构 `personal`
--
CREATE TABLE `personal` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`truename` varchar(10) NOT NULL default '',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=12 ;
--
-- 导出表中的数据 `personal`
--
-- --------------------------------------------------------
--
-- 表的结构 `scheduler`
--
CREATE TABLE `scheduler` (
`id` int(11) unsigned NOT NULL auto_increment,
`begin_time` int(11) unsigned default NULL,
`end_time` int(11) unsigned default NULL,
`title` varchar(255) NOT NULL default '',
`body` varchar(255) NOT NULL default '',
`pw_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `scheduler`
--
-- --------------------------------------------------------
--
-- 表的结构 `stow`
--
CREATE TABLE `stow` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`Name` varchar(128) NOT NULL default '',
`http` varchar(255) NOT NULL default 'http://',
`memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `stow`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_access`
--
CREATE TABLE `tmail_access` (
`id` int(11) unsigned NOT NULL auto_increment,
`ctime` int(11) unsigned default NULL,
`source` varchar(128) NOT NULL default '',
`access` varchar(16) NOT NULL default '',
`type` char(1) NOT NULL default 'S',
PRIMARY KEY (`id`),
KEY `source` (`source`,`type`,`access`,`ctime`)
) TYPE=MyISAM AUTO_INCREMENT=65 ;
--
-- 导出表中的数据 `tmail_access`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_alias`
--
CREATE TABLE `tmail_alias` (
`id` int(11) unsigned NOT NULL auto_increment,
`alias` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_alias`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_autobbc`
--
CREATE TABLE `tmail_autobbc` (
`id` int(9) NOT NULL auto_increment,
`realname` varchar(128) default NULL,
`email` varchar(128) NOT NULL default '',
`autobbc` varchar(128) NOT NULL default '',
`come` int(1) default NULL,
`out` int(1) default NULL,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_autobbc`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_company`
--
CREATE TABLE `tmail_company` (
`id` int(6) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`linkman` varchar(50) NOT NULL default '',
`tel` varchar(15) NOT NULL default '',
`Address` varchar(50) NOT NULL default '',
`zip` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_company`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_domaininfo`
--
CREATE TABLE `tmail_domaininfo` (
`id` tinyint(11) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`transport` varchar(128) NOT NULL default '',
`alias` varchar(50) default NULL,
`passwd` varchar(35) NOT NULL default '',
`clean` text NOT NULL,
`admin` tinytext NOT NULL,
`yesno` tinytext NOT NULL,
`usernum` text NOT NULL,
`quota` text NOT NULL,
`filequota` text NOT NULL,
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`),
KEY `domain_id` (`id`)
) TYPE=MyISAM PACK_KEYS=0 COMMENT='domain information' AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_domaininfo`
--
INSERT INTO `tmail_domaininfo` (`id`, `domain`, `transport`, `alias`, `passwd`, `clean`, `admin`, `yesno`, `usernum`, `quota`, `filequota`, `expire`, `create_time`) VALUES
(1, 'admin', 'maildrop', NULL, '$1$t5h6XOby$UP3HJpdrozxEsRlcLF6tI0', 'hing4585', '0', '1', '0', '0', '0', '0000-00-00', '2006-10-06 16:44:13');
-- --------------------------------------------------------
--
-- 表的结构 `tmail_group_name`
--
CREATE TABLE `tmail_group_name` (
`id` int(9) NOT NULL auto_increment,
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_group_name`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_monitor`
--
CREATE TABLE `tmail_monitor` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`cc` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `email` (`email`,`cc`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_monitor`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_pop`
--
CREATE TABLE `tmail_pop` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`pop` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`pass` varchar(32) NOT NULL default '32',
`timeout` int(10) unsigned NOT NULL default '60',
`port` tinyint(3) unsigned NOT NULL default '110',
`keep` char(1) NOT NULL default 'Y',
PRIMARY KEY (`id`),
KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_pop`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relay_domains`
--
CREATE TABLE `tmail_relay_domains` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relay_domains`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relocated`
--
CREATE TABLE `tmail_relocated` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relocated`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_transport`
--
CREATE TABLE `tmail_transport` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_transport`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_userpersonal`
--
CREATE TABLE `tmail_userpersonal` (
`id` int(11) NOT NULL auto_increment,
`address` varchar(50) default NULL,
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`month` int(2) NOT NULL default '0',
`day` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=43 ;
--
-- 导出表中的数据 `tmail_userpersonal`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_users`
--
CREATE TABLE `tmail_users` (
`id` int(11) unsigned NOT NULL auto_increment,
`userid` tinytext NOT NULL,
`domain` varchar(128) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
`clear` varchar(128) NOT NULL default '',
`crypt` varchar(128) NOT NULL default '',
`realname` tinytext NOT NULL,
`uid` int(11) unsigned NOT NULL default '1003',
`gid` int(11) unsigned NOT NULL default '1003',
`homedir` tinytext NOT NULL,
`maildir` tinytext NOT NULL,
`quota` tinytext NOT NULL,
`file_quota` tinytext NOT NULL,
`access` enum('Y','N') NOT NULL default 'Y',
`postfix` enum('Y','N') NOT NULL default 'Y',
`disablepop3` char(1) NOT NULL default '0',
`disableimap` char(1) NOT NULL default '0',
`disablewebmail` char(1) NOT NULL default '0',
`sharedgroup` varchar(128) NOT NULL default '0',
`smtpaccess` enum('Y','N') NOT NULL default 'Y',
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_users`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_virtual`
--
CREATE TABLE `tmail_virtual` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
`group` int(1) default NULL,
`alias` int(1) default NULL,
`forward` int(1) default NULL,
`forward_bak` int(1) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_virtual`
--
-- --------------------------------------------------------
--
-- 表的结构 `vpopmail`
--
CREATE TABLE `vpopmail` (
`pw_id` int(5) unsigned NOT NULL auto_increment,
`pw_name` varchar(32) NOT NULL default '',
`pw_domain` varchar(64) NOT NULL default '',
`pw_passwd` varchar(40) NOT NULL default '',
`pw_uid` int(11) default NULL,
`pw_gid` int(11) default NULL,
`pw_gecos` varchar(48) default NULL,
`pw_dir` varchar(255) default NULL,
`pw_shell` varchar(20) default NULL,
`createtime` timestamp(14) NOT NULL,
PRIMARY KEY (`pw_id`),
KEY `pw_name` (`pw_name`,`pw_domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `vpopmail`
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便.
建立数据库用户并授以相应的权限
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
重新启动mysql
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
4.9 安装cyrus-sasl-2.1.22
QUOTE:
mail# cd /usr/ports/security/cyrus-sasl2
mail# make WITH_MYSQL=yes WITH_AUTHDAEMON=yes install clean
WITH_AUTHDAEMON=yes参数是为了让sasl支持authdamond的认证方式
WITH_MYSQL=yes参数是为了让sasl支持mysql认证方式
4.10 安装postfix-2.3.3
QUOTE:
mail# cd /usr/ports/mail/postfix
mail# make install clean
以下是我的选择
QUOTE:
Postfix configuration options
Please select desired options:
[ ] NOPCRE DISABLE Perl Compatible Regular Expressions
[ ] SASL Cyrus SASLv1 (Simple Authentication and Security Layer)
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
[ ] SASLKRB If your SASL requires Kerberos select this option
[ ] SASLKRB5 If your SASL requires Kerberos5 select this option
[ ] SASLKRB5MIT If your SASL requires MIT Kerberos5 select this option
[ ] SPF SPF support
[ ] TLS SSL and TLS
[ ] BDB Berkeley DB (select version using WITH_BDB_VER variable)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[ ] PgSQL PostgreSQL map lookups (choose with DEFAULT_PGSQL_VER)
[ ] OpenLDAP OpenLDAP map lookups (choose ver. with WITH_OPENLDAP_VER)
[ ] CDB CDB map lookups
[ ] NIS NIS map lookups
[X] VDA VDA (Virtual Delivery Agent)
[ ] Test SMTP/LMTP test server and generator
安装过程中会让你回答两个问题,
QUOTE:
===> Installing for postfix-2.2.10_1,1
===> postfix-2.2.10_1,1 depends on shared library: sasl2.2 - found
===> postfix-2.2.10_1,1 depends on shared library: pcre.0 - found
===> postfix-2.2.10_1,1 depends on shared library: mysqlclient.14 - found
Added group "postfix".
Added group "maildrop".
Added user "postfix".
You need user "postfix" added to group "mail".
Would you like me to add it [y]? y
是否把postfix用户加入到mail用户组。回答Y
Installed HTML documentation in /usr/local/share/doc/postfix
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在rc.conf中加入postfix的启动选项
QUOTE:
mail# echo 'postfix_enable="YES"' >> /etc/rc.conf
mail# echo 'sendmail_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_submit_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_outbound_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_msp_queue_enable="NO"' >> /etc/rc.conf
4.11 安装courier-imap-4.1.1
QUOTE:
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
以下是我的选择
QUOTE:
Options for courier-imap 4.1.1,1
[ ] OPENSSL Build with OpenSSL support
[ ] FAM Build in fam support for IDLE command
[ ] TRASHQUOTA Include deleted mails in the quota
[ ] GDBM Use gdbm db instead of system bdb
[ ] IPV6 Build with IPv6 support
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
在rc.conf中加入courier的启动选项
QUOTE:
mail# echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
QUOTE:
mail# /usr/local/etc/rc.d/courier-authdaemond start
Starting courier_authdaemond.
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
对/var/run/authdaemond目录加执行权限
QUOTE:
mail# chmod +x /var/run/authdaemond
4.12 安装MailScanner-install-4.55.10-3
QUOTE:
mail# cd /usr/ports/mail/mailscanner
mail# make install clean
在安装MailScanner的过程中会出现以下几个选项。以下是我的选择
QUOTE:
Options for MailScanner 4.55.10
[X] SPAMASSASSIN Install SpamAssassin
[X] CLAMAV Install ClamAV
[X] CLAMAVMODULE Install ClamAV Module
[ ] BDC Install BitDefender
Options for sqlite 3.3.6
[ ] TCLWRAPPER TCL wrapper for SQLITE
[ ] THREADS Enable threads support
[ ] DEBUG Enable debugging & verbose explain
[ ] DOCS Building docs (depends on TCL)
Options for Mail-SpamAssassin-3.1.6
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[ ] MYSQL Add MySQL support
[ ] PGSQL Add PostreSQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
Options for clamav 0.88.5
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
[X] STDERR Print logs to stderr instead of stdout
生成初始配置文件
QUOTE:
mail# make initial-config
根据提示创建MailScanner运行所需的目录
mail# mkdir -p /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown -R postfix:postfix /var/spool/MailScanner
分别在rc.conf中加入clamav、spamassassin和MailScanner的启动参数
QUOTE:
mail# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_milter_enable="YES"' >> /etc/rc.conf
mail# echo 'mailscanner_enable="YES"' >> /etc/rc.conf
mail# echo 'spamd_enable="YES"' >> /etc/rc.conf
4.13 安装maildrop-2.0.2
QUOTE:
mail# cd /usr/ports/mail/maildrop
mail# make install WITH_AUTHLIB=yes
以下是我的选择
QUOTE:
Options for maildrop 2.0.2
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
QUOTE:
mail# /usr/local/bin/maildrop -v
maildrop 2.0.2 Copyright 1998-2005 Double Precision, Inc.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
出现上面红色的部分表示maildrop支持Courier。
第五章 软件系统配置
为了支持maildrop,先加入vmail用户
QUOTE:
mail# pw adduser vmail -u 1003 -s /sbin/nologin -d /dev/null
5.1 配置cyrus-sasl
创建/usr/local/lib/sasl2/smtpd.conf
QUOTE:
mail# ee /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login
sql_engine: mysql
sql_hostnames: localhost
sql_user: tmail
sql_passwd: tmail
sql_database: tmail
sql_select: select clear from tmail_users where email='%u@%r' and smtpaccess='Y'
5.2 配置postfix
QUOTE:
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
mail# ee /usr/local/etc/postfix/main.cf
修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
QUOTE:
# new add
myhostname = mail.test.com
smtp_helo_name = $myhostname
local_transport = maildrop
mailbox_transport = maildrop
smtpd_error_sleep_time = 0
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
default_process_limit = 100
#alias_maps = hash:/usr/local/etc/postfix/aliases
#Alias_database = hash:/usr/local/etc/postfix/aliases
mydestination = mysql:/usr/local/etc/postfix/mysql-mydest.cf
virtual_transport_maps = mysql:/usr/local/etc/postfix/mysql-transport.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-virtual.cf
#virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-alias.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-in.cf
sender_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-out.cf
local_recipient_maps = $alias_maps $virtual_mailbox_maps $virtual_maps
virtual_mailbox_base = /mail
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql-virtual-maps.cf
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql-virtual-quota.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
virtual_uid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-gid.cf
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_auth_destination,
reject
smtpd_sender_restrictions =
reject_unknown_sender_domain,
reject_non_fqdn_sender,
check_sender_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit
smtpd_recipient_restrictions =
permit_mynetworks,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_unauth_destination,
reject_rbl_client cblless.anti-spam.org.cn,
permit
default_destination_recipient_limit = 1
local_destination_concurrency_limit = 1
maildrop_destination_recipient_limit = 1
message_size_limit = 41943040
smtpd_recipient_limit = 10
bounce_queue_lifetime = 12h
maximal_queue_lifetime = 24h
smtpd_delay_reject = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-access.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select access from tmail_access where source = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-alias.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select alias from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-in.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND come='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-out.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND 'out'='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-mydest.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select domain from tmail_domaininfo where domain = '%s' AND yesno = '1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-transport.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select transport from tmail_domaininfo where domain = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-gid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select gid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-uid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select uid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-maps.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select maildir from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-quota.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select quota from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select destination from tmail_virtual where email = '%s'
5.3 配置Courier-imap
修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
QUOTE:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
修改/usr/local/etc/courier-imap/pop3d
QUOTE:
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
编辑修改/usr/local/etc/authlib/authmysqlrc
QUOTE:
MYSQL_SERVER localhost
MYSQL_USERNAME tmail
MYSQL_PASSWORD tmail
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE tmail
MYSQL_USER_TABLE tmail_users
MYSQL_CRYPT_PWFIELD crypt
#MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
MYSQL_WHERE_CLAUSE access='y'
注:红色部分为一行。这里得用tab键来跳格
编辑/usr/local/etc/authlib/authdaemonrc
QUOTE:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
5.4 安装Tmail管理工具
本节主要介绍如何安装Tmail管理工具。
更改httpd.conf中的Group www、User www修改为: Group vmail、User vmail
安装Tmail管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改config/config.inc.php中的
QUOTE:
define(MAILDIR,"/mail"); //邮件存放目录
define(MISC, ".misc");
define(MODE,0700);
$PageSize = 15; //用户列表和域名列表每一页显示多少行
$host = "localhost"; //数据库主机名
$user = "tmail"; //数据库用户名
$dbname = "tmail"; //数据库名称
$password = "tmail"; //数据库密码
设置好后,加一个域名为test.com,加一个邮件用户为: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
5.5 登录测试
重新启动相关服务
QUOTE:
mail# /usr/local/etc/rc.d/apache22 restart
mail# /usr/local/etc/rc.d/mysql-server restart
mail# /usr/local/etc/rc.d/courier-authdaemond stop
mail# /usr/local/etc/rc.d/courier-authdaemond start
mail# /usr/local/etc/rc.d/courier-imap-imapd.sh restart
mail# /usr/local/etc/rc.d/courier-imap-pop3d.sh restart
mail# /usr/local/etc/rc.d/postfix reload
生成用户名的base64编码
QUOTE:
mail# perl -MMIME::Base64 -e 'print encode_base64(" test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 ");'
dGVzdEB0ZXN0LmNvbQ==
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试25发送
QUOTE:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
220 mail.test.com ESMTP Postfix
ehlo mail
250-mail.test.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
auth login
334 VXNlcm5hbWU6
dGVzdEB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6
MDAwMDAw
235 Authentication successful
MAIL FROM:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
RCPT TO:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
SUBJECT:test
test
.
250 Ok: queued as 47C6CB83E
quit
221 Bye
Connection closed by foreign host.
测试110收邮件
QUOTE:
mail# telnet localhost 110
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
+OK Hello there.
user test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
+OK Password required.
pass 000000
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 1563
2 401
.
retr 2
+OK 401 octets follow.
Return-Path: < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Delivered-To: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
Received: from mail (localhost.test.com [127.0.0.1])
by mail.test.com (Postfix) with ESMTP id 47C6CB83E
for < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >; Tue, 11 Jul 2006 13:47:28 +0800 (CST)
SUBJECT:test
Message-Id: < 20060711054736.47C6CB83E@mail.test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Date: Tue, 11 Jul 2006 13:47:28 +0800 (CST)
From: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
To: undisclosed-recipients:;
test
.
dele 2
+OK Deleted.
quit
+OK Bye-bye.
Connection closed by foreign host.
5.6 垃圾邮件和病毒邮件过滤设置
设置MailScanner
编辑/usr/local/etc/postfix/main.cf
QUOTE:
mail# ee /usr/local/etc/postfix/main.cf
去掉513行的注释
QUOTE:
header_checks = regexp:/usr/local/etc/postfix/header_checks
编辑/usr/local/etc/postfix/header_checks
QUOTE:
mail# ee /usr/local/etc/postfix/header_checks
新加入
/^Received:/ HOLD
重新加载postfix配置文件
mail# postfix reload
编辑/usr/local/etc/MailScanner/MailScanner.conf,以下是我的配置文件,更改相应的参数为下面的格式。
QUOTE:
%org-name% = thismail.org
%org-long-name% = LCSoft
%web-site% = www.thismail.org
%etc-dir% = /usr/local/etc/MailScanner
%report-dir% = /usr/local/share/MailScanner/reports/en
%rules-dir% = /usr/local/etc/MailScanner/rules
%mcp-dir% = /usr/local/etc/MailScanner/mcp
Run As User = postfix
Run As Group = postfix
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
Sendmail = /usr/sbin/sendmail
Monitors for ClamAV Updates = /var/db/clamav/*.cvd
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin
Custom Functions Dir = /usr/local/lib/MailScanner/MailScanner/CustomFunctions
SpamAssassin Install Prefix = /usr/local/bin
SpamAssassin Site Rules Dir = /usr/local/etc/mail/spamassassin
SpamAssassin Local Rules Dir = /usr/local/share/spamassassin
编辑配置文件/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
QUOTE:
mail# ee /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
# MailScanner
# MailScanner users, please see the comments at the bottom of this file.
# MailScanner
#
# SpamAssassin user preferences file.
#
# Format:
#
# required_hits n
# (how many hits are required to tag a mail as spam.)
#
# score SYMBOLIC_TEST_NAME n
# (if this is omitted, 1 is used as a default score.
# Set the score to 0 to ignore the test.)
#
# # starts a comment, whitespace is not significant.
#
###########################################################################
# Whitelist and blacklist addresses are *not* patterns; they're just normal
# strings. one exception is that "*@isp.com" is allowed. They should be in
# lower-case. You can either add multiple addrs on one line,
# whitespace-separated, or you can use multiple lines.
#
# Monty Solomon: he posts from an ISP that has often been the source of spam
# (no fault of his own ;), and sometimes uses Bcc: when mailing.
#
#whitelist_from monty@roscom.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Add your blacklist entries in the same format...
#
# blacklist_from friend@public.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
#
#ok_locales en
skip_rbl_checks 1
use_bayes 0
use_dcc 0
use_pyzor 0
use_razor1 0
use_razor2 0
decode_attachments 1
编辑配置文件/usr/local/etc/MailScanner/rules/max.message.size.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/max.message.size.rules
# This is an example ruleset to show how rules can have resulting values
# other than yes and no. This ruleset demonstrates having a numerical result.
# The From: and To: rules show how simple domains can be used to select
# different values for the result of the ruleset.
# Note that the fields of each rule line can be separated by any whitespace,
# any combination of tabs and spaces.
#
# The 2 lines involving domain3.com show that for email to user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# has a limit of 5Mbytes per message, while email to any other user
# @domain3.com has a limit of 500Kbytes per message.
#
To: *@domain1.com 10M
To: *@domain2.com 20M
From: user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 5M
From: *@domain3.com 500K
#
# The following line specifies the default result used when none of the
# other rules match. In this example,
# Maximum Message Size = 0
# means that there is no limit to the size of the message.
#
FromOrTo: default 0
编辑配置文件/usr/local/etc/MailScanner/rules/bounce.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/bounce.rules
# You can use this ruleset to enable the "bounce" Spam Action.
# You must *only* enable this for mail from sites with which you have
# agreed to bounce possible spam. Use it on low-scoring spam only (<10)
# and only to your regular customers for use in the rare case that a
# message is mis-tagged as spam when it shouldn't have been.
# Beware that many sites will automatically delete the bounce messages
# created by using this option unless you have agreed this with them in
# advance.
# This next line gives an example of how you might enable this option for
# a frequent customer of yours.
#From: yourcustomer.com yes
# Under no circumstances should this be changed to "yes".
FromOrTo: default no
重新启动mailscanner.
QUOTE:
mail# /usr/local/etc/rc.d/mailscanner restart
加入中文垃圾邮件规则
QUOTE:
mail# cd /usr/local/share/spamassassin
mail# fetch http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf
注意:由于加入了中文垃圾邮件规则,请把垃圾邮件的评分的分数设置为高一些。
我的设置为8,最高分设置为10,这样可以降低中文邮件的错误识别率。用户可以根据自己的需要来改变这两个分值。
QUOTE:
Required SpamAssassin Score = 8
High SpamAssassin Score = 10
为了避免邮件扫描后主题变成乱码,建议改变以下设置为no
QUOTE:
Virus Modify Subject = no
Filename Modify Subject = no
Content Modify Subject = no
Disarmed Modify Subject = no
Spam Modify Subject = yes
High Scoring Spam Modify Subject = no
扫描垃圾邮件所执行的运作
QUOTE:
Spam Actions = deliver
High Scoring Spam Actions = delete
相关运作参数说明:
QUOTE:
"deliver" -- 邮件正常的转送至原来的收信人。
"delete" -- 删除邮件。
"store" -- 将邮件存放至隔离区。
"bounce" -- 将邮件退给寄信人。
"forward" -- 提供一个 forward 的邮件位址给系统,系统会自动转寄一份。
"striphtml" -- 将内嵌 HTML 的邮件转成 Text,你必需要加入 "deliver",系统才会帮你寄邮件。
允许html邮件通行
QUOTE:
Allow IFrame Tags = yes
Allow Form Tags = yes
Allow Script Tags = yes
Allow WebBugs = disarm
Allow Object Codebase Tags = yes
Convert Dangerous HTML To Text = no
Convert HTML To Text = no
允许本机发送出去的邮件不被MailScanner视为垃圾邮件
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/spam.whitelist.rules
From: 127.0.0.1 yes
以上规则的说明:以上垃圾邮件的规则是加入了中文垃圾邮件主题和内容的评分规则,所以我设置了一个最低分为8分,最高分为10分的规则,8-10分间的邮件会被打上[spamd]的标识,高于10分的邮件会被自动的删除掉,以上规则允许html邮件通过。
第六章 安装webmail
到开邮件邮件技术论坛
http://www.thismail.org/bbs/thread.php?fid=17
取得最新的webmail
下载后传到服务器上的web目录,后配置php的全局变量为打开
QUOTE:
register_globals = On
并编辑webmail/config/config_inc.php中如下参数
QUOTE:
$CFG_BASEPATH = "/tmp/tmail/temp"; //临时目录,如果不存在,修改完配置文件后再手动创建,并附于相关的权限
// Mysql
define(MYSQL_HOST, 'localhost'); //数据库主机名
define(MYSQL_USER, 'postfix'); //数据库用户名
define(MYSQL_PASS, 'postfix'); //数据库密码
define(MYSQL_DATA, 'postfix'); //数据库名称
$CFG_NETDISK_PATH = "/mail/netdisk"; //文件管理(网络磁盘所在的系统路径)如果不存在,修改完配置文件后再手动创建,并附于相关的权限
$CFG_NETDISK_DEFAULT_QUOTA = 10; //文件管理(网络磁盘)默认大小为10MB,用户可根据自己的需要改变大小
。
QUOTE:
mail# mkdir -p /tmp/tmail/temp
mail# chown -R postfix:postfix /tmp/tmail
mail# mkdir -p /mail/netdisk
mail# chown -R postfix:postfix /mail/netdisk
为了webmail能配合maildrop做中文邮件的过滤。请写/usr/sbin/maildecode文件
QUOTE:
mail# ee /usr/sbin/maildecode
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
my $a = $ARGV[0] || '';
#Maybe arg is include Subject
if ($a=~/^Subject/) {
$a = $ARGV[1] || '';
};
if ($a=~/=?[w-]+?B?(.*)?=$/) {
use MIME::Base64;
$a = decode_base64($1);
};
if ($a=~/=?[w-]+?Q?(.*)?=$/) {
use MIME::QuotedPrint;
$a = decode_qp($1);
};
#open(OUTFILE, ">/tmp/list.log");
#print OUTFILE $a;
#close(OUTFILE);
print $a;
exit(0);
并改变相关的权限
QUOTE:
mail# chmod 755 /usr/sbin/maildecode
mail# chown -R vmail:vmail /usr/sbin/maildecode
安装成功后的webmail
附一、常见问题
正在收集中……
附二、MailScanner.conf中文参数说明
http://www.thismail.org/bbs/htm_data/7/0509/533.html
FreeBSD+Postfix+Cyrus-sasl+Courier-imap+Webmail+spamassassin+Clamav+mailscanner +maildrop来架构一个具有多域名,webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 5.1 bate $Date: 2006-10-31
杨廷勇 QQ:187159779
Copyright © 2004、2005、2006
欢迎转载,保留版权和出处[http://www.thismail.org]
系统主要采用MailScanner+clamav+Spamd来对病毒过滤和垃圾邮件过滤。
----------------------------------
新增加对smtpd,imap,pop3,webmail的登录控制
新增加简单的邮件分组
新增邮件监控
加强对垃圾邮件的过滤
增加系统黑名单
-----------------------------------
本文在4.10、5.3、5.4、5.5、6.0、6.1上安装测试通过,采用MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了 系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了98%。垃圾邮件过滤基本上达到了95%的成功率。
本人水平有限,如有错误之处请发邮件到scyz2 at 163.com (at = @),本人不对本文档对你的系统造成的损失负任何连带责任。
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
1.2 postfix简介
第二章 操作系统FreeBSD安装
第三章 更新ports
3.1 安装CVSUP
3.2 更新ports树
第四章 软件安装
4.1 安装perl
4.2 安装mysql
4.3 安装apache22
4.4 安装mod_php5
4.5 安装php5的扩展
4.6 安装openssl
4.7 安装phpMyAdmin
4.8 设置数据库
4.9 安装cyrus-sasl2
4.10 安装postfix2
4.11 安装Courier-imap
4.12 安装MailScanner
4.13 安装maildrop
第五章 软件系统配置
5.1 配置cyrus-sasl
5.2 配置postfix
5.3 配置Courier-imap
5.4 安装Tmail管理工具
5.5 登录测试
5.6 垃圾邮件和病毒邮件过滤设置
第六章 安装webmail
附一、常见问题
附二、MailScanner.conf中文参数说明
――――――――――――――――――――――――――――――――――
第一章 FreeBSD 简介
1.1 什么是FreeBSD?
我 想大家都知道 Microsoft Windows 是一套作业系统,FreeBSD 也是一套作业系统。FreeBSD 是一个可以在 Intel 相容个人计算机、DEC Alpha 或 PC98 架构的计算机上执行的 UNIX 作业系统。大家应该听过另一套UNIX的作业系统 Linux,FreeBSD 也是一套免费的作业系统。它可以让我们的个人计算机变成先进的工作站,更稳定的提供你所需的网络服务。
BSD UNIX 系统可以说是网络作业系统的始祖,FreeBSD 是众多 BSD UNIX 分支中的一个,它继承了 BSD 系统的高性能与可靠性。自从1993 年 FreeBSD 推出 1.0-RELEASE 以来,FreeBSD 开发团队便致力于系统的调校,使其发挥绝佳的效能。在 FreeBSD 团队的统筹努力下,使它比起其它免费的 UNIX 作业系统更有结构。在 FreeBSD 上有许多支援的免费软件,这些软件大都已移植收录于 FreeBSD ports 中,使得我们在安装软件时变得十分轻松。FreeBSD 支援 32 位元、64 位元的许多不同平台,具有高效能核心架构、动态函式库共享、绝佳的网络功能,比起其它商用 UNIX 系统毫不逊色。
FreeBSD 作业系统相当容易取得及安装,除了经由传统的光盘安装外,它也可以经由网络安装、MS-DOS 分割区安装等等。当然,我们也可以在计算机中同时安装多种不同的作业系统,例如 Windwos 98 和 FreeBSD 同时并存也是件十分容易的事。
在 FreeBSD 上的应用软件相当的多,也都可以免费取得,由于 FreeBSD 的稳定性高且功能强大,因此许多大型网站都以它为作业平台,其中最知名的就是 YAHOO!。YAHOO! 是一个流量相当大的入口网站,他们选择以 FreeBSD 为作业平台,由此可知 FreeBSD 的优异性。除此之外,在台湾,FreeBSD 普遍被应用于学术网络上,许多大专院校的服务器都是使用 FreeBSD 来提供网络服务。
但是您别以为 FreeBSD 只能用来做为网络服务器,FreeBSD 也可以是一个良好的个人作业系统。事实上,Mac OS X 就是使用 FreeBSD 做为系统核心。大家都知道 Mac OS 是个人计算机上有名的作业系统,它会使用 FreeBSD 做为系统核心,可见 FreeBSD 的质量亦深获 Apple 的肯定。
在宽带网络逐渐普及的台湾,每个人都可以自行架设一台网路服务器,以 FreeBSD 来提供网络服务(如网页、邮件、档案存取等)。值得一提的是 FreeBSD 并不像 MS-Windows 一样每每要求使用者升级计算机才能使用。FreeBSD 对于硬件的要求很低,你可以用一台 Intel 586-133MHz 的旧计算机来安装 FreeBSD,这也算是癈物利用吧。
1.2 为什么要选择FreeBSD?
现在的个人计算机作业系统市场中,是以 MS-Windows 独大,但在网络服务器市场中,UNIX 系统的使用率可不输 MS-Windows 喔。我个人认为 MS-Windows 之所以会有那么多的使用者主要是因为他的使用者介面对初学者而言较容易操作,再加上许多软件的配合及盗版的助长,安装软件只要一直按下一步就完成。使得使 用者即便它的稳定性不高也得乖乖的接受。
其实初学者没有试过其它的作业系统才会有这样的误解,因为一直用 MS-Windows 才会认为当机是无可避免的事,当机对于 MS-Windows 或许是无可避免,但在其它 UNIX 系统中可不常见。在 UNIX 系列的作业系统中,也可以有像 MS-Windows 的图形介面,几乎所有在 MS-Windows 上可以做的事,在 FreeBSD 上都可以做得到,唯一的不同点是你不必花钱去取得你想要的功能。包括排版、图形处理、MP3、多媒体、网络芳邻等等都可以在 FreeBSD 中做到。
重 点是,对于一台网路服务器而言,图形介面会占用系统资源,而且必须安装一堆有的没的软件。笔者偏好乾干脆净净的系统,而 FreeBSD 正好具有这个优点。不过这并不代表您不能使用图形介面,您还是可以安装类似 Windows 的图形介面,让您使用它来做为平日使用的个人计算机。此外,FreeBSD 把自己定位为最佳的网络服务器,它承袭了 BSD 优良的网络血统,在提供服务时能有绝佳的效能表现。而且,它是免费的。
然而,有这么多的免费 UNIX 作业系统中,为什么要选择 FreeBSD 而不使用其它作业系统(如 Linux )呢?在网络上在讨论这个问题时,每每会引发每个作业系统使用者的激辩。对于要使用何种作业系统,除了使用者偏好外,还有许多指标可以提供我们参考。
FreeBSD 是一套完整的作业系统
我 们平常所说的 Linux 指的是它的核心 (Kernel),Kernel 只是整个作业系统的一部份,除了 Kernel 外,我们还需要一些基本的指令、系统及目录架构、图形介面等。Linux 的 Distribution 就是各个不同的组织或公司自行收集一些系统必备的程序,制作出一个作业系统。Linux 系统有很多的 Distribution,如 Redhat、SUSE、Debian 等。因为每个 Distribution 都有自己的程序或架构,所以每个 Distribution 都长的不一样。如果您使用的是 Linux,在 Linux 三十多种 Distribution 中,每一种之间都有些许差异,在设定上用法都不同。
而 FreeBSD 指的不只是核心而已,它是一套完整的作业系统。从系统核心到使用者介面、各种常用指令都是由 FreeBSD 总部所统一推出。因此,FreeBSD 每一个版本之间有着共同的架构,不同软件之间的整合搭配性较为完整,不管是设定、学习都很容易。
由核心团队统筹开发
FreeBSD 整个系统都是由总部的核心团队所维护,所以整个系统都搭配得很好。而 Linux 只有 Kernel 由 Linus Torvlds 所维护。因为 FreeBSD 整个系统都是由总部所开发,不只系统整体较有规划,各个程序之间搭配起来也比较紧密。如果您使用 Linux,由于 Kernel 和其它的程序是由不同组织所维护,在升级时,比较麻烦。而 FreeBSD 就简单多了,每次一有新的版本,一定是整个系统一起升级。
我 觉得 FreeBSD 总部统筹发展 FreeBSD 是一件很棒的事,所有的问题回报都可以统筹管理并予以更新。FreeBSD 推陈出新的速度相当快,每一次安装都确保这个版本不会有上一版的缺失。所以在 Linux 或 MS-Windows 中「新版本不一定是最好」的定律并不适用于 FreeBSD。但这并不意味着你必须不断重新安装系统,FreeBSD 总部随时会发布最新更新的档案提供下载,而且如果使用 CVSUP 就可以和更新版的 FreeBSD 保持同步更新。
完整的使用手册
FreeBSD 的使用手册非常完整,而且会随着软件一起更新。每次一有新的版本推出,FreeBSD 的文件也会做相对的更新。在 FreeBSD 的官方网站上,我们可以轻松的取得这些高质量的手册及文件。
软件安装的便利性
FreeBSD 支援的软件相当多,它将常用的软件分类管理,当需要安装软件时,使用者不必自行到网络上找寻,只要到 FreeBSD ports 目录中下个指令就安装完成。
条理分明的系统架构
FreeBSD 目录结构非常有组织,结构严谨,对于系统管理者而言比较不会紊乱。FreeBSD 将系统预设的目录和管理者自行安装的程序目录划分得十分清楚,管理者在进行升级、维护时可以一目了然。
完美的程序开发平台
安 装完 FreeBSD 后,系统所有程序原始码非常有条理的存放在特定目录中。对于想要进行程序修改的管理者而言,不必四处寻找某支程序原始码。笔者在 FreeBSD 及 Linux 上开发程序多年,我觉得 FreeBSD 原始码及系统架构十分有组织,是程序开发最好的平台。
而且 FreeBSD 的版权较为宽松,对于想要以 FreeBSD 为基础开发产品的公司而言,它可以保护您的修改不会被其它对手抄袭。
1.3 为什么不选择FreeBSD?
许 多企业选择使用目前大多数人使用的 MS windows 做为一般作业用个人计算机的作业系统当然无可厚非。但以 MS windows 做服务器,除了资讯人员的偏好外(或许因为不会使用其它系统吧),还有部份原因是为了在企业内资讯人员技术不足时,能求助于系统供应商。而 FreeBSD 是免费的,企业也害怕有状况时无人可以支援,这对企业是很重要的一项因素。
然而,FreeBSD 的使用人数其实很多,而且使用者都十分热心,在台湾的 BBS 讨论区上,许多问题都可以获得解决。这当然还不够,现在有很多顾问公司提供 FreeBSD 的顾问服务,可以提供企业这方面的服务。虽然说 FreeBSD 的系统稳定,但在应用上如果没有资讯人员的支援,很难能在企业中存活。但正因市场上了解 FreeBSD 的人较少,若我们能主动学习,必能为自己创造更多价值。
FreeBSD 目前支援的平台不多,若您不是使用 X86 的系统,而是使用 ARM、MIPS 等平台,您就必须寻求其它的解决方案。
1.2 postfix简介
Postfix 是一个非常优秀的MTA,她素以高效、安全的特点而著称。Postfix是作者在UNIX上所见过的MTA中在反垃圾邮件(Anti-Spam或Anti -UCE)方面做得最好的一个,甚至有很多公司在Postfix代码的基础上进行二次开发而推出反垃圾邮件网关产品。MTA的反垃圾邮件功能,实际上就是 在MTA处理过程中对会话进行过滤。这个过滤不但过滤了发往自身的垃圾邮件,而且还防止了自身被恶意利用发送垃圾邮件。Postfix实现了目前所有主要 的MTA过滤技术。postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。和Sendmail相比Postfix更快、更容易管理、更灵活、更安全,同时 还与sendmail保持足够的兼容性。
第二章 操作系统FreeBSD安装
FreeBSD6.1系统安装手册
官方安装手册:
QUOTE:
http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/install.html
注意在系统安装过程中,分区方面一定要注意,最好是一个独立的mail分区来存放用户的邮件数据,因为默认的VAR分区读写频繁,数据存放在这样的分区中是很危险的;在安装系统的过程中,建议最小化安装加ports。
第三章 更新ports
3.1 安装CVSUP
QUOTE:
mail# cd /usr/ports/net/cvsup-without-gui
mail# make install clean
安装过程中由于依赖的关系,它会自动安装gettext,会出现下面的选项。
以下是我的选择。
QUOTE:
Options for gettext 0.14.5_2
[X] EXAMPLES install example files
[X] HTMLMAN install man pages in HTML format
3.2 更新ports树
(更新日期2006-07-09)
编辑ports-supfile
QUOTE:
mail# ee /usr/share/examples/cvsup/ports-supfile
QUOTE:
第51行
*default host=CHANGE_THIS.FreeBSD.org
改为:
*default host=cvsup2.freebsdchina.org
QUOTE:
mail# /usr/local/bin/cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
Parsing supfile "ports"
Connecting to Cvsup2.FreeBSD.org.cn
Connected to Cvsup2.FreeBSD.org.cn
Server software version: SNAP_16_1h
Negotiating file attribute support
Exchanging collection information
Establishing multiplexed-mode data connection
Running
Updating collection ports-all/cvs
……
……
Shutting down connection to server
Finished successfully
出现上面的提示,表示更新成功。
第四章 软件安装
4.1 安装perl-5.8.8
QUOTE:
mail# cd /usr/ports/lang/perl5.8
mail# make install clean
4.2 安装mysql-5.0.27
4.2 安装mysql
QUOTE:
mail# cd /usr/ports/databases/mysql50-server
编辑Makefile
mail# ee Makefile
在CONFIGURE_ARGS这段话的
--enable-thread-safe-client前面加上三句参数
BUILD_OPTIMIZED=yes \
BUILD_STATIC=yes \
PTHREAD_LIBS=-lkse \
mail# make WITH_CHARSET=gb2312 WITH_XCHARSET=all BUILD_OPTIMIZED=yes BUILD_STATIC=yes install clean
在rc.conf中加入Mysql的启动参数
QUOTE:
mail# echo 'mysql_enable="YES"' >> /etc/rc.conf
启动mysql
QUOTE:
mail# /usr/local/etc/rc.d/mysql-server start
Starting mysql.
查看mysql是否启动成功
QUOTE:
mail# sockstat -4 | grep 3306
mysql mysqld 1510 3 tcp4 *:3306 *:*
出现上面的端口表示mysql启动成功
4.3 安装httpd-2.2.3
QUOTE:
mail# cd /usr/ports/www/apache22
mail# make install clean
在rc.conf中加入apache的启动参数
QUOTE:
mail# echo 'apache_enable="YES"' >> /etc/rc.conf
启动apache
QUOTE:
mail# /usr/local/etc/rc.d/apache22 start
Starting apache.
查看apache是否启动成功
QUOTE:
mail# sockstat -4 | grep 80
www httpd 10679 16 tcp4 *:80 *:*
www httpd 10678 16 tcp4 *:80 *:*
www httpd 10677 16 tcp4 *:80 *:*
www httpd 10676 16 tcp4 *:80 *:*
www httpd 10675 16 tcp4 *:80 *:*
root httpd 10674 16 tcp4 *:80 *:*
出现上面的80端口表示apache启动成功
4.4 安装php-5.1.6
QUOTE:
mail# cd /usr/ports/lang/php5
mail# make install clean
以下是我的选择
QUOTE:
Options for php5 5.1.6_3
[ ] CLI Build CLI version
[ ] CGI Build CGI version
[X] APACHE Build Apache module
[ ] DEBUG Enable debug
[ ] SUHOSIN Enable Suhosin protection system
[X] MULTIBYTE Enable zend multibyte support
[ ] IPV6 Enable ipv6 support
[ ] REDIRECT Enable force-cgi-redirect support (CGI only)
[ ] DISCARD Enable discard-path support (CGI only)
[ ] FASTCGI Enable fastcgi support (CGI only)
[ ] PATHINFO Enable path-info-check support (CGI only)
QUOTE:
mail# echo 'AddType application/x-httpd-php .php' >> /usr/local/etc/apache/httpd.conf
mail# echo 'AddType application/x-httpd-php-source .phps' >> /usr/local/etc/apache/httpd.conf
编辑httpd.conf加入index.php
QUOTE:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
4.5 安装php5的扩展
QUOTE:
mail# cd /usr/ports/lang/php5-extensions
mail# make install clean
QUOTE:
Options for php5-extensions 1.0
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CTYPE ctype functions
[X] CURL CURL support
[ ] DBA dba support
[ ] DBASE dBase library support
[X] DOM DOM support
[ ] EXIF EXIF support
[ ] FILEINFO fileinfo support
[ ] FILEPRO filePro support
[ ] FRIBIDI FriBidi support
[X] FTP FTP support
[X] GD GD library support
[ ] GETTEXT gettext library support
[ ] GMP GNU MP support
[X] HASH HASH Message Digest Framework
[X] ICONV iconv support
[ ] IMAGICK ImageMagick support
[X] IMAP IMAP support
[ ] INTERBASE Interbase 6 database support (Firebird)
[ ] LDAP OpenLDAP support
[ ] MBSTRING multibyte string support
[X] MCRYPT Encryption support
[X] MHASH Crypto-hashing support
[ ] MING ming shockwave flash support
[ ] MSSQL MS-SQL database support
[X] MYSQL MySQL database support
[ ] MYSQLI MySQLi database support
[ ] NCURSES ncurses support (CLI only)
[ ] ODBC unixODBC support
[ ] OPENSSL OpenSSL support
[ ] PANDA panda support
[ ] PCNTL pcntl support (CLI only)
[X] PCRE Perl Compatible Regular Expression support
[ ] PDF PDFlib support (implies GD)
[X] PDO PHP Data Objects Interface (PDO)
[ ] PGSQL PostgreSQL database support
[X] POSIX POSIX-like functions
[ ] PSPELL pspell support
[ ] READLINE readline support (CLI only)
[ ] RECODE recode support
[X] SESSION session support
[ ] SHMOP shmop support
[X] SIMPLEXML simplexml support
[ ] SNMP SNMP support
[ ] SOAP SOAP support
[ ] SOCKETS sockets support
[X] SQLITE sqlite support
[ ] SYBASE_CT Sybase database support
[ ] SYSVMSG System V message support
[ ] SYSVSEM System V semaphore support
[ ] SYSVSHM System V shared memory support
[ ] TIDY TIDY support
[X] TOKENIZER tokenizer support
[ ] WDDX WDDX support (implies XML)
[X] XML XML support
[X] XMLREADER XMLReader support
[ ] XMLRPC XMLRPC-EPI support
[X] XMLWRITER XMLWriter support
[ ] XSL XSL support (Implies DOM)
[ ] YAZ YAZ support (ANSI/NISO Z39.50)
[X] ZIP ZIP support
[X] ZLIB ZLIB support
重启apache安装完成。
4.6 安装openssl-0.9.7l
QUOTE:
mail# cd /usr/ports/security/openssl
mail# make install clean
4.7 安装phpMyAdmin-2.9.0.2
QUOTE:
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
QUOTE:
mail# cd /usr/ports/distfiles
mail# tar –zxvf phpMyAdmin-2.9.0.2.tar.gz
mail# mv /usr/local/www/phpMyAdmin-2.9.0.2 /usr/local/www/apache22/data/dbadmin
修改/usr/local/www/apache22/data/dbadmin/config.inc.php
QUOTE:
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
4.8 设置数据库
建立postfix数据库(注意:数据库名称为postfix):
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
把下面的sql语句导入到postfix数据库中去:
QUOTE:
-- phpMyAdmin SQL Dump
-- version 2.9.0.2
-- http://www.phpmyadmin.net
--
-- 主机: localhost:3306
-- 生成日期: 2006 年 10 月 30 日 22:17
-- 服务器版本: 4.0.26
-- PHP 版本: 5.1.6
--
-- 数据库: `tmail`
--
-- --------------------------------------------------------
--
-- 表的结构 `address`
--
CREATE TABLE `address` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`name` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
UNIQUE KEY `id` (`id`),
KEY `pw_id` (`pw_id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `address`
--
-- --------------------------------------------------------
--
-- 表的结构 `admin`
--
CREATE TABLE `admin` (
`id` int(10) unsigned NOT NULL auto_increment,
`site_id` int(10) unsigned NOT NULL default '0',
`domain` varchar(128) NOT NULL default '',
`quota` smallint(5) unsigned NOT NULL default '0',
`total` smallint(5) unsigned NOT NULL default '0',
`createtime` timestamp(14) NOT NULL,
`login` char(1) NOT NULL default '',
`cur_total` smallint(5) NOT NULL default '0',
`cur_quota` smallint(5) NOT NULL default '0',
`gid` varchar(11) NOT NULL default '',
`expiration_time` timestamp(14) NOT NULL default '00000000000000',
`flag` int(10) unsigned NOT NULL default '0',
`maxmsg` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `admin`
--
-- --------------------------------------------------------
--
-- 表的结构 `card`
--
CREATE TABLE `card` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`LinkMan` varchar(64) NOT NULL default '',
`CompanyName` varchar(100) NOT NULL default '',
`Address` varchar(255) NOT NULL default '',
`Position` varchar(32) NOT NULL default '',
`PhoneNumber` varchar(16) NOT NULL default '',
`Mobile` varchar(12) NOT NULL default '',
`Email` varchar(128) NOT NULL default '',
`Partaker` varchar(32) NOT NULL default '',
`Memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=27 ;
--
-- 导出表中的数据 `card`
--
-- --------------------------------------------------------
--
-- 表的结构 `lastauth`
--
CREATE TABLE `lastauth` (
`user` char(32) NOT NULL default '',
`domain` char(64) NOT NULL default '',
`remote_ip` char(18) NOT NULL default '',
`timestamp` bigint(20) NOT NULL default '0',
PRIMARY KEY (`user`,`domain`)
) TYPE=MyISAM;
--
-- 导出表中的数据 `lastauth`
--
-- --------------------------------------------------------
--
-- 表的结构 `logs`
--
CREATE TABLE `logs` (
`pw_id` int(5) default '0',
`ip` varchar(15) NOT NULL default '',
`action` varchar(15) NOT NULL default '',
`time` datetime default NULL,
`content` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default ''
) TYPE=MyISAM;
--
-- 导出表中的数据 `logs`
--
-- --------------------------------------------------------
--
-- 表的结构 `message`
--
CREATE TABLE `message` (
`id` int(5) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`createtime` datetime NOT NULL default '0000-00-00 00:00:00',
`updatetime` datetime NOT NULL default '0000-00-00 00:00:00',
`pw_domain` varchar(64) NOT NULL default '',
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;
--
-- 导出表中的数据 `message`
--
-- --------------------------------------------------------
--
-- 表的结构 `personal`
--
CREATE TABLE `personal` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`truename` varchar(10) NOT NULL default '',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=12 ;
--
-- 导出表中的数据 `personal`
--
-- --------------------------------------------------------
--
-- 表的结构 `scheduler`
--
CREATE TABLE `scheduler` (
`id` int(11) unsigned NOT NULL auto_increment,
`begin_time` int(11) unsigned default NULL,
`end_time` int(11) unsigned default NULL,
`title` varchar(255) NOT NULL default '',
`body` varchar(255) NOT NULL default '',
`pw_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `scheduler`
--
-- --------------------------------------------------------
--
-- 表的结构 `stow`
--
CREATE TABLE `stow` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`Name` varchar(128) NOT NULL default '',
`http` varchar(255) NOT NULL default 'http://',
`memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `stow`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_access`
--
CREATE TABLE `tmail_access` (
`id` int(11) unsigned NOT NULL auto_increment,
`ctime` int(11) unsigned default NULL,
`source` varchar(128) NOT NULL default '',
`access` varchar(16) NOT NULL default '',
`type` char(1) NOT NULL default 'S',
PRIMARY KEY (`id`),
KEY `source` (`source`,`type`,`access`,`ctime`)
) TYPE=MyISAM AUTO_INCREMENT=65 ;
--
-- 导出表中的数据 `tmail_access`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_alias`
--
CREATE TABLE `tmail_alias` (
`id` int(11) unsigned NOT NULL auto_increment,
`alias` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_alias`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_autobbc`
--
CREATE TABLE `tmail_autobbc` (
`id` int(9) NOT NULL auto_increment,
`realname` varchar(128) default NULL,
`email` varchar(128) NOT NULL default '',
`autobbc` varchar(128) NOT NULL default '',
`come` int(1) default NULL,
`out` int(1) default NULL,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_autobbc`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_company`
--
CREATE TABLE `tmail_company` (
`id` int(6) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`linkman` varchar(50) NOT NULL default '',
`tel` varchar(15) NOT NULL default '',
`Address` varchar(50) NOT NULL default '',
`zip` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_company`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_domaininfo`
--
CREATE TABLE `tmail_domaininfo` (
`id` tinyint(11) NOT NULL auto_increment,
`domain` varchar(25) NOT NULL default '',
`transport` varchar(128) NOT NULL default '',
`alias` varchar(50) default NULL,
`passwd` varchar(35) NOT NULL default '',
`clean` text NOT NULL,
`admin` tinytext NOT NULL,
`yesno` tinytext NOT NULL,
`usernum` text NOT NULL,
`quota` text NOT NULL,
`filequota` text NOT NULL,
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`),
KEY `domain_id` (`id`)
) TYPE=MyISAM PACK_KEYS=0 COMMENT='domain information' AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_domaininfo`
--
INSERT INTO `tmail_domaininfo` (`id`, `domain`, `transport`, `alias`, `passwd`, `clean`, `admin`, `yesno`, `usernum`, `quota`, `filequota`, `expire`, `create_time`) VALUES
(1, 'admin', 'maildrop', NULL, '$1$t5h6XOby$UP3HJpdrozxEsRlcLF6tI0', 'hing4585', '0', '1', '0', '0', '0', '0000-00-00', '2006-10-06 16:44:13');
-- --------------------------------------------------------
--
-- 表的结构 `tmail_group_name`
--
CREATE TABLE `tmail_group_name` (
`id` int(9) NOT NULL auto_increment,
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_group_name`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_monitor`
--
CREATE TABLE `tmail_monitor` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`cc` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `email` (`email`,`cc`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_monitor`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_pop`
--
CREATE TABLE `tmail_pop` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`pop` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`pass` varchar(32) NOT NULL default '32',
`timeout` int(10) unsigned NOT NULL default '60',
`port` tinyint(3) unsigned NOT NULL default '110',
`keep` char(1) NOT NULL default 'Y',
PRIMARY KEY (`id`),
KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_pop`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relay_domains`
--
CREATE TABLE `tmail_relay_domains` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relay_domains`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_relocated`
--
CREATE TABLE `tmail_relocated` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_relocated`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_transport`
--
CREATE TABLE `tmail_transport` (
`id` int(11) unsigned NOT NULL auto_increment,
`domain` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_transport`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_userpersonal`
--
CREATE TABLE `tmail_userpersonal` (
`id` int(11) NOT NULL auto_increment,
`address` varchar(50) default NULL,
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`month` int(2) NOT NULL default '0',
`day` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=InnoDB AUTO_INCREMENT=43 ;
--
-- 导出表中的数据 `tmail_userpersonal`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_users`
--
CREATE TABLE `tmail_users` (
`id` int(11) unsigned NOT NULL auto_increment,
`userid` tinytext NOT NULL,
`domain` varchar(128) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
`clear` varchar(128) NOT NULL default '',
`crypt` varchar(128) NOT NULL default '',
`realname` tinytext NOT NULL,
`uid` int(11) unsigned NOT NULL default '1003',
`gid` int(11) unsigned NOT NULL default '1003',
`homedir` tinytext NOT NULL,
`maildir` tinytext NOT NULL,
`quota` tinytext NOT NULL,
`file_quota` tinytext NOT NULL,
`access` enum('Y','N') NOT NULL default 'Y',
`postfix` enum('Y','N') NOT NULL default 'Y',
`disablepop3` char(1) NOT NULL default '0',
`disableimap` char(1) NOT NULL default '0',
`disablewebmail` char(1) NOT NULL default '0',
`sharedgroup` varchar(128) NOT NULL default '0',
`smtpaccess` enum('Y','N') NOT NULL default 'Y',
`expire` date NOT NULL default '0000-00-00',
`create_time` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_users`
--
-- --------------------------------------------------------
--
-- 表的结构 `tmail_virtual`
--
CREATE TABLE `tmail_virtual` (
`id` int(11) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL default '',
`destination` varchar(128) NOT NULL default '',
`group_name` varchar(128) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
`group` int(1) default NULL,
`alias` int(1) default NULL,
`forward` int(1) default NULL,
`forward_bak` int(1) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `tmail_virtual`
--
-- --------------------------------------------------------
--
-- 表的结构 `vpopmail`
--
CREATE TABLE `vpopmail` (
`pw_id` int(5) unsigned NOT NULL auto_increment,
`pw_name` varchar(32) NOT NULL default '',
`pw_domain` varchar(64) NOT NULL default '',
`pw_passwd` varchar(40) NOT NULL default '',
`pw_uid` int(11) default NULL,
`pw_gid` int(11) default NULL,
`pw_gecos` varchar(48) default NULL,
`pw_dir` varchar(255) default NULL,
`pw_shell` varchar(20) default NULL,
`createtime` timestamp(14) NOT NULL,
PRIMARY KEY (`pw_id`),
KEY `pw_name` (`pw_name`,`pw_domain`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=1 ;
--
-- 导出表中的数据 `vpopmail`
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便.
建立数据库用户并授以相应的权限
QUOTE:
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
重新启动mysql
mail# /usr/local/bin/mysql –u root –p
mysql# use mysql;
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
4.9 安装cyrus-sasl-2.1.22
QUOTE:
mail# cd /usr/ports/security/cyrus-sasl2
mail# make WITH_MYSQL=yes WITH_AUTHDAEMON=yes install clean
WITH_AUTHDAEMON=yes参数是为了让sasl支持authdamond的认证方式
WITH_MYSQL=yes参数是为了让sasl支持mysql认证方式
4.10 安装postfix-2.3.3
QUOTE:
mail# cd /usr/ports/mail/postfix
mail# make install clean
以下是我的选择
QUOTE:
Postfix configuration options
Please select desired options:
[ ] NOPCRE DISABLE Perl Compatible Regular Expressions
[ ] SASL Cyrus SASLv1 (Simple Authentication and Security Layer)
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
[ ] SASLKRB If your SASL requires Kerberos select this option
[ ] SASLKRB5 If your SASL requires Kerberos5 select this option
[ ] SASLKRB5MIT If your SASL requires MIT Kerberos5 select this option
[ ] SPF SPF support
[ ] TLS SSL and TLS
[ ] BDB Berkeley DB (select version using WITH_BDB_VER variable)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[ ] PgSQL PostgreSQL map lookups (choose with DEFAULT_PGSQL_VER)
[ ] OpenLDAP OpenLDAP map lookups (choose ver. with WITH_OPENLDAP_VER)
[ ] CDB CDB map lookups
[ ] NIS NIS map lookups
[X] VDA VDA (Virtual Delivery Agent)
[ ] Test SMTP/LMTP test server and generator
安装过程中会让你回答两个问题,
QUOTE:
===> Installing for postfix-2.2.10_1,1
===> postfix-2.2.10_1,1 depends on shared library: sasl2.2 - found
===> postfix-2.2.10_1,1 depends on shared library: pcre.0 - found
===> postfix-2.2.10_1,1 depends on shared library: mysqlclient.14 - found
Added group "postfix".
Added group "maildrop".
Added user "postfix".
You need user "postfix" added to group "mail".
Would you like me to add it [y]? y
是否把postfix用户加入到mail用户组。回答Y
Installed HTML documentation in /usr/local/share/doc/postfix
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在rc.conf中加入postfix的启动选项
QUOTE:
mail# echo 'postfix_enable="YES"' >> /etc/rc.conf
mail# echo 'sendmail_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_submit_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_outbound_enable="NO"' >> /etc/rc.conf
mail# echo 'sendmail_msp_queue_enable="NO"' >> /etc/rc.conf
4.11 安装courier-imap-4.1.1
QUOTE:
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
以下是我的选择
QUOTE:
Options for courier-imap 4.1.1,1
[ ] OPENSSL Build with OpenSSL support
[ ] FAM Build in fam support for IDLE command
[ ] TRASHQUOTA Include deleted mails in the quota
[ ] GDBM Use gdbm db instead of system bdb
[ ] IPV6 Build with IPv6 support
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
在rc.conf中加入courier的启动选项
QUOTE:
mail# echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
mail# echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
QUOTE:
mail# /usr/local/etc/rc.d/courier-authdaemond start
Starting courier_authdaemond.
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
对/var/run/authdaemond目录加执行权限
QUOTE:
mail# chmod +x /var/run/authdaemond
4.12 安装MailScanner-install-4.55.10-3
QUOTE:
mail# cd /usr/ports/mail/mailscanner
mail# make install clean
在安装MailScanner的过程中会出现以下几个选项。以下是我的选择
QUOTE:
Options for MailScanner 4.55.10
[X] SPAMASSASSIN Install SpamAssassin
[X] CLAMAV Install ClamAV
[X] CLAMAVMODULE Install ClamAV Module
[ ] BDC Install BitDefender
Options for sqlite 3.3.6
[ ] TCLWRAPPER TCL wrapper for SQLITE
[ ] THREADS Enable threads support
[ ] DEBUG Enable debugging & verbose explain
[ ] DOCS Building docs (depends on TCL)
Options for Mail-SpamAssassin-3.1.6
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[ ] MYSQL Add MySQL support
[ ] PGSQL Add PostreSQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
Options for clamav 0.88.5
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
[X] STDERR Print logs to stderr instead of stdout
生成初始配置文件
QUOTE:
mail# make initial-config
根据提示创建MailScanner运行所需的目录
mail# mkdir -p /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown -R postfix:postfix /var/spool/MailScanner
分别在rc.conf中加入clamav、spamassassin和MailScanner的启动参数
QUOTE:
mail# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
mail# echo 'clamav_milter_enable="YES"' >> /etc/rc.conf
mail# echo 'mailscanner_enable="YES"' >> /etc/rc.conf
mail# echo 'spamd_enable="YES"' >> /etc/rc.conf
4.13 安装maildrop-2.0.2
QUOTE:
mail# cd /usr/ports/mail/maildrop
mail# make install WITH_AUTHLIB=yes
以下是我的选择
QUOTE:
Options for maildrop 2.0.2
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
QUOTE:
mail# /usr/local/bin/maildrop -v
maildrop 2.0.2 Copyright 1998-2005 Double Precision, Inc.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
出现上面红色的部分表示maildrop支持Courier。
第五章 软件系统配置
为了支持maildrop,先加入vmail用户
QUOTE:
mail# pw adduser vmail -u 1003 -s /sbin/nologin -d /dev/null
5.1 配置cyrus-sasl
创建/usr/local/lib/sasl2/smtpd.conf
QUOTE:
mail# ee /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login
sql_engine: mysql
sql_hostnames: localhost
sql_user: tmail
sql_passwd: tmail
sql_database: tmail
sql_select: select clear from tmail_users where email='%u@%r' and smtpaccess='Y'
5.2 配置postfix
QUOTE:
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
mail# ee /usr/local/etc/postfix/main.cf
修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
QUOTE:
# new add
myhostname = mail.test.com
smtp_helo_name = $myhostname
local_transport = maildrop
mailbox_transport = maildrop
smtpd_error_sleep_time = 0
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
default_process_limit = 100
#alias_maps = hash:/usr/local/etc/postfix/aliases
#Alias_database = hash:/usr/local/etc/postfix/aliases
mydestination = mysql:/usr/local/etc/postfix/mysql-mydest.cf
virtual_transport_maps = mysql:/usr/local/etc/postfix/mysql-transport.cf
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-virtual.cf
#virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql-alias.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-in.cf
sender_bcc_maps = mysql:/usr/local/etc/postfix/mysql-autobbc-out.cf
local_recipient_maps = $alias_maps $virtual_mailbox_maps $virtual_maps
virtual_mailbox_base = /mail
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql-virtual-maps.cf
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql-virtual-quota.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
virtual_uid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/mysql-virtual-gid.cf
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_auth_destination,
reject
smtpd_sender_restrictions =
reject_unknown_sender_domain,
reject_non_fqdn_sender,
check_sender_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit
smtpd_recipient_restrictions =
permit_mynetworks,
check_client_access mysql:/usr/local/etc/postfix/mysql-access.cf,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_unauth_destination,
reject_rbl_client cblless.anti-spam.org.cn,
permit
default_destination_recipient_limit = 1
local_destination_concurrency_limit = 1
maildrop_destination_recipient_limit = 1
message_size_limit = 41943040
smtpd_recipient_limit = 10
bounce_queue_lifetime = 12h
maximal_queue_lifetime = 24h
smtpd_delay_reject = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-access.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select access from tmail_access where source = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-alias.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select alias from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-in.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND come='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-autobbc-out.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
query = select autobbc from tmail_autobbc where email = '%s' AND 'out'='1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-mydest.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select domain from tmail_domaininfo where domain = '%s' AND yesno = '1'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-transport.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_domaininfo
query = select transport from tmail_domaininfo where domain = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-gid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select gid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-uid.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select uid from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-maps.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select maildir from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual-quota.cf
hosts = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_users
query = select quota from tmail_users where email = '%s'
QUOTE:
mail# ee /usr/local/etc/postfix/mysql-virtual.cf
host = localhost
user = tmail
password = tmail
dbname = tmail
table = tmail_virtual
query = select destination from tmail_virtual where email = '%s'
5.3 配置Courier-imap
修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
QUOTE:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
修改/usr/local/etc/courier-imap/pop3d
QUOTE:
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
编辑修改/usr/local/etc/authlib/authmysqlrc
QUOTE:
MYSQL_SERVER localhost
MYSQL_USERNAME tmail
MYSQL_PASSWORD tmail
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE tmail
MYSQL_USER_TABLE tmail_users
MYSQL_CRYPT_PWFIELD crypt
#MYSQL_CLEAR_PWFIELD clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
MYSQL_AUXOPTIONS_FIELD CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3,",disablewebmail=",disablewebmail,",sharedgroup=",sharedgroup)
MYSQL_WHERE_CLAUSE access='y'
注:红色部分为一行。这里得用tab键来跳格
编辑/usr/local/etc/authlib/authdaemonrc
QUOTE:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
5.4 安装Tmail管理工具
本节主要介绍如何安装Tmail管理工具。
更改httpd.conf中的Group www、User www修改为: Group vmail、User vmail
安装Tmail管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改config/config.inc.php中的
QUOTE:
define(MAILDIR,"/mail"); //邮件存放目录
define(MISC, ".misc");
define(MODE,0700);
$PageSize = 15; //用户列表和域名列表每一页显示多少行
$host = "localhost"; //数据库主机名
$user = "tmail"; //数据库用户名
$dbname = "tmail"; //数据库名称
$password = "tmail"; //数据库密码
设置好后,加一个域名为test.com,加一个邮件用户为: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
5.5 登录测试
重新启动相关服务
QUOTE:
mail# /usr/local/etc/rc.d/apache22 restart
mail# /usr/local/etc/rc.d/mysql-server restart
mail# /usr/local/etc/rc.d/courier-authdaemond stop
mail# /usr/local/etc/rc.d/courier-authdaemond start
mail# /usr/local/etc/rc.d/courier-imap-imapd.sh restart
mail# /usr/local/etc/rc.d/courier-imap-pop3d.sh restart
mail# /usr/local/etc/rc.d/postfix reload
生成用户名的base64编码
QUOTE:
mail# perl -MMIME::Base64 -e 'print encode_base64(" test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 ");'
dGVzdEB0ZXN0LmNvbQ==
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试25发送
QUOTE:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
220 mail.test.com ESMTP Postfix
ehlo mail
250-mail.test.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
auth login
334 VXNlcm5hbWU6
dGVzdEB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6
MDAwMDAw
235 Authentication successful
MAIL FROM:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
RCPT TO:< test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
SUBJECT:test
test
.
250 Ok: queued as 47C6CB83E
quit
221 Bye
Connection closed by foreign host.
测试110收邮件
QUOTE:
mail# telnet localhost 110
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.test.com.
Escape character is '^]'.
+OK Hello there.
user test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
+OK Password required.
pass 000000
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 1563
2 401
.
retr 2
+OK 401 octets follow.
Return-Path: < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Delivered-To: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
Received: from mail (localhost.test.com [127.0.0.1])
by mail.test.com (Postfix) with ESMTP id 47C6CB83E
for < test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >; Tue, 11 Jul 2006 13:47:28 +0800 (CST)
SUBJECT:test
Message-Id: < 20060711054736.47C6CB83E@mail.test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 >
Date: Tue, 11 Jul 2006 13:47:28 +0800 (CST)
From: test@test.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
To: undisclosed-recipients:;
test
.
dele 2
+OK Deleted.
quit
+OK Bye-bye.
Connection closed by foreign host.
5.6 垃圾邮件和病毒邮件过滤设置
设置MailScanner
编辑/usr/local/etc/postfix/main.cf
QUOTE:
mail# ee /usr/local/etc/postfix/main.cf
去掉513行的注释
QUOTE:
header_checks = regexp:/usr/local/etc/postfix/header_checks
编辑/usr/local/etc/postfix/header_checks
QUOTE:
mail# ee /usr/local/etc/postfix/header_checks
新加入
/^Received:/ HOLD
重新加载postfix配置文件
mail# postfix reload
编辑/usr/local/etc/MailScanner/MailScanner.conf,以下是我的配置文件,更改相应的参数为下面的格式。
QUOTE:
%org-name% = thismail.org
%org-long-name% = LCSoft
%web-site% = www.thismail.org
%etc-dir% = /usr/local/etc/MailScanner
%report-dir% = /usr/local/share/MailScanner/reports/en
%rules-dir% = /usr/local/etc/MailScanner/rules
%mcp-dir% = /usr/local/etc/MailScanner/mcp
Run As User = postfix
Run As Group = postfix
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
Sendmail = /usr/sbin/sendmail
Monitors for ClamAV Updates = /var/db/clamav/*.cvd
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin
Custom Functions Dir = /usr/local/lib/MailScanner/MailScanner/CustomFunctions
SpamAssassin Install Prefix = /usr/local/bin
SpamAssassin Site Rules Dir = /usr/local/etc/mail/spamassassin
SpamAssassin Local Rules Dir = /usr/local/share/spamassassin
编辑配置文件/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
QUOTE:
mail# ee /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
# MailScanner
# MailScanner users, please see the comments at the bottom of this file.
# MailScanner
#
# SpamAssassin user preferences file.
#
# Format:
#
# required_hits n
# (how many hits are required to tag a mail as spam.)
#
# score SYMBOLIC_TEST_NAME n
# (if this is omitted, 1 is used as a default score.
# Set the score to 0 to ignore the test.)
#
# # starts a comment, whitespace is not significant.
#
###########################################################################
# Whitelist and blacklist addresses are *not* patterns; they're just normal
# strings. one exception is that "*@isp.com" is allowed. They should be in
# lower-case. You can either add multiple addrs on one line,
# whitespace-separated, or you can use multiple lines.
#
# Monty Solomon: he posts from an ISP that has often been the source of spam
# (no fault of his own ;), and sometimes uses Bcc: when mailing.
#
#whitelist_from monty@roscom.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Add your blacklist entries in the same format...
#
# blacklist_from friend@public.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
#
#ok_locales en
skip_rbl_checks 1
use_bayes 0
use_dcc 0
use_pyzor 0
use_razor1 0
use_razor2 0
decode_attachments 1
编辑配置文件/usr/local/etc/MailScanner/rules/max.message.size.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/max.message.size.rules
# This is an example ruleset to show how rules can have resulting values
# other than yes and no. This ruleset demonstrates having a numerical result.
# The From: and To: rules show how simple domains can be used to select
# different values for the result of the ruleset.
# Note that the fields of each rule line can be separated by any whitespace,
# any combination of tabs and spaces.
#
# The 2 lines involving domain3.com show that for email to user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。
# has a limit of 5Mbytes per message, while email to any other user
# @domain3.com has a limit of 500Kbytes per message.
#
To: *@domain1.com 10M
To: *@domain2.com 20M
From: user@domain3.com电子邮件地址已被防垃圾邮件功能所隐藏, 您需要把Javascript功能打开才能看到。 5M
From: *@domain3.com 500K
#
# The following line specifies the default result used when none of the
# other rules match. In this example,
# Maximum Message Size = 0
# means that there is no limit to the size of the message.
#
FromOrTo: default 0
编辑配置文件/usr/local/etc/MailScanner/rules/bounce.rules
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/bounce.rules
# You can use this ruleset to enable the "bounce" Spam Action.
# You must *only* enable this for mail from sites with which you have
# agreed to bounce possible spam. Use it on low-scoring spam only (<10)
# and only to your regular customers for use in the rare case that a
# message is mis-tagged as spam when it shouldn't have been.
# Beware that many sites will automatically delete the bounce messages
# created by using this option unless you have agreed this with them in
# advance.
# This next line gives an example of how you might enable this option for
# a frequent customer of yours.
#From: yourcustomer.com yes
# Under no circumstances should this be changed to "yes".
FromOrTo: default no
重新启动mailscanner.
QUOTE:
mail# /usr/local/etc/rc.d/mailscanner restart
加入中文垃圾邮件规则
QUOTE:
mail# cd /usr/local/share/spamassassin
mail# fetch http://www.ccert.edu.cn/spam/sa/Chinese_rules.cf
注意:由于加入了中文垃圾邮件规则,请把垃圾邮件的评分的分数设置为高一些。
我的设置为8,最高分设置为10,这样可以降低中文邮件的错误识别率。用户可以根据自己的需要来改变这两个分值。
QUOTE:
Required SpamAssassin Score = 8
High SpamAssassin Score = 10
为了避免邮件扫描后主题变成乱码,建议改变以下设置为no
QUOTE:
Virus Modify Subject = no
Filename Modify Subject = no
Content Modify Subject = no
Disarmed Modify Subject = no
Spam Modify Subject = yes
High Scoring Spam Modify Subject = no
扫描垃圾邮件所执行的运作
QUOTE:
Spam Actions = deliver
High Scoring Spam Actions = delete
相关运作参数说明:
QUOTE:
"deliver" -- 邮件正常的转送至原来的收信人。
"delete" -- 删除邮件。
"store" -- 将邮件存放至隔离区。
"bounce" -- 将邮件退给寄信人。
"forward" -- 提供一个 forward 的邮件位址给系统,系统会自动转寄一份。
"striphtml" -- 将内嵌 HTML 的邮件转成 Text,你必需要加入 "deliver",系统才会帮你寄邮件。
允许html邮件通行
QUOTE:
Allow IFrame Tags = yes
Allow Form Tags = yes
Allow Script Tags = yes
Allow WebBugs = disarm
Allow Object Codebase Tags = yes
Convert Dangerous HTML To Text = no
Convert HTML To Text = no
允许本机发送出去的邮件不被MailScanner视为垃圾邮件
QUOTE:
mail# ee /usr/local/etc/MailScanner/rules/spam.whitelist.rules
From: 127.0.0.1 yes
以上规则的说明:以上垃圾邮件的规则是加入了中文垃圾邮件主题和内容的评分规则,所以我设置了一个最低分为8分,最高分为10分的规则,8-10分间的邮件会被打上[spamd]的标识,高于10分的邮件会被自动的删除掉,以上规则允许html邮件通过。
第六章 安装webmail
到开邮件邮件技术论坛
http://www.thismail.org/bbs/thread.php?fid=17
取得最新的webmail
下载后传到服务器上的web目录,后配置php的全局变量为打开
QUOTE:
register_globals = On
并编辑webmail/config/config_inc.php中如下参数
QUOTE:
$CFG_BASEPATH = "/tmp/tmail/temp"; //临时目录,如果不存在,修改完配置文件后再手动创建,并附于相关的权限
// Mysql
define(MYSQL_HOST, 'localhost'); //数据库主机名
define(MYSQL_USER, 'postfix'); //数据库用户名
define(MYSQL_PASS, 'postfix'); //数据库密码
define(MYSQL_DATA, 'postfix'); //数据库名称
$CFG_NETDISK_PATH = "/mail/netdisk"; //文件管理(网络磁盘所在的系统路径)如果不存在,修改完配置文件后再手动创建,并附于相关的权限
$CFG_NETDISK_DEFAULT_QUOTA = 10; //文件管理(网络磁盘)默认大小为10MB,用户可根据自己的需要改变大小
。
QUOTE:
mail# mkdir -p /tmp/tmail/temp
mail# chown -R postfix:postfix /tmp/tmail
mail# mkdir -p /mail/netdisk
mail# chown -R postfix:postfix /mail/netdisk
为了webmail能配合maildrop做中文邮件的过滤。请写/usr/sbin/maildecode文件
QUOTE:
mail# ee /usr/sbin/maildecode
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
my $a = $ARGV[0] || '';
#Maybe arg is include Subject
if ($a=~/^Subject/) {
$a = $ARGV[1] || '';
};
if ($a=~/=?[w-]+?B?(.*)?=$/) {
use MIME::Base64;
$a = decode_base64($1);
};
if ($a=~/=?[w-]+?Q?(.*)?=$/) {
use MIME::QuotedPrint;
$a = decode_qp($1);
};
#open(OUTFILE, ">/tmp/list.log");
#print OUTFILE $a;
#close(OUTFILE);
print $a;
exit(0);
并改变相关的权限
QUOTE:
mail# chmod 755 /usr/sbin/maildecode
mail# chown -R vmail:vmail /usr/sbin/maildecode
安装成功后的webmail
附一、常见问题
正在收集中……
附二、MailScanner.conf中文参数说明
http://www.thismail.org/bbs/htm_data/7/0509/533.html
更深入一点理解 switch 语句 及 c/c++ 对 const 的处理
谢煜波
http://blog.csdn.net/xiaohan13916830/archive/2004/08/17/76724.aspx
前段时间在论坛上看见台湾李维在<>一书中对windows编程模式中,消息处理部分有如下的一些分析:
他说,在消息处理循环中,一般的形式是这样的
MSG msg ;
switch( msg ){
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
} ;
李维说,这种模式是很低效的,因应经过汇编后,这种C代码会产生如下的汇编代码
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
如果你的 case 足够多,比如,你有一万条消息需要处理,而不幸的是你把一条最常用的消息
放在了最后一位,那么当这条消息要得到处理,会首先经过一万次的cmp与jnz, 李维认为,这
是非常非常低效的,实在是低效的忍无可忍,无需再忍~~:P
在起初,我也是这样认为的,但近来的阅读及实验却发现,这种看法非常片面,今天就来谈谈这个问题( 所有实验在 linux 平台下完成 )
首先看一到用 c 编写的程序
/* -------------------- filename : ta.c --------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
}
return res ;
}
然后,我们用 gcc 将它编译成汇编文件( 使用 -S 开关 )
gcc -S ta.c
将得到如下的汇编文件( ta.s )
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, -8(%ebp)
cmpl $102, -8(%ebp) // 1
je .L4 // 2
cmpl $102, -8(%ebp) // 3
jg .L8 // 4
cmpl $100, -8(%ebp) // 5
je .L3 // 6
jmp .L2 // 7
.L8:
cmpl $103, -8(%ebp)
je .L5
jmp .L2
.L3:
movl $1, -4(%ebp)
jmp .L2
.L4:
movl $2, -4(%ebp)
jmp .L2
.L5:
movl $3, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意看文件中 // 1 ~ // 7 的部份,从这个部份,我们可以看出,gcc确实是把一些case语句转成了李维所说的那种方式进行处理,我们看见了代码中存在有众多的 cmpl 与 jmp 语句
这就相当于你使用if..else..一样,但是否总是这样呢?
我们下面改动一下 ta.c 这个文件,在里面再多加一些 case 语句
/* -------------- filename : new_ta.c ------------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
case 104 :
res = 4 ;
break ;
case 105 :
res = 5 ;
break ;
case 106 :
res = 6 ;
break ;
}
return res ;
}
这个 new_ta.c 与原来的 ta.c 在结构上完全相同,唯一不同的就是 case 语句的数量变多了,下面我们来编译一下这个文件
gcc -S new_ta.c
下面是我们产生的更新的汇编文件
.file "new_ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax
jmp *%eax
.section .rodata
.align 4
.align 4
.L9: // A
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
.L3: // 1
movl $1, -4(%ebp)
jmp .L2
.L4: // 2
movl $2, -4(%ebp)
jmp .L2
.L5: // 3
movl $3, -4(%ebp)
jmp .L2 // 4
.L6:
movl $4, -4(%ebp)
jmp .L2 // 5
.L7:
movl $5, -4(%ebp) // 6
jmp .L2
.L8: // 7
movl $6, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
仔细比较一下这个最新的 new_ta.s 与前面的 ta.s,精华全在里面了!
首先 new_ta.s 比前面的 ta.s 多了一个 .L9 部分,而且它的 // 1 ~ // 7 中没有了前面
ta.s 文件中所存在的众多的 cmpl 与 jmp 语句,那么,现在这样的代码又是怎么实现
switch 语句中的跳转的呢?我们来仔细分析一下它新多出来的 .L9 部份。
.section .rodata
.align 4
.align 4
.L9:
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
显而易见,.L9 部份是一个我们最常见的数据结构——表,它的每一项都是一个标号,而这个标号,恰恰是每个 case 语句的入口标号!
这很容易让我们想到,它很可能是用了一张表来存放所有的 case 语句的入口,然后,在
执行 switch 语句的时候就从这个表中直接检出相应的 case 语句的入口地址,然后跳转
到相应的 case 语句去执行,就像hash_table似的。具体是不是这样呢?我们看看进入
switch 部份的代码:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax // 1
jmp *%eax // 2
果然如此!首先在 // 1 处根据%edp的值(其值相当于表的下标)在.L9的表中找到相应
case 语句的入口地址,并把这个地址存到%eax中,然后通过 // 2 (这是一个间接跳转
语句)转到%eax存放的地址中,也即相应的case语句处。
C编译器,果然聪明!
通过这个分析我们可以知道如下两点:
1. 当 case 语句少的时候,C编译器将其转成 if..else.. 类型进行处理,运用较多的
cmp 与 jmp 语句 ,而当 case 语句较多的时候,C编译器会出成一个跳转表,而直
接通过跳转表进行跳转,这让 switch 具有非常高的效律,而且效律几乎不会因为
case 语句的增长而减小,李维所担忧的问题是完全不会发生的
2. 可以问答下面几个问题:
1. 为什么 case 语句中需要的是整数类型而不能是其余的类型?
这是因为,case 语句中的这个值是用来做跳转表的下标的,因此,当然必须是整数
2. 为什么 case 语句在不加break的时候具有直通性?
这是因为跳转是在进入 switch 是计算出的,而不是在case语句中计算出的,整个
case 语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。
上面的内容,在《Computer Systems A Programmer's Perspective》中有很详细的论述,
感兴趣可以去找来仔细看看~~~
既然,case 语句需要的是整数的常量值,那么我们是否可用 const 类型呢?比如下面
一段代码:
const int c_1 = 100 ;
const int c_2 = 102 ;
void test( int x )
{
switch( x ){
case c_1 :
++x ;
case c_2 :
--x ;
}
}
这段代码,用 c 编译器编译,编译器会提示错误,但在 c++ 编译器中却不会,这主要是由于 c , 与 c++ 编译器对 const 这个东东的处理不同。我们来看看下面一段 c 程序
/*------------- filename : const_c.c -----------*/
const int a = 15 ;
void f( int x )
{
x = a ;
}
同样用 gcc 编译
gcc -S const_c.c
然后,来看看它的汇编文件
.file "const_c.c"
.globl a
.section .rodata
.align 4
.type a,@object
.size a,4
a: // 1
.long 15
.text
.globl f
.type f,@function
f:
pushl %ebp
movl %esp, %ebp
movl a, %eax // 2
movl %eax, 8(%ebp)
leave
ret
.Lfe1:
.size f,.Lfe1-f
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意 // 1 处,C 编译器为 a 分配了地址,并把它的值设为 15 ,而在 // 2 处,它是将
a 这个地址中的值赋给了 %eax,这同一般的普通变量而非const 变量赋值没什么两样
下面我们用 c++ 编译器来编译这段代码,它产生的汇编文件如下:
.file "const_cpp.cpp"
.text
.align 2
.globl _Z1fi
.type _Z1fi,@function
_Z1fi:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
movl $15, 8(%ebp) // 1
leave
ret
.LFE2:
.Lfe1:
.size _Z1fi,.Lfe1-_Z1fi
.section .rodata
.align 4
.type a,@object
.size a,4
a:
.long 15
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
同样注意// 1 处,它以经把 a 的值用 15 来取代了,
也就是说,在c中const变量的行为更像一个非const变量,而在cpp中,const变量的行为就像是#define
由于 c++ 中,const 变量的值是在编译时就计算出来的,因此,它可以用在 case 语句中,而 c 中,const值在编译时只是一个变量的地址,因此,它无法用在 case 语句中.
-----------------------------------------------------------------------------
参考文献:<>
谢煜波
http://blog.csdn.net/xiaohan13916830/archive/2004/08/17/76724.aspx
前段时间在论坛上看见台湾李维在<
他说,在消息处理循环中,一般的形式是这样的
MSG msg ;
switch( msg ){
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
case WM_XXXXXXX :
....
} ;
李维说,这种模式是很低效的,因应经过汇编后,这种C代码会产生如下的汇编代码
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
cmp .... .....
jnz .... .....
如果你的 case 足够多,比如,你有一万条消息需要处理,而不幸的是你把一条最常用的消息
放在了最后一位,那么当这条消息要得到处理,会首先经过一万次的cmp与jnz, 李维认为,这
是非常非常低效的,实在是低效的忍无可忍,无需再忍~~:P
在起初,我也是这样认为的,但近来的阅读及实验却发现,这种看法非常片面,今天就来谈谈这个问题( 所有实验在 linux 平台下完成 )
首先看一到用 c 编写的程序
/* -------------------- filename : ta.c --------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
}
return res ;
}
然后,我们用 gcc 将它编译成汇编文件( 使用 -S 开关 )
gcc -S ta.c
将得到如下的汇编文件( ta.s )
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
.file "ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
movl %eax, -8(%ebp)
cmpl $102, -8(%ebp) // 1
je .L4 // 2
cmpl $102, -8(%ebp) // 3
jg .L8 // 4
cmpl $100, -8(%ebp) // 5
je .L3 // 6
jmp .L2 // 7
.L8:
cmpl $103, -8(%ebp)
je .L5
jmp .L2
.L3:
movl $1, -4(%ebp)
jmp .L2
.L4:
movl $2, -4(%ebp)
jmp .L2
.L5:
movl $3, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意看文件中 // 1 ~ // 7 的部份,从这个部份,我们可以看出,gcc确实是把一些case语句转成了李维所说的那种方式进行处理,我们看见了代码中存在有众多的 cmpl 与 jmp 语句
这就相当于你使用if..else..一样,但是否总是这样呢?
我们下面改动一下 ta.c 这个文件,在里面再多加一些 case 语句
/* -------------- filename : new_ta.c ------------------- */
int switch_test_first( int x )
{
int res ;
switch( x ){
case 100 :
res = 1 ;
break ;
case 102 :
res = 2 ;
break ;
case 103 :
res = 3 ;
break ;
case 104 :
res = 4 ;
break ;
case 105 :
res = 5 ;
break ;
case 106 :
res = 6 ;
break ;
}
return res ;
}
这个 new_ta.c 与原来的 ta.c 在结构上完全相同,唯一不同的就是 case 语句的数量变多了,下面我们来编译一下这个文件
gcc -S new_ta.c
下面是我们产生的更新的汇编文件
.file "new_ta.c"
.text
.globl switch_test_first
.type switch_test_first,@function
switch_test_first:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax
jmp *%eax
.section .rodata
.align 4
.align 4
.L9: // A
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
.L3: // 1
movl $1, -4(%ebp)
jmp .L2
.L4: // 2
movl $2, -4(%ebp)
jmp .L2
.L5: // 3
movl $3, -4(%ebp)
jmp .L2 // 4
.L6:
movl $4, -4(%ebp)
jmp .L2 // 5
.L7:
movl $5, -4(%ebp) // 6
jmp .L2
.L8: // 7
movl $6, -4(%ebp)
.L2:
movl -4(%ebp), %eax
leave
ret
.Lfe1:
.size switch_test_first,.Lfe1-switch_test_first
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
仔细比较一下这个最新的 new_ta.s 与前面的 ta.s,精华全在里面了!
首先 new_ta.s 比前面的 ta.s 多了一个 .L9 部分,而且它的 // 1 ~ // 7 中没有了前面
ta.s 文件中所存在的众多的 cmpl 与 jmp 语句,那么,现在这样的代码又是怎么实现
switch 语句中的跳转的呢?我们来仔细分析一下它新多出来的 .L9 部份。
.section .rodata
.align 4
.align 4
.L9:
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L7
.long .L8
.text
显而易见,.L9 部份是一个我们最常见的数据结构——表,它的每一项都是一个标号,而这个标号,恰恰是每个 case 语句的入口标号!
这很容易让我们想到,它很可能是用了一张表来存放所有的 case 语句的入口,然后,在
执行 switch 语句的时候就从这个表中直接检出相应的 case 语句的入口地址,然后跳转
到相应的 case 语句去执行,就像hash_table似的。具体是不是这样呢?我们看看进入
switch 部份的代码:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl 8(%ebp), %eax
subl $100, %eax
movl %eax, -8(%ebp)
cmpl $6, -8(%ebp)
ja .L2
movl -8(%ebp), %edx
movl .L9(,%edx,4), %eax // 1
jmp *%eax // 2
果然如此!首先在 // 1 处根据%edp的值(其值相当于表的下标)在.L9的表中找到相应
case 语句的入口地址,并把这个地址存到%eax中,然后通过 // 2 (这是一个间接跳转
语句)转到%eax存放的地址中,也即相应的case语句处。
C编译器,果然聪明!
通过这个分析我们可以知道如下两点:
1. 当 case 语句少的时候,C编译器将其转成 if..else.. 类型进行处理,运用较多的
cmp 与 jmp 语句 ,而当 case 语句较多的时候,C编译器会出成一个跳转表,而直
接通过跳转表进行跳转,这让 switch 具有非常高的效律,而且效律几乎不会因为
case 语句的增长而减小,李维所担忧的问题是完全不会发生的
2. 可以问答下面几个问题:
1. 为什么 case 语句中需要的是整数类型而不能是其余的类型?
这是因为,case 语句中的这个值是用来做跳转表的下标的,因此,当然必须是整数
2. 为什么 case 语句在不加break的时候具有直通性?
这是因为跳转是在进入 switch 是计算出的,而不是在case语句中计算出的,整个
case 语句群就是一块完整而连续的代码,只是switch让其从不同的位置开始执行。
上面的内容,在《Computer Systems A Programmer's Perspective》中有很详细的论述,
感兴趣可以去找来仔细看看~~~
既然,case 语句需要的是整数的常量值,那么我们是否可用 const 类型呢?比如下面
一段代码:
const int c_1 = 100 ;
const int c_2 = 102 ;
void test( int x )
{
switch( x ){
case c_1 :
++x ;
case c_2 :
--x ;
}
}
这段代码,用 c 编译器编译,编译器会提示错误,但在 c++ 编译器中却不会,这主要是由于 c , 与 c++ 编译器对 const 这个东东的处理不同。我们来看看下面一段 c 程序
/*------------- filename : const_c.c -----------*/
const int a = 15 ;
void f( int x )
{
x = a ;
}
同样用 gcc 编译
gcc -S const_c.c
然后,来看看它的汇编文件
.file "const_c.c"
.globl a
.section .rodata
.align 4
.type a,@object
.size a,4
a: // 1
.long 15
.text
.globl f
.type f,@function
f:
pushl %ebp
movl %esp, %ebp
movl a, %eax // 2
movl %eax, 8(%ebp)
leave
ret
.Lfe1:
.size f,.Lfe1-f
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
注意 // 1 处,C 编译器为 a 分配了地址,并把它的值设为 15 ,而在 // 2 处,它是将
a 这个地址中的值赋给了 %eax,这同一般的普通变量而非const 变量赋值没什么两样
下面我们用 c++ 编译器来编译这段代码,它产生的汇编文件如下:
.file "const_cpp.cpp"
.text
.align 2
.globl _Z1fi
.type _Z1fi,@function
_Z1fi:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
movl $15, 8(%ebp) // 1
leave
ret
.LFE2:
.Lfe1:
.size _Z1fi,.Lfe1-_Z1fi
.section .rodata
.align 4
.type a,@object
.size a,4
a:
.long 15
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
同样注意// 1 处,它以经把 a 的值用 15 来取代了,
也就是说,在c中const变量的行为更像一个非const变量,而在cpp中,const变量的行为就像是#define
由于 c++ 中,const 变量的值是在编译时就计算出来的,因此,它可以用在 case 语句中,而 c 中,const值在编译时只是一个变量的地址,因此,它无法用在 case 语句中.
-----------------------------------------------------------------------------
参考文献:<
曾看过一句话,给我非常深刻的印象:“在人生的每段记忆,总会有这么一个人带给记忆以生命。”是的,总有一些东西、一些人、一些细节在脑海徘徊。其实,记得太多东西也并非一件幸运的事,谁记得一切,谁就感到沉重!但当有一天,我突然强烈感到记忆正在慢慢被我忘却,而我一直觉得对一个人最大的伤害、最大的不公平,其实不是仇恨,而是漠视他或她的存在……于是,就有了这个新的分类栏目:转瞬红颜 ,用以怀念我那些逝去或即将逝去的时光,古人曾结绳纪事,我也学着用blog记述那些曾经的存在!
之所以喜欢这部连续剧,其实只是因为觉得女主角好看,才这么说的,一般一部不怎么好的连续剧,我都会努力找出它的优点(尽管有时候优点并不存在),譬如说这部连续剧《甘十九妹》中扮演甘十九妹的杨露mm就很PP,让人如此难忘……
后来,我在貂禅爱上了西施(QQYIRAN的空间)里,看到男女主角相遇时说的那段对白,这才觉得那还是蛮经典的,特别是在当年的连续剧中还是很大胆幽默的,《甘十九妹》这部连续剧改编自香港著名武侠小说家萧逸的同名作品,剧中人物的对白还是蛮简洁的,很有点古龙大师的味道,这可能也与剧中男主角张子健的形象蛮适合的……
那个时候,家里刚好买了台黑白电视,村里安装好了闭路电视,呵呵,山东台演的,感觉不错喔。。。追忆一下:
但愿有来生
-致我心目中最美的仙子甘十九妹
你确乎生于繁华人间,不然,你的喜怒哀乐,离合悲欢,又何以如此真切如斯,感慨缠绵;但,你更如来自瑶宇琼楼,不然,你的音容笑貌,举手投足,又何以如此典雅出尘,风致飘艳?
不明白为了什么,正是世间芸芸众生黯然消魂时,我写下这些文字,为你逝去的芳魂遥寄叹惋,为普天下钟情者送去一份遗恨后的慰藉,为我空虚惆怅的心灵寻一个自由倾诉空间,也许,也许,只是为了这颗赤诚的心.......
提起笔来,真不知以何言描摹你的绝代风华.
''沉鱼落雁,闭月羞花,千娇百媚,倾城倾国;风情万种,颠倒乾坤'',虽都一点也不觉过分,只怕这些给庸脂俗粉们的评语,玷辱了你的高洁.
''清水出芙蓉,天然去雕饰'',只可形容出你端妙仪容的十分之一.
''出淤泥而不染,濯清涟而不妖''.只可概括出你纯挚情操的百分之一.
你正如怒放在冰天雪地中的一枝寒梅,寒风呼啸,你依然含笑嫣然,香飘云天;只为伊人,无怨而有无悔,一颗痴心,亘古不渝.当明媚的春天来到,百卉争艳,因何只有你''零落成泥碾作尘''?当所有的恩怨情仇都勾销,又有谁能看到你秋湖般幽怨的明眸;当人们都陶醉在雪融冰消的欢乐里,又有谁能了解,波光滟滟的春水里,正流淌着你多情的泪花?
你正如清婉绝俗的玉兰,淡淡幽香,浸醉了几多痴儿女温馨的绮梦.你柔情似水,你吹气如兰;你秀发如云,你纤手凝脂.纵然是刀光剑影,绣幕重重,依然可仰你风流飘逸;纵然是血雨腥风,珠帘深深,依然可慕你高贵韵秀.你的芳心芷性,聪敏灵惠,终换得檀郎一世醉心温柔.然而悄然回眸,千帆尽处,花空烟水流.
''孤标傲世偕谁隐,一样花开为底迟'',落寞秋风.坎坷人生,聚散前缘,谁能料定?最难忘,你如泣如诉的琴声?你把爱恨都付与了这妙曼音符,可曾想,比翼双飞的心愿会成空?曾记否,桃源一游,空文萧赋;谁能料,英雄红颜,良辰虚度;诚可怨,神仙眷侣,都化了巫山残梦;最遗恨.知音苦觅,长相厮守只待来生.
一杯香茶,一盏孤灯,你堪比一竿青青翠竹生庭中.你用青春的火热与娇艳,只落得青山寂寂雾蒙蒙.你的良缘夙因,历历平生,只化做凄丽春梦;你的誓言,你的凄艳,只给人世留下长长久久的嗟呀与几缕浅浅淡淡的旧影,你的孜孜不懈地渴望与追求,你的追求的深深浅浅的足迹,重复了古往今来多少有情者曾跋涉过的荆棘路.
你生就寒梅的冰肌玉骨,你独具幽兰的端庄美淑,你占尽翠竹的娉婷娴静;你无愧素菊的高标脱俗......
纵集百卉之妍,也难将你描画出.
你有一颗温婉旖旎的女儿心,一腔得知己死亦无恨的女儿情
你挣扎于尘网又超脱世俗;你明知多情苦偏尝相思豆.
脉脉萧声,拨动了你少女情怀的一场痴恋.
熊熊烈火,记下了你今生最无悔的缱绻.
你爱地那般刻骨铭心,你恨得那般铭心刻骨.
你的笑容比云霞更灿烂,比彩虹更瑰丽;
你的心灵比美玉更无瑕,比明珠更璀璨;
你飘来飞去,绰约身姿,胜似碧霄飞雁;
你妙语连珠,空灵洒脱,真如落花微雨;
你是宿愿的冰湖秋月,你是天生的慧质兰心;
你是历史卷册中姗姗而出的古典仙子;
你是成人童话里令英雄倾倒的红粉佳人;
你是悠悠时空里最姝丽无伦的生灵;
你是茫茫红尘中真正爱过恨过的女人.
你匆匆来了-鲜花为你妍媚,百鸟为你歌唱;
你匆匆去了-落英为你缤纷,万物为你含悲;
桑田沧海,岁月如烟,人世几更改,世景多变迁.
何处寻,你巧笑倩兮的丽影;何处觅,你如诗如歌的琴声?
奈何桥头爱侣为伴,无论天上人间,你该不会寂寥;
三生石畔倾心相许,不管宿命轮回,前世今生,你应该很幸福.
也许,只有生生世世的相依相偎,正是你一生渴盼的天长地久.
也许,只有千载万代的朝朝暮暮.正是你苦苦追求的海烂石枯.
侧耳听,谁在吟,多情却似总无情?轻声唱,谁会听,生愿同欢死同冢,让鲜红的热血为这不该发生的一切恩怨划上一个结束号吧.爱,本没有错与对,更没有该与不该,只有完与未完,了与未了......
钟情的人们会感叹-自古美女英雄总痴情;
钟情的人们会吟唱-那首炽热绵长的恋曲;
钟情的人们会铭记-踏雪无痕里的侠骨柔情;
钟情的人们会传诵-那段轰轰烈烈的美丽故事.......
爱,又有谁能说得清?
又是莺飞草长,柳绿桃红的阳春时节,我默默祈祷-冥冥中自有牵线人,但愿有来世,但愿有来生.




之所以喜欢这部连续剧,其实只是因为觉得女主角好看,才这么说的,一般一部不怎么好的连续剧,我都会努力找出它的优点(尽管有时候优点并不存在),譬如说这部连续剧《甘十九妹》中扮演甘十九妹的杨露mm就很PP,让人如此难忘……
后来,我在貂禅爱上了西施(QQYIRAN的空间)里,看到男女主角相遇时说的那段对白,这才觉得那还是蛮经典的,特别是在当年的连续剧中还是很大胆幽默的,《甘十九妹》这部连续剧改编自香港著名武侠小说家萧逸的同名作品,剧中人物的对白还是蛮简洁的,很有点古龙大师的味道,这可能也与剧中男主角张子健的形象蛮适合的……
那个时候,家里刚好买了台黑白电视,村里安装好了闭路电视,呵呵,山东台演的,感觉不错喔。。。追忆一下:
但愿有来生
-致我心目中最美的仙子甘十九妹
你确乎生于繁华人间,不然,你的喜怒哀乐,离合悲欢,又何以如此真切如斯,感慨缠绵;但,你更如来自瑶宇琼楼,不然,你的音容笑貌,举手投足,又何以如此典雅出尘,风致飘艳?
不明白为了什么,正是世间芸芸众生黯然消魂时,我写下这些文字,为你逝去的芳魂遥寄叹惋,为普天下钟情者送去一份遗恨后的慰藉,为我空虚惆怅的心灵寻一个自由倾诉空间,也许,也许,只是为了这颗赤诚的心.......
提起笔来,真不知以何言描摹你的绝代风华.
''沉鱼落雁,闭月羞花,千娇百媚,倾城倾国;风情万种,颠倒乾坤'',虽都一点也不觉过分,只怕这些给庸脂俗粉们的评语,玷辱了你的高洁.
''清水出芙蓉,天然去雕饰'',只可形容出你端妙仪容的十分之一.
''出淤泥而不染,濯清涟而不妖''.只可概括出你纯挚情操的百分之一.
你正如怒放在冰天雪地中的一枝寒梅,寒风呼啸,你依然含笑嫣然,香飘云天;只为伊人,无怨而有无悔,一颗痴心,亘古不渝.当明媚的春天来到,百卉争艳,因何只有你''零落成泥碾作尘''?当所有的恩怨情仇都勾销,又有谁能看到你秋湖般幽怨的明眸;当人们都陶醉在雪融冰消的欢乐里,又有谁能了解,波光滟滟的春水里,正流淌着你多情的泪花?
你正如清婉绝俗的玉兰,淡淡幽香,浸醉了几多痴儿女温馨的绮梦.你柔情似水,你吹气如兰;你秀发如云,你纤手凝脂.纵然是刀光剑影,绣幕重重,依然可仰你风流飘逸;纵然是血雨腥风,珠帘深深,依然可慕你高贵韵秀.你的芳心芷性,聪敏灵惠,终换得檀郎一世醉心温柔.然而悄然回眸,千帆尽处,花空烟水流.
''孤标傲世偕谁隐,一样花开为底迟'',落寞秋风.坎坷人生,聚散前缘,谁能料定?最难忘,你如泣如诉的琴声?你把爱恨都付与了这妙曼音符,可曾想,比翼双飞的心愿会成空?曾记否,桃源一游,空文萧赋;谁能料,英雄红颜,良辰虚度;诚可怨,神仙眷侣,都化了巫山残梦;最遗恨.知音苦觅,长相厮守只待来生.
一杯香茶,一盏孤灯,你堪比一竿青青翠竹生庭中.你用青春的火热与娇艳,只落得青山寂寂雾蒙蒙.你的良缘夙因,历历平生,只化做凄丽春梦;你的誓言,你的凄艳,只给人世留下长长久久的嗟呀与几缕浅浅淡淡的旧影,你的孜孜不懈地渴望与追求,你的追求的深深浅浅的足迹,重复了古往今来多少有情者曾跋涉过的荆棘路.
你生就寒梅的冰肌玉骨,你独具幽兰的端庄美淑,你占尽翠竹的娉婷娴静;你无愧素菊的高标脱俗......
纵集百卉之妍,也难将你描画出.
你有一颗温婉旖旎的女儿心,一腔得知己死亦无恨的女儿情
你挣扎于尘网又超脱世俗;你明知多情苦偏尝相思豆.
脉脉萧声,拨动了你少女情怀的一场痴恋.
熊熊烈火,记下了你今生最无悔的缱绻.
你爱地那般刻骨铭心,你恨得那般铭心刻骨.
你的笑容比云霞更灿烂,比彩虹更瑰丽;
你的心灵比美玉更无瑕,比明珠更璀璨;
你飘来飞去,绰约身姿,胜似碧霄飞雁;
你妙语连珠,空灵洒脱,真如落花微雨;
你是宿愿的冰湖秋月,你是天生的慧质兰心;
你是历史卷册中姗姗而出的古典仙子;
你是成人童话里令英雄倾倒的红粉佳人;
你是悠悠时空里最姝丽无伦的生灵;
你是茫茫红尘中真正爱过恨过的女人.
你匆匆来了-鲜花为你妍媚,百鸟为你歌唱;
你匆匆去了-落英为你缤纷,万物为你含悲;
桑田沧海,岁月如烟,人世几更改,世景多变迁.
何处寻,你巧笑倩兮的丽影;何处觅,你如诗如歌的琴声?
奈何桥头爱侣为伴,无论天上人间,你该不会寂寥;
三生石畔倾心相许,不管宿命轮回,前世今生,你应该很幸福.
也许,只有生生世世的相依相偎,正是你一生渴盼的天长地久.
也许,只有千载万代的朝朝暮暮.正是你苦苦追求的海烂石枯.
侧耳听,谁在吟,多情却似总无情?轻声唱,谁会听,生愿同欢死同冢,让鲜红的热血为这不该发生的一切恩怨划上一个结束号吧.爱,本没有错与对,更没有该与不该,只有完与未完,了与未了......
钟情的人们会感叹-自古美女英雄总痴情;
钟情的人们会吟唱-那首炽热绵长的恋曲;
钟情的人们会铭记-踏雪无痕里的侠骨柔情;
钟情的人们会传诵-那段轰轰烈烈的美丽故事.......
爱,又有谁能说得清?
又是莺飞草长,柳绿桃红的阳春时节,我默默祈祷-冥冥中自有牵线人,但愿有来世,但愿有来生.




http://www.yuanma.org/data/2006/0803/article_1307.htm
架构基于FreeBSD和Postfix的IGENUS Webmail邮件系统
baidu
本文介绍使用FreeBSD+Postfix+Cyrus-sasl+Courier-imap+igenus+spamassassin+ Clamav+mailscanner+mailscanner-mrtg+mailman来架构一个具有多域名,有邮件列表、webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 4.51 bate $Date: 2005-12-03
系统主要采用MailScanner+clamav+Spamd+APF来对病毒过滤和垃圾邮件过滤。
本文在4.10、5.3、5.4、6.0上安装测试通过,病毒过滤放弃采用amavisd。主要采用执行效率更高的MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了100%。垃圾邮件过滤基本上达到了95%的成功率。
Table of Contents
Chapter 1. 系统安装
1.1 安装MySQL
1.2 安装Apache
1.3 安装PHP
1.4 安装zend
1.5 安装openssl
1.6 安装phpMyAdmin
1.7 通过phpMyadmin设置数据库
1.8安装Courier-imap
1.9安装 postfix 和 cyrus-sasl
1.10 安装expect
Chapter 2. 配置邮件服务器
2.1 配置rc.conf
2.2 配置postfix 和 cyrus-sasl
2.3 配置Courier-imap
Chapter 3. 手动设置第一个用户并测试
Chapter 4. 安装postfix管理工具
4.1安装本人开发的postfix管理工具
4.2 用户登录测试
Chapter 5. 防病毒与防垃圾邮件
5.1 安装Clamav
5.2 安装MailScanner
5.3 安装配置Spamassassin
5.4修改Postfix设定档main.cf
5.5修改mailscanner.conf
5.6新增MailScanner所要用到的资料夹
5.7把病毒提示信息改为中文
5.8MailScanner监管进出邮件
5.9 邮件流量监控(mailscanner-mrtg)安装与设置
5.10.安装APF防垃圾邮件
Chapter 6. 安装webmail
Chapter 7邮件列表(mailman)
Chapter 8. 查看系统状态
Chapter 1. 系统安装
安装之前:因用户数据都保存在/var目录下,因此安装FreeBSD时/var的空间应尽量大。FreeBSD的版本为5.3,按最小化安装,软件包只安装cvsup,安装结束后用cvsup更新ports树。在文档中假设服务器的ip地址为192.168.0.2,域名为 toping.net,主机名为mail.toping.net。
请兄弟们仔细一些,注意空格和TAB。
祝兄弟们好运。本人水平有限。如果发现文章中有什么错误和不当的地方请发邮件:scyz@toping.net。我会在第一时间给予答复。
1.1 安装MySQL
mail# cd /usr/ports/databases/mysql40-server
mail# make install clean
编辑/etc/rc.conf,加入
mysql_enable="YES"
1.2 安装Apache
mail# cd /usr/ports/www/apache2
mail# make install clean
编辑/etc/rc.conf,加入
Apache2_enable="YES"
1.3 安装PHP
mail# cd /usr/ports/www/mod_php4
mail# make install clean
我的选择:(注意别选DEBUG,否则会和ZEND有冲突)
[X] APACHE2 Use apache 2.x instead of apache 1.3.x
安装需要的PHP扩展模块
mail# cd /usr/ports/lang/php4-extensions
mail# make install clean
我选择了下面的模块:
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CRACK crack support
[X] CTYPE ctype functions
[X] CURL CURL support
[X] FTP FTP support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] FILEINFO fileinfo support
[X] IMAP IMAP support
[X] MBSTRING multibyte string support
[X] MCAL Modular Calendar Access Library support
[X] MCRYPT Encryption support
[X] MCVE MCVE support
[X] MHASH Crypto-hashing support
[X] MYSQL MySQL database support
[X] PCRE Perl Compatible Regular Expression support
[X] POSIX POSIX-like functions
[X] SESSION session support
[X] TOKENIZER tokenizer support
[X] XML XML support
[X] ZLIB ZLIB support
最后在编辑/usr/local/etc/apache2/httpd.conf最后加入:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Group www、User www修改为: Group postfix、User postfix
注:以上这一步要在postfix安装后再操作
1.4.安装zend
mail# cd /usr/ports/devel/ZendOptimizer
mail# make install clean
因为版权的问题,他不会自动下载。这里你需要到他的官方网站去下载ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz到/usr/ports/distfiles目录下面后再安装。
下载地址:
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz
完成后在/usr/local/etc/php.ini中加入:
[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS"
zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so"
重启apache安装完成。
1.5 安装openssl
mail# cd /usr/ports/security/openssl
mail# make install clean
1.6 安装phpMyAdmin
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
mail# cd /usr/ports/distfiles
mail# tar –zxvf PhpMyadmin-x.tar.gz
mail# mv /usr/local/www/phpMyAdmin-x /usr/local/www/data/dbadmin
修改/usr/local/www/data/dbadmin/config.inc.php
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
1.7 通过phpMyadmin设置数据库
建立postfix数据库(注意:数据库名称为postfix):
mail# mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
下面为sql语句:
CREATE TABLE domaininfo (
domain_id int(5) NOT NULL auto_increment,
domain varchar(25) NOT NULL default '',
alias varchar(30) default NULL,
passwd varchar(35) NOT NULL default '',
usernum int(5) NOT NULL default '0',
quota int(11) NOT NULL default '0',
des varchar(30) default NULL,
expire date NOT NULL default '0000-00-00',
active tinyint(1) NOT NULL default '1',
create_time datetime default NULL,
PRIMARY KEY (domain_id),
UNIQUE KEY domain (domain),
KEY domain_id (domain_id)
) TYPE=MyISAM COMMENT='domain information';
INSERT INTO domaininfo VALUES (1,'admin',NULL,'$1$.j3.t12.$I7MGf7ZD2HrWwUWQF88Mg1',0,0,'Super Admin','0000-00-00',1,'0000-00-00 00:00:00');
CREATE TABLE userinfo (
id int(11) NOT NULL auto_increment,
userid varchar(20) NOT NULL default '',
domain_id int(5) NOT NULL default '0',
address varchar(50) NOT NULL default '',
alias varchar(60) default NULL,
passwd varchar(35) NOT NULL default '',
realname varchar(20) default NULL,
quota int(11) NOT NULL default '0',
active tinyint(1) NOT NULL default '0',
homedir varchar(60) NOT NULL default '',
maildir varchar(60) NOT NULL default '',
create_time datetime NOT NULL default '0000-00-00 00:00:00',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY address (address)
) TYPE=InnoDB COMMENT='User Information';
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便,如果后面要使用igenus请导入原来igenus的sql。
建立数据库用户并授以相应的权限
mail# mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
1.8 安装Courier-imap
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
我的选择:
[X] OPENSSL Build with OpenSSL support
[X] AUTH_MYSQL MySQL support
在/etc/rc.conf中加入:
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
mail# cd /usr/local/etc/courier-imap
mail# cp imapd.cnf.dist imapd.cnf
mail# cp pop3d.cnf.dist pop3d.cnf
mail# /usr/local/etc/rc.d/courier-authdaemond.sh start
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
mail# chmod +x /var/run/authdaemond
1.9 安装 postfix 和 cyrus-sasl
mail# cd /usr/ports/security/cyrus-sasl2
mail# make install WITH_AUTHDAEMON=yes
mail# make clean
创建/usr/local/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket
更详细的参数设置请看:
http://www.toping.net/bbs/htm_data/7/0508/330.html
至此,认证部分基本完成。
安装postfix
mail# cd /usr/ports/mail/postfix
mail# make install clean
我的选择:
[X] VDA VDA (Virtual Delivery Agent)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[X] TLS SSL and TLS
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
回答下面的两问题:
You need user "postfix" added to group "mail".[是否将postfix用户加到mail用户组]
Would you like me to add it [y]? y
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在/etc/rc.conf中加入postfix启动所需的启动选项
在/etc/rc.conf中加入:
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
设置postfix启动所需
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
1.10 安装expect
用于Web客户端建立邮件用户
mail# cd /usr/ports/lang/expect
mail# make install clean
Chapter 2. 配置邮件服务器
本节主要讲述各种服务的参数配置。
2.1 配置rc.conf,编辑/etc/rc.conf
下面是前面所装软件都加入了启动选项的rc.conf配置:
mysql_enable="YES"
apache2_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
2.2 配置postfix 和 cyrus-sasl
(1)修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
mail# ee /usr/local/etc/postfix/main.cf
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_etrn_restrictions = permit_mynetworks, reject
#=====================BASE=====================
myhostname = mail.toping.net
mydomain = toping.net
mydestination = $myhostname
local_recipient_maps =
command_directory = /usr/local/sbin
local_transport = virtual
#=====================MySQL=====================
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 125
virtual_transport = virtual
virtual_uid_maps = static:125
#=====================Quota=====================
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====================SASL=====================
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_auth_destination,reject
smtpd_client_restrictions = permit_sasl_authenticated
更详细的参数设置请看论坛:
http://www.toping.net/bbs/htm_data/7/0601/871.html
(4)编辑/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT alias FROM userinfo WHERE address='%s' AND active = 1
(5)编辑/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domaininfo WHERE domain='%s'
(6)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM userinfo WHERE address='%s' AND active = 1
(7)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM userinfo WHERE address='%s'
2.3 配置Courier-imap
(1)修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
(2)修改/usr/local/etc/courier-imap/pop3d
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
(3)编辑修改/usr/local/etc/authlib/authmysqlrc
mail# mv /usr/local/etc/authlib/authmysqlrc /usr/local/etc/authlib/authmysqlrc_bak
mail# ee /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost //数据库主机地址
MYSQL_USERNAME postfix //数据库用户名
MYSQL_PASSWORD postfix //数据库密码
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix //数据库名称
MYSQL_USER_TABLE userinfo
MYSQL_CRYPT_PWFIELD passwd
MYSQL_UID_FIELD '125'
MYSQL_GID_FIELD '125'
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
注:这里得用tab键来跳格
(4)编辑/usr/local/etc/authlib/authdaemonrc
mail# mv /usr/local/etc/authlib/authdaemonrc /usr/local/etc/authlib/authdaemonrc_bak
mail# ee /usr/local/etc/authlib/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
重启服务器
Chapter 3.手动设置第一个用户并测试
本章介绍如何开通用户,并且测试系统是否正常。
注:增加用户时请到这里生成加密后的密码后直接插入到数据库中就可以了。
http://www.toping.net/soft
mail# mysql
mysql> use postfix;
mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| address |
| admin |
| card |
| domaininfo |
| lastauth |
| logs |
| message |
| personal |
| scheduler |
| stow |
| userinfo |
| vpopmail |
+-------------------+
12 rows in set (0.00 sec)
增加域名和管理员
mysql> desc domaininfo;
+-------------+-------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+------------+----------------+
| domain_id | int(5) | | PRI | NULL | auto_increment |
| domain | varchar(25) | | UNI | | |
| alias | varchar(30) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| usernum | int(5) | | | 0 | |
| quota | int(11) | | | 0 | |
| des | varchar(30) | YES | | NULL | |
| expire | date | | | 0000-00-00 | |
| active | tinyint(1) | | | 1 | |
| create_time | datetime | YES | | NULL | |
+-------------+-------------+------+-----+------------+----------------+
10 rows in set (0.00 sec)
mysql> INSERT INTO `domaininfo` VALUES (7, 'toping.net', NULL, '$1$jNXThQXq$KPjm.WE2f2yX5rceY48vX. ', 50, 500, NULL, '0000-00-00', 1, '2005-04-19 23:19:11');
Query OK, 1 row affected (0.00 sec)
注:这里的toping.net的管理密码为:admin123
mysql> desc userinfo;
+-------------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------------------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| userid | varchar(20) | | | | |
| domain_id | int(5) | | | 0 | |
| address | varchar(50) | | UNI | | |
| alias | varchar(60) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| realname | varchar(20) | YES | | NULL | |
| quota | int(11) | | | 0 | |
| active | tinyint(1) | | | 0 | |
| homedir | varchar(60) | | | | |
| maildir | varchar(60) | | | | |
| create_time | datetime | | | 0000-00-00 00:00:00 | |
| fax | varchar(20) | | | | |
| telephone | varchar(15) | | | | |
| sex | int(1) | | | 0 | |
| year | int(4) | | | 0 | |
| MONTH | int(2) | | | 0 | |
| DAY | int(2) | | | 0 | |
| education | varchar(4) | | | | |
| marital | int(1) | | | 0 | |
| occupation | varchar(15) | | | | |
| companyname | varchar(30) | | | | |
| province | varchar(6) | | | | |
+-------------+-------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)
mysql> INSERT INTO `userinfo` VALUES (8, 'webmaster', 7, 'webmaster@toping.net', NULL,'$1$4DLQeNkz$QKCAQqg244XwvLl2SD11f0', 'webmaster', 209715200, 1, '/var/mail/toping.net/webmaster/', '/var/mail/toping.net/webmaster/Maildir/', '2005-04-20 23:45:17', '', '', 0, 0, 0, 0, '', 0, '', '', '');
注:这里的webmaster用户的邮箱密码为:000000
mysql>quit
设置用户的目录与权限:
Mail# mkdir -p /var/mail/toping.net/webmaster
Mail# /usr/local/bin/maildirmake /var/mail/toping.net/webmaster/Maildir
Mail# chmod -R 777 /var/mail/toping.net/
Mail# chown -R postfix:postfix /var/mail/toping.net
至此用户设置完毕,这里只使用一个域名,同理可以设置多个域名。
Chapter 4.安装postfix管理工具
本节主要介绍如何安装和使用本人开发的postfix管理工具。
4.1安装本人开发的postfix管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改include/config.inc.php中的
define(DOMAINSDIR,"/home/vmail"); 为 define(DOMAINSDIR,"/var/mail");
define(MYSQL_HOST, 'localhost'); 为 您的MySQL服务器的主机名
define(MYSQL_USER, 'root'); 为 您的MySQL的用户名
define(MYSQL_PASS, 'mypasswd'); 为 您的MySQL的密码
define(MYSQL_DATA, 'postfix'); 为 您的邮件服务器的数据库
修改完成后运行:http://mail.toping.net/webadmin/index.php
完装完成!!
4.2 用户登录测试
用户登录测试
安装p5-MIME-Base64
mail# cd /usr/ports/converters/p5-MIME-Base64/
mail# make install clean
通过p5-MIME-Base64来取得用户名和密码的base64编码
mail# perl -MMIME::Base64 -e 'print encode_base64("webmaster\@toping.net");'
d2VibWFzdGVyQHRvcGluZy5uZXQ=
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试发送邮件(端口:25):
mail# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 0.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
ehlo mail
250-mail.toping.net
250-PIPELINING
250-SIZE 4194304
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN OTP
250-AUTH=NTLM LOGIN PLAIN OTP
250 8BITMIME
auth login
334 VXNlcm5hbWU6
d2VibWFzdGVyQHRvcGluZy5uZXQ= //此为用户名id:webmaster@toping.net
334 UGFzc3dvcmQ6
MDAwMDAw //此为用户密码password:000000
235 Authentication successful
MAIL FROM: //告诉服务器发件人的Email地址
250 Ok
RCPT TO: //告诉服务器收件人的地址
250 OK
DATA //告诉服务器开始写信
354 End data with .
SUBJECT:test //subject后面填写的是邮件的主题
test
. //换行后输入.后按回车,表示信件内容书写完毕
250 Ok: queued as 58DC71D5
quit //发送信件,结束对话,退出SMTP服务器
221 Bye
Connection closed by foreign host
测试收取邮件(端口:110):
mail# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 0
Escape character is '^]'
+OK Hello there
user webmaster@toping.net
+OK Password required
pass 000000
+OK logged in
list
+OK POP3 clients that break here, they violate STD53
1 2217
retr 1 //返回第一封信的全部内容
+OK 2217 octets follow.
Return-Path:
X-Original-To: webmaster@toping.net
Delivered-To: webmaster@toping.net
Received: from mail (localhost.toping.net [127.0.0.1])
by mail.toping.net (Postfix) with ESMTP id 58DC71D5
for ; Mon, 9 Aug 2004 21:11:20 +0800 (CST)
SUBJECT:test
Message-Id: <20040809131120.58DC71D5@mail.toping.net>
Date: Mon, 9 Aug 2004 21:11:20 +0800 (CST)
From: webmaster@toping.net
To: undisclosed-recipients:;
test
.
dele 1 //删除
+OK Deleted
quit
+OK Bye-bye
Connection closed by foreign host
也可以使用任何其它的邮件客户端程序来测试,如foxmail、Outlook Express等等。
Chapter 5. 防病毒与防垃圾邮件
本章介绍病毒与垃圾邮件的防范。
5.1 安装Clamav
mail# cd /usr/ports/security/clamav
mail# make install clean
我的选择:
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
要想clamav能自动的启动请在/etc/rc.conf中加入:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
重启服务器
测试杀毒
mail# clamscan -r -i /usr/local/www/data
----------- SCAN SUMMARY -----------
Known viruses: 41293
Engine version: 0.87.1
Scanned directories: 53
Scanned files: 602
Infected files: 0
Data scanned: 41.51 MB
Time: 18.294 sec (0 m 18 s)
升级病毒库
mail# freshclam
ClamAV update process started at Sun Dec 4 01:10:02 2005
main.cvd is up to date (version: 34, sigs: 39625, f-level: 5, builder: tkojm)
daily.cvd is up to date (version: 1200, sigs: 1669, f-level: 6, builder: tomek)
5.2 安装MailScanner
mail# cd /usr/ports/mail/mailscanner
mail# make install
第一次执行安装因此需执行make initial-config以建立基本配置文件
mail# make initial-config
mail# make clean
5.3 安装SpamAssassin
mail# cd /usr/ports/mail/p5-Mail-SpamAssassin
mail# make install clean
我的选择:
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[X] MYSQL Add MySQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
5.4修改Postfix设定档main.cf
mail# ee /usr/local/etc/postfix/main.cf
#header_checks = regexp:/usr/local/etc/postfix/header_checks //默认值
header_checks = regexp:/usr/local/etc/postfix/header_checks //把注释去掉
编辑/usr/local/etc/postfix/header_checks
mail# ee /usr/local/etc/postfix/header_checks
/^Received:/ HOLD //新加入
5.5修改mailscanner.conf
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#Run As User = //默认值
Run As User = postfix //修改后
#Run As Group = //默认值
Run As Group = postfix //修改后
#Incoming Queue Dir = /var/spool/mqueue.in //默认值
Incoming Queue Dir = /var/spool/postfix/hold //修改后
#Outgoing Queue Dir = /var/spool/mqueue //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming //修改后
#MTA = sendmail //默认值
MTA = postfix //修改后
#Virus Scanners = none //默认值
Virus Scanners = clamav //修改后
#Use SpamAssassin = no //默认值
Use SpamAssassin = yes //修改后
5.6新增MailScanner所要用到的资料夹
mail# mkdir /var/spool/MailScanner
mail# mkdir /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown postfix:postfix /var/spool/MailScanner/incoming
mail# chown postfix:postfix /var/spool/MailScanner/quarantine
mail# touch /usr/local/etc/MailScanner/rules/bounce.rules //新建一个空白文件,要不然会出错。
mail# chmod –R 777 /var/spool/postfix
mail#cp /usr/local/etc/MailScanner/mcp/10_example.cf.sample /usr/local/etc/MailScanner/mcp/10_example.cf
mail#cp /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf.sample
/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
注:这里的倒数一、二行实际操作中为一行
重新启动服务器
测试病毒过滤:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
mail from:webmaster@toping.net
250 Ok
rcpt to:webmaster@toping.net
250 Ok
data
354 End data with .
Subject:Virus test
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 Ok: queued as F0C221CC20 //出现F0C221CC20这行表示mailscanner运行成功了
quit
221 Bye
Connection closed by foreign host.
5.7把病毒提示信息改为中文
预设系统提示信息为英文,可以下载我修改的中文包。
http://mail.toping.net/mailscanner/cn.rar
注:把下载下来的文件解压后放到/usr/local/share/MailScanner/reports/cn下面去
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#%report-dir% = /usr/local/share/MailScanner/reports/en //默认值(加载英文)
%report-dir% = /usr/local/share/MailScanner/reports/cn //修改后为读取中文
5.8.用MailScanner来监管进出邮件
mail# ee MailScanner.conf
Archive Mail = %rules-dir%/archive.rules
mail# ee archive.rules
方法一:互相备份, 以上这样并不会造成 loop
FromOrTo: a@toping.net yes forward b@toping.net
FromOrTo: b@toping.net yes forward a@toping.net
方法二:可以 forward 到复数信箱
FromOrTo: a@toping.net yes forward b@toping.net c@toping.net d@toping.net
方法三:同时备份到一个或多个档案及一个或多个信箱
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/a_user_backup.mbx /var/spool/MailScanner/archive/a_user_backup.mbx b@toping.net scyz2@163.com
注:以上为一行,该档案要先建立且确定该档案拥有者与 MailScanner.conf 的 Run As User = XXXXXXX 相同
方法四:备份到数据夹及多个信箱或档案
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/ b@toping.net scyz2@163.com /var/spool/MailScanner/archive/a_user_backup.mbx
注:以上为一行,权限同SAMPLE3;注意事项, 他会依日期再分数据夹, 日期数据夹内的文件名称 mail queue ID, 格式为 postfix mail queue 格式
更详细的mailscanner.cf的参数请看论坛:
http://www.toping.net/bbs/htm_data/7/0509/533.html
5.9.安装MailScanner-mrtg
mail# cd /usr/ports/mail/ mailscanner-mrtg
mail# make install clean
mailscanner-mrtg相关设置
mail# cd /usr/local/etc/mailscanner-mrtg //切换至mailscanner-mrtg 目录
mail# cp mailscanner-mrtg.conf.sample mailscanner-mrtg.conf
mail# cp mailscanner-mrtg.cfg.sample mailscanner-mrtg.cfg
mail# chmod 644 mailscanner-mrtg.conf //更改权限为可修改
mail# chmod 644 mailscanner-mrtg.cfg //更改权限为可修改
mail# ee mailscanner-mrtg.conf //修改mailscanner-mrtg.conf内容如下
#MTA = sendmail //默认值
MTA = postfix //修改后
#Where the MTA puts mail before MailScanner gets it
#Incoming Queue Dir = /var/spool/postfix.in/deferred/ # Postfix
#Incoming Queue Dir = /var/spool/exim.in/input/ # Exim
Incoming Queue Dir = /var/spool/mqueue.in/ # Sendmail //默认值
Incoming Queue Dir = /var/spool/postfix/hold # Postfix //修改后
#Where MailScanner puts your mail after it is scanned
#Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix
#Outgoing Queue Dir = /var/spool/exim/input # Exim (?)
Outgoing Queue Dir = /var/spool/mqueue/ # Sendmail //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix //修改后(把#拿掉)
#Which interfaces to monitor (comma separated list)
Interfaces to Monitor = fxp0 //默认值
Interfaces to Monitor = vr0 //修改后(改成您的网卡吧)
mail# ee /usr/local/etc/apache/httpd.conf //修改apache配置以便读取mailscanner-mrtg数据
内容如下:
#MailScanner Setting
Alias /mailscanner-mrtg/ "/usr/local/www/mailscanner-mrtg/"
Step5.产生MailScanner-Mrtg流量图
mail# /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
mail# crontab -e
*/10 * * * * /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
5.10.安装APF防垃圾邮件
http://apf.org.cn
下载地址:
http://mail.toping.net/apf/apf.rar
下载最新的APF包解压到/usr/local/etc/postfix目录。
这时/usr/local/etc/postfix目录里边有一个apf-posftix.pl的文件
修改/usr/local/etc/postfix/master.cf
mail# ee /usr/local/etc/postfix/master.cf
加入:
apf unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/local/etc/postfix/apf-postfix.pl
增加黑白名单:
1、IP黑名单:
ip_black_list.txt
2、IP白名单
ip_white_list.txt
3、域名黑名单
dn_black_list.txt
4、域名白名单
dn_white_list.txt
Chapter 6. 安装webmail
如何使用本人修改的iGENUS for Postfix 2.01
下载地址:
http://mail.toping.net/igenus/igenus_for_postfix_2.01.rar
webmail使用igenus,版本是iGENUS for Postfix 2.01
建议下载本人修改的iGENUS for Postfix 2.01
安装方法参考论坛:
http://www.toping.net/bbs/htm_data/7/0507/174.html
mail# cd /usr/local/www/data
mail# chown -R postfix:postfix phpMyAdmin
mail# cd /usr/local/etc
mail# cp php.ini-dist php.ini
修改/usr/local/etc/php.ini
webmail上传附件设置:
register_globals = On
max_execution_time = 30 //改为60 (增加处理脚本的时间限制)
memory_limit = 8M //改为40M (这样才能发10M的附件)
post_max_size = 8M //改为10M
upload_max_filesize = 2M //改为10M
重启apache
mail# /usr/local/etc/rc.d/apache2.sh restart
Chapter 7. 安装邮件列表(MAILMAN)安装
本节主要讲述邮件列表mailman的安装和配置
设置/etc/make.conf
mail# ee /etc/make.conf
# mail/mailman
MAIL_GID="mailman"
安装mailman
mail# portinstall -m BATCH=yes mail/mailman
配置apache(新加入)
mail# ee /usr/local/etc/apache2/httpd.conf
ScriptAlias /mailman "/usr/local/mailman/cgi-bin"
AllowOverride None
Options none
Order allow,deny
Allow from all
Alias /pipermail "/usr/local/mailman/archives/public"
AllowOverride None
Options +FollowSymlinks
Order allow,deny
Allow from all
用check_perms
mail# /usr/local/mailman/bin/check_perms -f
注:加上-f参数可以修复。
修改/usr/local/mailman/Mailman/mm_cfg.py,加上:
DEFAULT_EMAIL_HOST = 'lists.toping.net'
MTA = 'Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.toping.net', 'toping.net']
添加一个邮件列表:
mail# /usr/local/mailman/bin/newlist mailman
把用户添加到邮件列表里测试,建一个文本文件,比如maillists.txt,一行一个邮件地址,然后执行如下命令:
mail# /usr/local/mailman/bin/add_members -n maillists.txt mailman
mail# ee postfix/main.cf
owner_request_special = no
recipient_delimiter = +
virtual_alias_maps = hash:/usr/local/mailman/data/virtual-mailman,
mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf
alias_maps = hash:/usr/local/mailman/data/aliases,hash:/usr/local/etc/postfix/aliases
mail# ee Default.py
DEFAULT_EMAIL_HOST = 'lists.toping.net'
DEFAULT_URL_HOST = 'lists.toping.net'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'
DEFAULT_SERVER_LANGUAGE = 'zh_CN'
设置virtual-mailman
mail# ee /usr/local/mailman/data/virtual-mailman
lists.meilai.com anything
邮件列表的配置
Default.py和mm_cfg.py的配置是针对全局的,对全局配置文件的修改不会影响到已经存在的邮件列表。mailman提供了config_list这个命令来对单个邮件列表进行配置,先导出该邮件列表的配置:
mail# /usr/local/mailman/bin/config_list -o /tmp/config mailman
然后修改/tmp/config文件,里面有很多选项,可以根据自己的要求修改,比如加上回复到邮件列表的邮件头、去掉mailman自动加的边脚等等,最后把这个配置文件导回给邮件列表就可以了:
mail# /usr/local/mailman/bin/config_list -i /tmp/config mailman
下面你可以通过web去管理你的邮件列表:
http://lists.toping.net/mailman/admin/mailman
查看邮件列表信息:
http://lists.toping.net/mailman/listinfo/mailman/
功能太强大了,这里不一一的讲解,自己去发现吧
Chapter 7. 查看系统状态
本节主要讲述phpSysInfo工具的安装和配置
安装phpSysInfo(2.2)
mail# cd /usr/ports/www/phpSysInfo
mail# make install clean
mail# cd /usr/local/www/data-dist/phpSysInfo
mail# cp config.php.new config.php
架构基于FreeBSD和Postfix的IGENUS Webmail邮件系统
baidu
本文介绍使用FreeBSD+Postfix+Cyrus-sasl+Courier-imap+igenus+spamassassin+ Clamav+mailscanner+mailscanner-mrtg+mailman来架构一个具有多域名,有邮件列表、webmail、防病毒、防垃圾邮件、web管理界面的邮件系统。
Jacky, $Revision: 4.51 bate $Date: 2005-12-03
系统主要采用MailScanner+clamav+Spamd+APF来对病毒过滤和垃圾邮件过滤。
本文在4.10、5.3、5.4、6.0上安装测试通过,病毒过滤放弃采用amavisd。主要采用执行效率更高的MailSanner来对邮件过滤和垃圾邮件过滤,配置更容易,并且降低了系统开消。让系统更加稳定,经过严格病毒邮件测试成功率达到了100%。垃圾邮件过滤基本上达到了95%的成功率。
Table of Contents
Chapter 1. 系统安装
1.1 安装MySQL
1.2 安装Apache
1.3 安装PHP
1.4 安装zend
1.5 安装openssl
1.6 安装phpMyAdmin
1.7 通过phpMyadmin设置数据库
1.8安装Courier-imap
1.9安装 postfix 和 cyrus-sasl
1.10 安装expect
Chapter 2. 配置邮件服务器
2.1 配置rc.conf
2.2 配置postfix 和 cyrus-sasl
2.3 配置Courier-imap
Chapter 3. 手动设置第一个用户并测试
Chapter 4. 安装postfix管理工具
4.1安装本人开发的postfix管理工具
4.2 用户登录测试
Chapter 5. 防病毒与防垃圾邮件
5.1 安装Clamav
5.2 安装MailScanner
5.3 安装配置Spamassassin
5.4修改Postfix设定档main.cf
5.5修改mailscanner.conf
5.6新增MailScanner所要用到的资料夹
5.7把病毒提示信息改为中文
5.8MailScanner监管进出邮件
5.9 邮件流量监控(mailscanner-mrtg)安装与设置
5.10.安装APF防垃圾邮件
Chapter 6. 安装webmail
Chapter 7邮件列表(mailman)
Chapter 8. 查看系统状态
Chapter 1. 系统安装
安装之前:因用户数据都保存在/var目录下,因此安装FreeBSD时/var的空间应尽量大。FreeBSD的版本为5.3,按最小化安装,软件包只安装cvsup,安装结束后用cvsup更新ports树。在文档中假设服务器的ip地址为192.168.0.2,域名为 toping.net,主机名为mail.toping.net。
请兄弟们仔细一些,注意空格和TAB。
祝兄弟们好运。本人水平有限。如果发现文章中有什么错误和不当的地方请发邮件:scyz@toping.net。我会在第一时间给予答复。
1.1 安装MySQL
mail# cd /usr/ports/databases/mysql40-server
mail# make install clean
编辑/etc/rc.conf,加入
mysql_enable="YES"
1.2 安装Apache
mail# cd /usr/ports/www/apache2
mail# make install clean
编辑/etc/rc.conf,加入
Apache2_enable="YES"
1.3 安装PHP
mail# cd /usr/ports/www/mod_php4
mail# make install clean
我的选择:(注意别选DEBUG,否则会和ZEND有冲突)
[X] APACHE2 Use apache 2.x instead of apache 1.3.x
安装需要的PHP扩展模块
mail# cd /usr/ports/lang/php4-extensions
mail# make install clean
我选择了下面的模块:
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[X] CRACK crack support
[X] CTYPE ctype functions
[X] CURL CURL support
[X] FTP FTP support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] FILEINFO fileinfo support
[X] IMAP IMAP support
[X] MBSTRING multibyte string support
[X] MCAL Modular Calendar Access Library support
[X] MCRYPT Encryption support
[X] MCVE MCVE support
[X] MHASH Crypto-hashing support
[X] MYSQL MySQL database support
[X] PCRE Perl Compatible Regular Expression support
[X] POSIX POSIX-like functions
[X] SESSION session support
[X] TOKENIZER tokenizer support
[X] XML XML support
[X] ZLIB ZLIB support
最后在编辑/usr/local/etc/apache2/httpd.conf最后加入:
DirectoryIndex index.html index.html.var index.php
#注:在DirectoryIndex这里加入index.php,是为了让apache支持首页为index.php的首页文件
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Group www、User www修改为: Group postfix、User postfix
注:以上这一步要在postfix安装后再操作
1.4.安装zend
mail# cd /usr/ports/devel/ZendOptimizer
mail# make install clean
因为版权的问题,他不会自动下载。这里你需要到他的官方网站去下载ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz到/usr/ports/distfiles目录下面后再安装。
下载地址:
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10a-freebsd4.3-i386.tar.gz
完成后在/usr/local/etc/php.ini中加入:
[Zend]
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer="/usr/local/lib/php/20020429/Optimizer"
zend_extension_manager.optimizer_ts="/usr/local/lib/php/20020429/Optimizer_TS"
zend_extension="/usr/local/lib/php/20020429/ZendExtensionManager.so"
zend_extension_ts="/usr/local/lib/php/20020429/ZendExtensionManager_TS.so"
重启apache安装完成。
1.5 安装openssl
mail# cd /usr/ports/security/openssl
mail# make install clean
1.6 安装phpMyAdmin
mail# cd /usr/ports/databases/phpmyadmin
mail# make fetch
注:(在这里建议直接下载后复制安装)
mail# cd /usr/ports/distfiles
mail# tar –zxvf PhpMyadmin-x.tar.gz
mail# mv /usr/local/www/phpMyAdmin-x /usr/local/www/data/dbadmin
修改/usr/local/www/data/dbadmin/config.inc.php
$cfg['PmaAbsoluteUri'] = 'http://192.168.0.2/dbadmin/';
$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?
注:指定phpmyadmin的认证方式为http方式。
在浏览器输入http://192.168. 0.2/dbadmin/,首次进行登入的用户名为root密码为空,登入后可以修改你的密码。
1.7 通过phpMyadmin设置数据库
建立postfix数据库(注意:数据库名称为postfix):
mail# mysql –u root –p
mysql# CREATE DATABASE `postfix` ;
mysql# use postfix;
下面为sql语句:
CREATE TABLE domaininfo (
domain_id int(5) NOT NULL auto_increment,
domain varchar(25) NOT NULL default '',
alias varchar(30) default NULL,
passwd varchar(35) NOT NULL default '',
usernum int(5) NOT NULL default '0',
quota int(11) NOT NULL default '0',
des varchar(30) default NULL,
expire date NOT NULL default '0000-00-00',
active tinyint(1) NOT NULL default '1',
create_time datetime default NULL,
PRIMARY KEY (domain_id),
UNIQUE KEY domain (domain),
KEY domain_id (domain_id)
) TYPE=MyISAM COMMENT='domain information';
INSERT INTO domaininfo VALUES (1,'admin',NULL,'$1$.j3.t12.$I7MGf7ZD2HrWwUWQF88Mg1',0,0,'Super Admin','0000-00-00',1,'0000-00-00 00:00:00');
CREATE TABLE userinfo (
id int(11) NOT NULL auto_increment,
userid varchar(20) NOT NULL default '',
domain_id int(5) NOT NULL default '0',
address varchar(50) NOT NULL default '',
alias varchar(60) default NULL,
passwd varchar(35) NOT NULL default '',
realname varchar(20) default NULL,
quota int(11) NOT NULL default '0',
active tinyint(1) NOT NULL default '0',
homedir varchar(60) NOT NULL default '',
maildir varchar(60) NOT NULL default '',
create_time datetime NOT NULL default '0000-00-00 00:00:00',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY address (address)
) TYPE=InnoDB COMMENT='User Information';
注:对于初学者,建议以上操作都在phpmyadmin中操作更加的简便,如果后面要使用igenus请导入原来igenus的sql。
建立数据库用户并授以相应的权限
mail# mysql –u root –p
mysql# use mysql;
mysql# INSERT INTO user (host,user,password) VALUES('localhost','postfix','');
mysql# update user set password=password('postfix') where User='postfix';
mysql# GRANT ALL ON postfix.* TO postfix@localhost IDENTIFIED BY "postfix";
注:这里加用户名和密码都为:postfix。并授权对postfix数据库进行操作
1.8 安装Courier-imap
mail# cd /usr/ports/mail/courier-imap
mail# make install clean
我的选择:
[X] OPENSSL Build with OpenSSL support
[X] AUTH_MYSQL MySQL support
在/etc/rc.conf中加入:
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
mail# cd /usr/local/etc/courier-imap
mail# cp imapd.cnf.dist imapd.cnf
mail# cp pop3d.cnf.dist pop3d.cnf
mail# /usr/local/etc/rc.d/courier-authdaemond.sh start
注:此时会在/var/run/authdaemond/下产生socket,如果没有下面这一步下面的认证无法通过。
mail# chmod +x /var/run/authdaemond
1.9 安装 postfix 和 cyrus-sasl
mail# cd /usr/ports/security/cyrus-sasl2
mail# make install WITH_AUTHDAEMON=yes
mail# make clean
创建/usr/local/lib/sasl2/smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket
更详细的参数设置请看:
http://www.toping.net/bbs/htm_data/7/0508/330.html
至此,认证部分基本完成。
安装postfix
mail# cd /usr/ports/mail/postfix
mail# make install clean
我的选择:
[X] VDA VDA (Virtual Delivery Agent)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[X] TLS SSL and TLS
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
回答下面的两问题:
You need user "postfix" added to group "mail".[是否将postfix用户加到mail用户组]
Would you like me to add it [y]? y
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
在/etc/rc.conf中加入postfix启动所需的启动选项
在/etc/rc.conf中加入:
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
设置postfix启动所需
mail# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
注:如果/usr/sbin/sendmail存在就删了再做上链接,如果升级内核和升级系统后要重新做这一步。
mail# echo ‘postfix: root’ >> /etc/aliases
mail# /usr/local/bin/newaliases
mail# chown postfix:postfix /etc/opiekeys
1.10 安装expect
用于Web客户端建立邮件用户
mail# cd /usr/ports/lang/expect
mail# make install clean
Chapter 2. 配置邮件服务器
本节主要讲述各种服务的参数配置。
2.1 配置rc.conf,编辑/etc/rc.conf
下面是前面所装软件都加入了启动选项的rc.conf配置:
mysql_enable="YES"
apache2_enable="YES"
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
2.2 配置postfix 和 cyrus-sasl
(1)修改/usr/local/etc/postfix/main.cf,在文件最后加入以下内容
mail# ee /usr/local/etc/postfix/main.cf
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_etrn_restrictions = permit_mynetworks, reject
#=====================BASE=====================
myhostname = mail.toping.net
mydomain = toping.net
mydestination = $myhostname
local_recipient_maps =
command_directory = /usr/local/sbin
local_transport = virtual
#=====================MySQL=====================
virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:125
virtual_mailbox_base = /
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 125
virtual_transport = virtual
virtual_uid_maps = static:125
#=====================Quota=====================
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====================SASL=====================
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,permit_auth_destination,reject
smtpd_client_restrictions = permit_sasl_authenticated
更详细的参数设置请看论坛:
http://www.toping.net/bbs/htm_data/7/0601/871.html
(4)编辑/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT alias FROM userinfo WHERE address='%s' AND active = 1
(5)编辑/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT domain FROM domaininfo WHERE domain='%s'
(6)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT maildir FROM userinfo WHERE address='%s' AND active = 1
(7)编辑/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
mail# ee /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
query = SELECT quota FROM userinfo WHERE address='%s'
2.3 配置Courier-imap
(1)修改Courier相关设置,/usr/local/etc/courier-imap/imapd:
IMAP_CAPABILITY="IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA"
(2)修改/usr/local/etc/courier-imap/pop3d
POP3AUTH="LOGIN CRAM-MD5 CRAM-SHA1"
(3)编辑修改/usr/local/etc/authlib/authmysqlrc
mail# mv /usr/local/etc/authlib/authmysqlrc /usr/local/etc/authlib/authmysqlrc_bak
mail# ee /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost //数据库主机地址
MYSQL_USERNAME postfix //数据库用户名
MYSQL_PASSWORD postfix //数据库密码
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix //数据库名称
MYSQL_USER_TABLE userinfo
MYSQL_CRYPT_PWFIELD passwd
MYSQL_UID_FIELD '125'
MYSQL_GID_FIELD '125'
MYSQL_LOGIN_FIELD address
MYSQL_HOME_FIELD homedir
MYSQL_NAME_FIELD realname
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
注:这里得用tab键来跳格
(4)编辑/usr/local/etc/authlib/authdaemonrc
mail# mv /usr/local/etc/authlib/authdaemonrc /usr/local/etc/authlib/authdaemonrc_bak
mail# ee /usr/local/etc/authlib/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
version="authdaemond.mysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"
重启服务器
Chapter 3.手动设置第一个用户并测试
本章介绍如何开通用户,并且测试系统是否正常。
注:增加用户时请到这里生成加密后的密码后直接插入到数据库中就可以了。
http://www.toping.net/soft
mail# mysql
mysql> use postfix;
mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| address |
| admin |
| card |
| domaininfo |
| lastauth |
| logs |
| message |
| personal |
| scheduler |
| stow |
| userinfo |
| vpopmail |
+-------------------+
12 rows in set (0.00 sec)
增加域名和管理员
mysql> desc domaininfo;
+-------------+-------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+------------+----------------+
| domain_id | int(5) | | PRI | NULL | auto_increment |
| domain | varchar(25) | | UNI | | |
| alias | varchar(30) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| usernum | int(5) | | | 0 | |
| quota | int(11) | | | 0 | |
| des | varchar(30) | YES | | NULL | |
| expire | date | | | 0000-00-00 | |
| active | tinyint(1) | | | 1 | |
| create_time | datetime | YES | | NULL | |
+-------------+-------------+------+-----+------------+----------------+
10 rows in set (0.00 sec)
mysql> INSERT INTO `domaininfo` VALUES (7, 'toping.net', NULL, '$1$jNXThQXq$KPjm.WE2f2yX5rceY48vX. ', 50, 500, NULL, '0000-00-00', 1, '2005-04-19 23:19:11');
Query OK, 1 row affected (0.00 sec)
注:这里的toping.net的管理密码为:admin123
mysql> desc userinfo;
+-------------+-------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------------------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| userid | varchar(20) | | | | |
| domain_id | int(5) | | | 0 | |
| address | varchar(50) | | UNI | | |
| alias | varchar(60) | YES | | NULL | |
| passwd | varchar(35) | | | | |
| realname | varchar(20) | YES | | NULL | |
| quota | int(11) | | | 0 | |
| active | tinyint(1) | | | 0 | |
| homedir | varchar(60) | | | | |
| maildir | varchar(60) | | | | |
| create_time | datetime | | | 0000-00-00 00:00:00 | |
| fax | varchar(20) | | | | |
| telephone | varchar(15) | | | | |
| sex | int(1) | | | 0 | |
| year | int(4) | | | 0 | |
| MONTH | int(2) | | | 0 | |
| DAY | int(2) | | | 0 | |
| education | varchar(4) | | | | |
| marital | int(1) | | | 0 | |
| occupation | varchar(15) | | | | |
| companyname | varchar(30) | | | | |
| province | varchar(6) | | | | |
+-------------+-------------+------+-----+---------------------+----------------+
23 rows in set (0.00 sec)
mysql> INSERT INTO `userinfo` VALUES (8, 'webmaster', 7, 'webmaster@toping.net', NULL,'$1$4DLQeNkz$QKCAQqg244XwvLl2SD11f0', 'webmaster', 209715200, 1, '/var/mail/toping.net/webmaster/', '/var/mail/toping.net/webmaster/Maildir/', '2005-04-20 23:45:17', '', '', 0, 0, 0, 0, '', 0, '', '', '');
注:这里的webmaster用户的邮箱密码为:000000
mysql>quit
设置用户的目录与权限:
Mail# mkdir -p /var/mail/toping.net/webmaster
Mail# /usr/local/bin/maildirmake /var/mail/toping.net/webmaster/Maildir
Mail# chmod -R 777 /var/mail/toping.net/
Mail# chown -R postfix:postfix /var/mail/toping.net
至此用户设置完毕,这里只使用一个域名,同理可以设置多个域名。
Chapter 4.安装postfix管理工具
本节主要介绍如何安装和使用本人开发的postfix管理工具。
4.1安装本人开发的postfix管理工具来设置第一个域名和用户
上传管理工具到网站目录
后修改include/config.inc.php中的
define(DOMAINSDIR,"/home/vmail"); 为 define(DOMAINSDIR,"/var/mail");
define(MYSQL_HOST, 'localhost'); 为 您的MySQL服务器的主机名
define(MYSQL_USER, 'root'); 为 您的MySQL的用户名
define(MYSQL_PASS, 'mypasswd'); 为 您的MySQL的密码
define(MYSQL_DATA, 'postfix'); 为 您的邮件服务器的数据库
修改完成后运行:http://mail.toping.net/webadmin/index.php
完装完成!!
4.2 用户登录测试
用户登录测试
安装p5-MIME-Base64
mail# cd /usr/ports/converters/p5-MIME-Base64/
mail# make install clean
通过p5-MIME-Base64来取得用户名和密码的base64编码
mail# perl -MMIME::Base64 -e 'print encode_base64("webmaster\@toping.net");'
d2VibWFzdGVyQHRvcGluZy5uZXQ=
mail# perl -MMIME::Base64 -e 'print encode_base64("000000");'
MDAwMDAw
测试发送邮件(端口:25):
mail# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 0.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
ehlo mail
250-mail.toping.net
250-PIPELINING
250-SIZE 4194304
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN OTP
250-AUTH=NTLM LOGIN PLAIN OTP
250 8BITMIME
auth login
334 VXNlcm5hbWU6
d2VibWFzdGVyQHRvcGluZy5uZXQ= //此为用户名id:webmaster@toping.net
334 UGFzc3dvcmQ6
MDAwMDAw //此为用户密码password:000000
235 Authentication successful
MAIL FROM: //告诉服务器发件人的Email地址
250 Ok
RCPT TO: //告诉服务器收件人的地址
250 OK
DATA //告诉服务器开始写信
354 End data with .
SUBJECT:test //subject后面填写的是邮件的主题
test
. //换行后输入.后按回车,表示信件内容书写完毕
250 Ok: queued as 58DC71D5
quit //发送信件,结束对话,退出SMTP服务器
221 Bye
Connection closed by foreign host
测试收取邮件(端口:110):
mail# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 0
Escape character is '^]'
+OK Hello there
user webmaster@toping.net
+OK Password required
pass 000000
+OK logged in
list
+OK POP3 clients that break here, they violate STD53
1 2217
retr 1 //返回第一封信的全部内容
+OK 2217 octets follow.
Return-Path:
X-Original-To: webmaster@toping.net
Delivered-To: webmaster@toping.net
Received: from mail (localhost.toping.net [127.0.0.1])
by mail.toping.net (Postfix) with ESMTP id 58DC71D5
for ; Mon, 9 Aug 2004 21:11:20 +0800 (CST)
SUBJECT:test
Message-Id: <20040809131120.58DC71D5@mail.toping.net>
Date: Mon, 9 Aug 2004 21:11:20 +0800 (CST)
From: webmaster@toping.net
To: undisclosed-recipients:;
test
.
dele 1 //删除
+OK Deleted
quit
+OK Bye-bye
Connection closed by foreign host
也可以使用任何其它的邮件客户端程序来测试,如foxmail、Outlook Express等等。
Chapter 5. 防病毒与防垃圾邮件
本章介绍病毒与垃圾邮件的防范。
5.1 安装Clamav
mail# cd /usr/ports/security/clamav
mail# make install clean
我的选择:
[X] MILTER Compile the milter interface
[X] CURL Support URL downloading
[X] LIBUNRAR Support for external Unrar library
要想clamav能自动的启动请在/etc/rc.conf中加入:
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
重启服务器
测试杀毒
mail# clamscan -r -i /usr/local/www/data
----------- SCAN SUMMARY -----------
Known viruses: 41293
Engine version: 0.87.1
Scanned directories: 53
Scanned files: 602
Infected files: 0
Data scanned: 41.51 MB
Time: 18.294 sec (0 m 18 s)
升级病毒库
mail# freshclam
ClamAV update process started at Sun Dec 4 01:10:02 2005
main.cvd is up to date (version: 34, sigs: 39625, f-level: 5, builder: tkojm)
daily.cvd is up to date (version: 1200, sigs: 1669, f-level: 6, builder: tomek)
5.2 安装MailScanner
mail# cd /usr/ports/mail/mailscanner
mail# make install
第一次执行安装因此需执行make initial-config以建立基本配置文件
mail# make initial-config
mail# make clean
5.3 安装SpamAssassin
mail# cd /usr/ports/mail/p5-Mail-SpamAssassin
mail# make install clean
我的选择:
[X] AS_ROOT Run spamd as root (recommended)
[X] DOMAINKEYS DomainKeys support
[X] SSL Build with SSL support for spamd/spamc
[X] MYSQL Add MySQL support
[X] RAZOR Add Vipul's Razor support
[X] SPF_QUERY Add SPF query support
[X] RELAY_COUNTRY Relay country support
[X] TOOLS Install SpamAssassin tools
5.4修改Postfix设定档main.cf
mail# ee /usr/local/etc/postfix/main.cf
#header_checks = regexp:/usr/local/etc/postfix/header_checks //默认值
header_checks = regexp:/usr/local/etc/postfix/header_checks //把注释去掉
编辑/usr/local/etc/postfix/header_checks
mail# ee /usr/local/etc/postfix/header_checks
/^Received:/ HOLD //新加入
5.5修改mailscanner.conf
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#Run As User = //默认值
Run As User = postfix //修改后
#Run As Group = //默认值
Run As Group = postfix //修改后
#Incoming Queue Dir = /var/spool/mqueue.in //默认值
Incoming Queue Dir = /var/spool/postfix/hold //修改后
#Outgoing Queue Dir = /var/spool/mqueue //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming //修改后
#MTA = sendmail //默认值
MTA = postfix //修改后
#Virus Scanners = none //默认值
Virus Scanners = clamav //修改后
#Use SpamAssassin = no //默认值
Use SpamAssassin = yes //修改后
5.6新增MailScanner所要用到的资料夹
mail# mkdir /var/spool/MailScanner
mail# mkdir /var/spool/MailScanner/incoming
mail# mkdir /var/spool/MailScanner/quarantine
mail# chown postfix:postfix /var/spool/MailScanner/incoming
mail# chown postfix:postfix /var/spool/MailScanner/quarantine
mail# touch /usr/local/etc/MailScanner/rules/bounce.rules //新建一个空白文件,要不然会出错。
mail# chmod –R 777 /var/spool/postfix
mail#cp /usr/local/etc/MailScanner/mcp/10_example.cf.sample /usr/local/etc/MailScanner/mcp/10_example.cf
mail#cp /usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf.sample
/usr/local/etc/MailScanner/mcp/mcp.spam.assassin.prefs.conf
注:这里的倒数一、二行实际操作中为一行
重新启动服务器
测试病毒过滤:
mail# telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.toping.net ESMTP Postfix
mail from:webmaster@toping.net
250 Ok
rcpt to:webmaster@toping.net
250 Ok
data
354 End data with .
Subject:Virus test
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 Ok: queued as F0C221CC20 //出现F0C221CC20这行表示mailscanner运行成功了
quit
221 Bye
Connection closed by foreign host.
5.7把病毒提示信息改为中文
预设系统提示信息为英文,可以下载我修改的中文包。
http://mail.toping.net/mailscanner/cn.rar
注:把下载下来的文件解压后放到/usr/local/share/MailScanner/reports/cn下面去
mail# ee /usr/local/etc/MailScanner/MailScanner.conf
#%report-dir% = /usr/local/share/MailScanner/reports/en //默认值(加载英文)
%report-dir% = /usr/local/share/MailScanner/reports/cn //修改后为读取中文
5.8.用MailScanner来监管进出邮件
mail# ee MailScanner.conf
Archive Mail = %rules-dir%/archive.rules
mail# ee archive.rules
方法一:互相备份, 以上这样并不会造成 loop
FromOrTo: a@toping.net yes forward b@toping.net
FromOrTo: b@toping.net yes forward a@toping.net
方法二:可以 forward 到复数信箱
FromOrTo: a@toping.net yes forward b@toping.net c@toping.net d@toping.net
方法三:同时备份到一个或多个档案及一个或多个信箱
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/a_user_backup.mbx /var/spool/MailScanner/archive/a_user_backup.mbx b@toping.net scyz2@163.com
注:以上为一行,该档案要先建立且确定该档案拥有者与 MailScanner.conf 的 Run As User = XXXXXXX 相同
方法四:备份到数据夹及多个信箱或档案
FromOrTo: a@toping.net yes forward /var/spool/MailScanner/archive/ b@toping.net scyz2@163.com /var/spool/MailScanner/archive/a_user_backup.mbx
注:以上为一行,权限同SAMPLE3;注意事项, 他会依日期再分数据夹, 日期数据夹内的文件名称 mail queue ID, 格式为 postfix mail queue 格式
更详细的mailscanner.cf的参数请看论坛:
http://www.toping.net/bbs/htm_data/7/0509/533.html
5.9.安装MailScanner-mrtg
mail# cd /usr/ports/mail/ mailscanner-mrtg
mail# make install clean
mailscanner-mrtg相关设置
mail# cd /usr/local/etc/mailscanner-mrtg //切换至mailscanner-mrtg 目录
mail# cp mailscanner-mrtg.conf.sample mailscanner-mrtg.conf
mail# cp mailscanner-mrtg.cfg.sample mailscanner-mrtg.cfg
mail# chmod 644 mailscanner-mrtg.conf //更改权限为可修改
mail# chmod 644 mailscanner-mrtg.cfg //更改权限为可修改
mail# ee mailscanner-mrtg.conf //修改mailscanner-mrtg.conf内容如下
#MTA = sendmail //默认值
MTA = postfix //修改后
#Where the MTA puts mail before MailScanner gets it
#Incoming Queue Dir = /var/spool/postfix.in/deferred/ # Postfix
#Incoming Queue Dir = /var/spool/exim.in/input/ # Exim
Incoming Queue Dir = /var/spool/mqueue.in/ # Sendmail //默认值
Incoming Queue Dir = /var/spool/postfix/hold # Postfix //修改后
#Where MailScanner puts your mail after it is scanned
#Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix
#Outgoing Queue Dir = /var/spool/exim/input # Exim (?)
Outgoing Queue Dir = /var/spool/mqueue/ # Sendmail //默认值
Outgoing Queue Dir = /var/spool/postfix/incoming/ # Postfix //修改后(把#拿掉)
#Which interfaces to monitor (comma separated list)
Interfaces to Monitor = fxp0 //默认值
Interfaces to Monitor = vr0 //修改后(改成您的网卡吧)
mail# ee /usr/local/etc/apache/httpd.conf //修改apache配置以便读取mailscanner-mrtg数据
内容如下:
#MailScanner Setting
Alias /mailscanner-mrtg/ "/usr/local/www/mailscanner-mrtg/"
Step5.产生MailScanner-Mrtg流量图
mail# /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
mail# crontab -e
*/10 * * * * /usr/local/bin/mrtg /usr/local/etc/mailscanner-mrtg/mailscanner-mrtg.cfg
5.10.安装APF防垃圾邮件
http://apf.org.cn
下载地址:
http://mail.toping.net/apf/apf.rar
下载最新的APF包解压到/usr/local/etc/postfix目录。
这时/usr/local/etc/postfix目录里边有一个apf-posftix.pl的文件
修改/usr/local/etc/postfix/master.cf
mail# ee /usr/local/etc/postfix/master.cf
加入:
apf unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/local/etc/postfix/apf-postfix.pl
增加黑白名单:
1、IP黑名单:
ip_black_list.txt
2、IP白名单
ip_white_list.txt
3、域名黑名单
dn_black_list.txt
4、域名白名单
dn_white_list.txt
Chapter 6. 安装webmail
如何使用本人修改的iGENUS for Postfix 2.01
下载地址:
http://mail.toping.net/igenus/igenus_for_postfix_2.01.rar
webmail使用igenus,版本是iGENUS for Postfix 2.01
建议下载本人修改的iGENUS for Postfix 2.01
安装方法参考论坛:
http://www.toping.net/bbs/htm_data/7/0507/174.html
mail# cd /usr/local/www/data
mail# chown -R postfix:postfix phpMyAdmin
mail# cd /usr/local/etc
mail# cp php.ini-dist php.ini
修改/usr/local/etc/php.ini
webmail上传附件设置:
register_globals = On
max_execution_time = 30 //改为60 (增加处理脚本的时间限制)
memory_limit = 8M //改为40M (这样才能发10M的附件)
post_max_size = 8M //改为10M
upload_max_filesize = 2M //改为10M
重启apache
mail# /usr/local/etc/rc.d/apache2.sh restart
Chapter 7. 安装邮件列表(MAILMAN)安装
本节主要讲述邮件列表mailman的安装和配置
设置/etc/make.conf
mail# ee /etc/make.conf
# mail/mailman
MAIL_GID="mailman"
安装mailman
mail# portinstall -m BATCH=yes mail/mailman
配置apache(新加入)
mail# ee /usr/local/etc/apache2/httpd.conf
ScriptAlias /mailman "/usr/local/mailman/cgi-bin"
AllowOverride None
Options none
Order allow,deny
Allow from all
Alias /pipermail "/usr/local/mailman/archives/public"
AllowOverride None
Options +FollowSymlinks
Order allow,deny
Allow from all
用check_perms
mail# /usr/local/mailman/bin/check_perms -f
注:加上-f参数可以修复。
修改/usr/local/mailman/Mailman/mm_cfg.py,加上:
DEFAULT_EMAIL_HOST = 'lists.toping.net'
MTA = 'Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['lists.toping.net', 'toping.net']
添加一个邮件列表:
mail# /usr/local/mailman/bin/newlist mailman
把用户添加到邮件列表里测试,建一个文本文件,比如maillists.txt,一行一个邮件地址,然后执行如下命令:
mail# /usr/local/mailman/bin/add_members -n maillists.txt mailman
mail# ee postfix/main.cf
owner_request_special = no
recipient_delimiter = +
virtual_alias_maps = hash:/usr/local/mailman/data/virtual-mailman,
mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf
alias_maps = hash:/usr/local/mailman/data/aliases,hash:/usr/local/etc/postfix/aliases
mail# ee Default.py
DEFAULT_EMAIL_HOST = 'lists.toping.net'
DEFAULT_URL_HOST = 'lists.toping.net'
DEFAULT_URL_PATTERN = 'http://%s/mailman/'
DEFAULT_SERVER_LANGUAGE = 'zh_CN'
设置virtual-mailman
mail# ee /usr/local/mailman/data/virtual-mailman
lists.meilai.com anything
邮件列表的配置
Default.py和mm_cfg.py的配置是针对全局的,对全局配置文件的修改不会影响到已经存在的邮件列表。mailman提供了config_list这个命令来对单个邮件列表进行配置,先导出该邮件列表的配置:
mail# /usr/local/mailman/bin/config_list -o /tmp/config mailman
然后修改/tmp/config文件,里面有很多选项,可以根据自己的要求修改,比如加上回复到邮件列表的邮件头、去掉mailman自动加的边脚等等,最后把这个配置文件导回给邮件列表就可以了:
mail# /usr/local/mailman/bin/config_list -i /tmp/config mailman
下面你可以通过web去管理你的邮件列表:
http://lists.toping.net/mailman/admin/mailman
查看邮件列表信息:
http://lists.toping.net/mailman/listinfo/mailman/
功能太强大了,这里不一一的讲解,自己去发现吧
Chapter 7. 查看系统状态
本节主要讲述phpSysInfo工具的安装和配置
安装phpSysInfo(2.2)
mail# cd /usr/ports/www/phpSysInfo
mail# make install clean
mail# cd /usr/local/www/data-dist/phpSysInfo
mail# cp config.php.new config.php