1. 介绍
很感谢几个新的web mail产品(比如像IMP),使得web设计者可以通过这些产品来在他们的网站上提供基于web的邮件服务.尽管采用采用这些产品来实现web方式邮件服务的解决方案已经越来越流行,但是邮件服务可扩展性这个问题已经被提出来.很多web mail系统(包括免费的)都是设计在单个mail和web服务器上,所有的限制都取决于一台服务器上面.在这种情况下再扩展几千个用户是简单但不容易实现,这就是我为什么开始设计一个在实际应用中可以无限扩展而且实现简单的系统.
1.1 背景
基于Web的电子邮件系统就像野花一样迷人,以至于像hotmail和bigfoot这样的站点变得如此流行,其他的站点看来也是把提供基于web的邮件服务添加到了他们的服务项目表中.事实上,很多像EmuMail和IMP这样地产品已经被开发出来以帮助人们向他们的客户提供这项服务.不管怎么样,基于这些产品之上的站点变得流行起来,同时也在加重了网络和机器的资源负担.如果没有一个可定制的解决方案,就像Hotmail一样,很多使用了off-the-shelf(我想可能是没有自己开发或者定制性差那种意思,就靠各位去理解了) webmail系统的站点已经开始感到发展期的困难了.正以为如此,找到一个能够相对简单地实现而且可以扩展到数千甚至是数百万用户的解决方案的需求变的越来越紧迫.
我是DigitalNation的一名开发人员,现在在为Worldcities工程工作. Worldcities不仅提供世界各地的本地新闻和信息,而且还提供基于web的邮件服务.因为很多非美国的ISP没有给他们的客户提供电子邮件服务,Webmail在美国以外的地区是很流行的.正因为 Worldcities不是以美国为中心,所以我们很快意识到邮件服务的可扩展性是很必要的.
我们以前的邮件服务系统是采用两种服务器,一种是运行Sendmail和UW IMAP,另外一种是运行 IMP, 它是一个使用PHP编写的开放代码的webmail系统(应该说是最好的,我认为).这种邮件服务系统很容易实现而且工作得很好.但是,经过两三个月后,发现我们的邮件系统明显负载过重,所以我们必须要很快找到一个新的解决方案.而且我们有很多正在使用本系统的用户,新的方案不能够遗失他们已经存在的电子邮件.
以前我们选择IMP是因为它是免费的(比如说我可以在它的基础上进行一些必要的修改),选择 Sendmail和UW IMAP是因为它们是标准的工具.很明显,Sendmail和UW IMAP对我们的用户来说是太慢了,因此我开始研究其他的MATs和IMAP服务器软件.
我最后决定采用postfix作为MTA, 因为它至少比Sendmail要快三倍, 采用cyrus是因为它既不需要主机的系统帐号也不需要像UW IMAP那样消耗很多系统资源.我们保留了IMP,因为它不单是免费的,而且很容易配置.我们也不想用户受制于新的界面. 在研究的过程中我发现 postfix能够使用LDAP目录服务来作为它的别名数据库(使用maildrop和mailacceptinggeneralid属性),而且有一个补丁程序可以让Cyrus使用LDAP来进行用户认证.配合DNS循环解析(译者注:DNS循环解析是为同一个名字分配多个IP地址,它在Yahoo等相当大的站点应用,实际效果相当不错),把web请求和发送进来的邮件分散给不同的服务器进行处理,这样做就是一个具备了高可扩展性的解决方案.剩下的问题是怎么把这些功能集成在一起来.
这个方案的可扩展性主要是postfix能够根据LDAP中对应用户目录项的maildrop属性值来把邮件转发到其他的用户信箱或者别的邮件服务器上.我们要做的只是赋给属性maildrop一个完整有效的邮件地址作为它的属性值.例如,如果DNS的MX记录指定了一组邮件服务器并且从LDAP中检索的结果是把发送给的邮件转到,postfix就会把发送给该用户的邮件转发到machine44这台邮件服务器上.有了这个功能,你就可以在你的域内设置无限个邮件帐号.
我想最棘手的就是通过IMP从后台邮件服务器中读取邮件.既然IMP已经支持把web服务器和mail服务器分开,现在要做的就是用从LDAP中检索邮件服务器名来取代在配置文件中指定邮件服务器的方式,在配置文件中只能够指定在一台邮件服务器上收发邮件.这样就使得设置邮件服务器变得很简单,只需要在一个文件中添加几行代码和在IMP的默认配置文件中添加一个新的配置参数就行了.现在我们可以使用postfix来转发邮件、通过IMP从多个邮件服务器中检索邮件.
但是,UW IMAP依然是个问题.有下面几个理由:1、使用平面文件格式.2、对大量的邮件信息不具有可扩展性.3、需要使用主机系统的认证方式和系统帐号,用户每次登录都要读取一次/etc/passwd文件.4、比我们所期望的速度要慢.所以我们决定采用Cyrus, 一个没有上面那些限制的imap服务器.更值得可喜的是,有了Clayton Donely的LDAP patch for Cyrus,我们就可以利用postfix所使用的LDAP目录服务来进行用户认证.这样就使得我们的整个mail系统除了可扩展性好外,还有轻便性,因为不需要做多份password的拷贝.毕竟这也是LDAP的设计目的之一.
最后,我们需要的是一个采用DNS循环解析的web/mail系统结构.在LDAP目录服务的基础上进行邮件的转发和从相应的后台邮件服务器上检索邮件,同时也利用LDAP目录服务进行用户认证. 由于LDAP的可复制性,在这个系统结构中,我们就可以利用多台LDAP来进行互相备份(假设这些服务器间都是高速连接的),如果系统结构中一台或者某几台LDAP服务器down掉后,其他的LDAP服务器能够及时提供后备服务,不影响整个mail系统的正常运行.
1.2 假设
这份文档中提到了三种服务器:web服务器、imap服务器和LDAP服务器.这些服务可以安装在不同的机器上(比如,23台web服务器,5台LDAP服务器,10台imap服务器),或者是单台机器上.假设你了解在Unix或者Linux环境下进行源代码软件安装的知识.
1.3 需要用到的软件
下面是在这份文档中要用到的软件列表.
Apache 1.3.6
PHP 3.0.12 (需要把IMAP和LDAP编译进去)
OpenLDAP 1.2
Cyrus 1.5.19 (注意: 不要用1.6版本)
postfix 19990627
pwcheck_ldap patch for cyrus 1.5
IMP (2.0.4, 2.0.10, 2.1.3-dev也测试过)
UW IMAP (提供c-client库)
注意: cyrys 1.6使用了一种新的认证方式,名为SASL.pwcheck_ldap这个补丁没有针对这种认证方式进行开发.有人说一个针对SASL的LDAP补丁程序已经在开发了,但那个补丁什么时候能够应用,现在讨论这个问题是没有意义的.
1.4 特别注意
这份文档中提出的解决方案中有一点还没有能够做到高可扩展性,那就是SQL server.IMP使用SQL server来保存session数据、邮箱配置和地址簿.IMP的作者现在在设计一种让SQL Server也能够做到容易扩展的方法.
2. 软件安装
2.1 Web服务
在web服务器上,你需要安装Apache, PHP, postfix, OpenLDAP, UW IMAP, 和 IMP.
安装Apache和PHP是很快的,安装的具体步骤在PHP的安装文档中有说明.你必须把LDAP和IMAP 的支持模块编译到PHP中.
按照postfix附带的文档来安装postfix,特别是LDAP_README这个说明文件.
2.2 LDAP服务
在LDAP服务器上,你需要安装OpenLDAP,而且需要确定一个root dn(比如:cn=root,dc=rayesmail,dc=com)并且把它添加到LDAP的目录中.(译者注:在slapd.conf中指定)
2.3 IMAP服务
在IMAP服务器上,你需要安装LDAP, postfix, Cyrus, 和专为cyrus开发的pwcheck_ldap补丁程序. 按照postfix的文档安装支持LDAP的postfix. 按照Cyrus的文档来安装Cyrus和按照pwcheck_ldap的文档来添加pwdcheck_ldap.c.不要忘记了要更改pwcheck_ldap.c文件中的设置使得与你的LDAP目录服务器主机和base dn(译者注:目录的一部分,比如说是o=mailgroup,dc=rayesmail,dc=com)相符.最后,需要在pwcheck_ldap.c中添加下面的一行:
#include
如果你是使用Linux来作为IMAP服务器,你可能需要在pwcheck_ldap.c中做一些语法更正(我现在忘记了哪是正确的),以保证正常编译.使用下面的命令来配置cyrus:
./configure --with-login=unix_pwcheck --with-pwcheck=ldap
在pwcheck_ldap的文档中漏掉了--with-login这个配置参数.编译,然后按照cyrus的文档来安装.
3. 服务配置
3.1 LDAP服务
除了你用到的其他属性,每一个mail用户在LDAP目录中的目录项必须要有下面的属性(假设你的basedn是 o=someorg,c=US):
dn: uid=someuser, o=someorg, c=us
uid: someuser
userpassword: somepassword
maildrop:
mailacceptinggeneralid: someuser
(你也可以使用别名,如下所示)
mailacceptinggeneralid: somealias
同时,你需要为cyrus指定一个具有管理员权限的帐号.除非你在imap服务器上配置cyrus,否则你没有必要担心这个问题.但是你心里要清楚这一点.另外一点就是不要指定一个已经存在的帐号来作为管理员,问题可能会 出现安全漏洞或者造成该用户无法收邮件.
3.2 imap服务
配置imap服务器上的postfix,使得它使用LDAP目录来作为它的别名映射.配置的说明可以在 postfix文档中的LDAP_README文件中找到.Cyrus的安装说明已经包含在它的软件包里面.同时,不要忘了使pwcheck生效和在imap.conf中添加你的管理员帐号.
3.3 web服务
在这一步中,要把web服务器配置成收发邮件的终端.配置postfix,使得它使用LDAP目录来作为它的别名数据库.postfix所做的工作就是在LDAP目录中检索对应邮件用户目录项的maildrop属性值,并且把邮件转发到maildrop属性值所指定的邮件地址中,因此在maildrop属性中必须指定完整的邮件服务器名称.
你可能有700,000个用户分布到不同的服务器上.发送给的电子邮件将转发到maildrop地址,而发送给的电子邮件将转发到上.另外,maildrop属性也可以指定一个其他的转发地址.比如说user302的maildrop属性值为,那么发送给user302的电子邮件就会转发到这个邮件地址中.
按照IMP的文档把IMP配置好,然后做下面的更改工作:
在config/defaults.php3添加下面几行:
/* LDAP/IMAP Server Default */
$default->LDAP_server = ldap.dom.ain;
$default->LDAP_dn = o=someorg,c=US;
$default->LDAP_search_field = uid;
$default->ldap_choose_server = true;
对mailbox.php3打一个下面的补丁:
Index: mailbox.php3
===================================================================
RCS file: /home/cvs/imp/mailbox.php3,v
retrieving revision 2.29
diff -c -r2.29 mailbox.php3
*** mailbox.php3 1999/07/29 07:20:00 2.29
--- mailbox.php3 1999/08/04 18:04:10
***************
*** 29,34 ****
--- 29,51 ----
require ./lib/mimetypes.lib;
require ./config/defaults.php3;
+ /************LDAP**************/
+
+ if ($default->ldap_choose_server) {
+ $ldapconnect = ldap_connect($default->LDAP_server);
+ if ($ldapconnect) {
+ print("YES!
");
+ $ldapbind = ldap_bind($ldapconnect);
+ $ldapsearch = ldap_search($ldapconnect, $default->LDAP_dn,
+ $default->LDAP_search_field."=".$imapuser, array("maildrop"));
+ $ldapget = ldap_get_entries($ldapconnect, $ldapsearch);
+ $ldapspl = explode("@", $ldapget[0]["maildrop"][0]);
+ $server = $ldapspl[1];
+ $port = $default->port;
+ }
+ }
+ /**********end ldap************/
+
+
/* Html styles configuration */
require ./config/html.php3;
/* Mailbox configuration */
这些做完后,你已经有了高可扩展性的web mail解决方案了.
注意: 在1999年8月5日后,IMP的开发版本已经包括了这些补丁,因此上面的这些修改就没有必要进行了.
4. 其他
4.1 添加用户
下面是一段程序,可以用来在LDAP目录中添加一个用户和在cyrus中添加一个mailbox.这是为单个imap服务器设计的,但可以很容易地改变成为应用多台服务器的方式.
注意:因为还存在一个BUG,所以没有能够可靠地支持encrypted密码,现在是用明文密码来代替.
文章来源于领测软件测试网 https://www.ltesting.net/