首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 图形图象-> Director教程
大容量邮件系统的设计与实现_qmail
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
written by hefish@cz8.net 要转载请先通知作者

目的:指导读者去建立一个实用的,健壮的大容量的电子邮件系统。当然我的意思并不是说,根据本文就能建立起一套能与163.com,新浪等大型网站的邮件系统相匹敌的系统。163.com据说有2000多万用户,我们的系统没经过那么多用户的考验,如果真要承受那么多用户,估计肯定是有问题的。我们的定位是在10万用户以下的系统。这对绝大多数应用来说,已经是足够了。

windows or UNIX
不论微软如何吹嘘他的系统有多么的好。高端服务器市场里,从来就没有NT的份。所以,不用考虑了。UNIX!我们使用的是FreeBSD,因为从各方面看,它都是最稳定的,最高效的PC操作系统。

qmail or postfix
目前大容量邮件系统所用的MTA不外乎两种,qmail/postfix。qmail安装简单,配置方便,还有很多工具可以使用,比如说vpopmail, sqwebmail等,在这些方面,postfix显得很不尽人意。国内也有很多基于qmail的产品,都说是支持海量用户的。但是实际应用中,postfix却显示出极大的优越性。撇开别的不说,单说垃圾邮件问题。假如别人使用你的邮件服务器发垃圾邮件,肯定会有很多退信,很多地方的退信,退到你的服务器上来,这就相当于一次分布式攻击。实际情况测试下来,qmail对这样的情况,无能为力。在邮件队列里塞满很多很多待处理的邮件之后,qmail好像停止了工作。即便在清理qmail的邮件队列之后,qmail仍然不能恢复正常工作。postfix顺利地经受住了这样的考验,很快的处理掉了一些无用的信件,而且,即使是在负载很重的情况下,postfix仍然能顽强的工作。

开始
系统描述
平台:FreeBSD
MTA: Postfix
特性:1、使用mysql存储用户数据
2、 支持每个用户的quota
3、支持smtp发信认证

准备的软件
FreeBSD (这里就不说怎么安装了,有很多文章可以参考) (http://www.freebsd.org/)
postfix 1.1.11 (http://www.postfix.org/)
mysql 3.23.51 (这里也不说怎么安装了) (http://www.mysql.com/ )
cyrus-sasl 1.5.27 (http://asg.web.cmu.edu/sasl/)
pwcheck for mysql补丁 hefish@cz8.net

设计数据库
首先要在mysql里面添加一个数据库,用来保存邮件账号的信息。这些信息至少要有这么多:用户名/密码(明码)/用户id/组id/用户的home目录/用户的邮件目录/用户邮箱大小。如果需要转发的话,还要另外添加转发表。内容至少包括:本地地址/转发地址。我们的用户表是这样设计的。(mysqldump的结果,加了注释)

CREATE TABLE `forward` (
`username` varchar(255) NOT NULL default , //本机地址
`forward_addr` varchar(255) default NULL, //转发地址
PRIMARY KEY (`username`)
) TYPE=MyISAM;

CREATE TABLE `transport` (
`domain` varchar(255) NOT NULL default , //邮件域
`transport` varchar(8) default NULL, //处理方式: virtual:
PRIMARY KEY (`domain`)
) TYPE=MyISAM;


CREATE TABLE `user` (
`username` varchar(128) NOT NULL default , //用户名
`uid` int(6) NOT NULL default 0, //uid
`gid` int(6) default NULL, //gid
`clearpw` varchar(128) NOT NULL default , //密码 (明文)
`home` varchar(255) NOT NULL default , //home目录
`maildir` varchar(255) NOT NULL default , //maldir目录
`quota` varchar(255) default NULL,
PRIMARY KEY (`username`),
UNIQUE KEY `username` (`username`),
KEY `username_2` (`username`)
) TYPE=MyISAM;


安装cyrus-sasl
postfix在做smtp发信认证的时候,要用到cyrus-sasl库,所以要先装这东西。在postfix的SASL_README文件里面,有详细的安装说明。这里我们只是说一些简单的步骤:
* 解压缩
tar zxvf cyrus-sasl-1.5.27.tar.gz
* 配置
cd cyrus-sasl-1.5.27
./configure --with-pwcheck=/var/pwcheck --enable-login --enable-plain
* 编译安装
make %26amp;%26amp; make install
* 文档上还说要做一个/usr/local/sasl的连接,指到/usr/local/lib/sasl
ln -s /usr/local/lib/sasl /usr/local/sasl

安装postfix
我们这里安装postfix的时候,要加入三个支持,一个是mysql支持,另两个就是SASL和quota支持。根据postfix的README里面的叙述,我们这样来编译我们的postfix:
* 首先解压缩:
tar zxvf postfix-1.1.11.tar.gz
* 配置:
cd postfix-1.1.11
make -f Makefile.init makefiles CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -I/usr/local/include AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/local/lib -lsasl
* 打quota补丁
cd ..
patch < postfix-1.1.11_quota_maildirsize.patch
* 编译:
make

编译完了之后,记得建立一个postfix用户,和postdrop组。别问为什么,反正postfix要用:
pw user add postfix
pw group add postdrop

然后就可以安装了,安装的时候用默认的设置就可以了。如果失败的话,可以尝试在提示"tempdir: "的时候,输入:/tmp,这样多半能安装成功。

配置postfix。
postfix的配置文件主要是/etc/postfix/main.cf 我们要做大致4部分的配置。
第一部分:最基本的配置
myhostname = mail.mydomain.com // 本机的机器名
mydomain = mydomain.com // 域名
mynetworks = 127.0.0.0/8, 61.132.98.120/29 // 允许不经smtp认证就能发信的ip段
home_mailbox = Maildir/ // 所使用的邮箱的格式mailbox/maildir,我们使用的是Maildir/注意最后有一个斜杠,不能少。
smtpd_banner = xxx mail system // smtp的欢迎信息。

第二部分:关于mysql配置
postfix的MYSQL_README文件中有一些说明,但是并不十分详细,对初学者很不够,我就来详细说一下mysql的配置。跟mysql有关的配置主要是以下几个。
transport_maps = mysql:/etc/postfix/transport.cf
virtual_mailbox_base =/
virtual_uid_maps = mysql:/etc/postfix/ids.cf
virtual_gid_maps = mysql:/etc/postfix/gds.cf
virtual_mailbox_maps = mysql:/etc/postfix/users.cf
virtual_maps = mysql:/etc/postfix/forward.cf
后面的mysql:/是指的获得值的方式。后面跟的是一个配置文件。根据这个配置文件里面的配置内容去访问mysql数据库,就能找到需要的值。先说一下各个配置项的含义。
transport_maps 指定哪些域的邮件,可以被postfix收下来。
virtual_mailbox_base 指定用户邮箱所在的根目录。
virtual_uid_maps 指定用户帐号的id (一般这个id跟系统中postfix用户的id一致)
virtual_gid_maps 指定用户账号的组id (一般这个id跟系统中postfix组的id一致)
virtual_mailbox_maps 指定用户邮箱所在的目录。
virtual_maps 指定自动转发邮件的设置。

配置文件的格式:(MYSQL_README文件里有说明)
user = someone //访问数据库用的用户名
password = somepass //访问数据库的密码
dbname = database_name //要访问数据库名
table = data_table //要访问的数据库中的表名
select_field = uid //要返回的字段
where_field = username //用于检索的字段
hosts = localhost //数据库主机的域名/IP
additional_conditions = //附加的检索条件

作为参考,我列出一些示例配置:
/etc/postfix/transport.cf:
user = postfix
password =
dbname = postfix
table = transport
select_field = transport
where_field = domain
hosts = localhost

/etc/postfix/ids.cf:
user = postfix
password =
dbname = postfix
table = user
select_field = uid
where_field = username
hosts = localhost

/etc/postfix/gds.cf:
user = postfix
password =
dbname = postfix
table = user
select_field = gid
where_field = username
hosts = localhost

/etc/postfix/forward.cf:
user = postfix
password =
dbname = postfix
table = forward
select_field = forward_addr
where_field = username
hosts = localhost

/etc/postfix/user.cf:
user = postfix
password =
dbname = postfix
table = user
select_field = maildir
where_field = username
hosts = localhost

第三部分:quota的配置
主要的配置项有:
#add quota support
message_size_limit = 4000000 //单个邮件的大小限制,这里是4000000字节
virtual_mailbox_limit = 4000000 //默认的邮箱的大小。
virtual_mailbox_limit_maps = mysql:/etc/postfix/quota.cf //每个用户的邮箱大小
virtual_mailbox_limit_override = yes //是否允许覆盖默认的邮箱大小。

/etc/postfix/quota.cf:
user = postfix
password =
dbname = postfix
table = user
select_field = quota
where_field = username
hosts = localhost

第四部分:smtp发信认证的配置。
首先配置sasl,根据postfix里面SASL_README的说明,先创建一个/usr/local/lib/sasl/smtpd.conf 里面的内容是一句话:pwcheck_method: pwcheck。这里我们使用pwcheck方法来实现SASL的认证过程。由于,cyrus-sasl自带的pwcheck只能实现系统账号的认证,所以要对这个pwcheck进行改造,让他支持mysql数据库。我做了一下,不是很难。把pwcheck_mysql.c下载来之后,复制到cyrus-1.5.27/pwcheck目录下。用gcc命令来编译。我是这样编译的:gcc -I.. -I/usr/local/mysql/lib/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient -lm -lz -o pwcheck_mysql pwcheck_mysql.c
编译好了,就把pwcheck_mysql 复制到/usr/local/sbin/ 下,然后建立一个/var/pwcheck目录,设置目录的属性为0777,这是pwcheck的工作目录。

然后配置postfix。
在main.cf中间加入:
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated permit_auth_destination reject
smtpd_sasl_security_options = noanonymous
smtpd_client_restrictions = permit_sasl_authenticated

最后的配置:
在mysql数据库里面的transport表里面,加入一条数据,domain 为你邮件所在的域(mydomain.com),transport为"virtual:",然后在user表里加入一些数据。记住用户名要写全称(user@domain.com), 邮件目录要以Maildir/ 结尾,然后就启动postfix吧:postfix start。
从外部发一封信过来,postfix会自动创建一些不存在的邮件目录,然后把邮件放到Maildir/里面去。good luck。

后记

这里只是说了一下smtp的架设,一个完整的邮件系统,还应该包含很多东西。如pop3, imap, webmail等等。但是,解决了smtp, 剩下的不是什么大问题。 pop3/imap我建议是用courier-imap,配置很简单。webmail我建议用中国人写的iGENUS。[完]


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·用Session对Web页面进行保护-PHP教程,PHP应用
·C#数据库編程2-.NET教程,数据库应用
·Java变量类型间的相互转换-JSP教程,Jsp/Servlet
·HTML中的数据绑定(Data Binding)-.NET教程,数据库应用
·开关电源发展轨迹
·大功率开关电源系统通信模块设计
·在C#中使用ADO.Net部件来访问Access数据库-.NET教程,数据库应用
·新型数字交叉连接系统sdxc的功能及其在通信网络中应用研究
·WinCE 5.0边做边学(1)-.NET教程,评论及其它
·ups供电系统的可靠性和”可利用率”
最新文章
·seo策略之大型网站_seo网站优化
·dreamweaver经典插件下载_dreamweaver教程
·使用asp.net ajax框架扩展html map控件_asp.net技巧
·个人网站发展和赚钱的模式—选择篇_网赚技巧
·王通:赚钱的三种基本方式_网赚技巧
·爱卡汽车网总裁张京秋:将会并购互补媒体_站长访谈
·站长访谈:mosens—一个高一站长的建站经历_站长访谈
·初学建站应知:网站文件命名规范_站长心得
·你的网站是否会被搜索引擎封杀?_站长心得
·google优化网站管理员指导方针_站长心得
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭