September 22, 2005
Extmail 0.1x 多国语言显示能力屏幕截图
Extmail 自设计时就是为了适应复杂的邮件应用环境,多语言、多字符集支持就是一个基本的特征,也是和一般的webmail软件相比较为突出的优点。
以下是几张同屏显示多种语言/字符集邮件的截图,其中浏览器的语言为中文简体*(GB2312),而邮件的标题和正文则分别是繁体中文(Big5)、韩文(Kr)、日文(Shift_jis 或ISO2022_JP)等。
截图1:收件箱,各国邮件标题列表:

从上图可以看到,不同语言的mail中,来信人,标题等都能在同一屏幕(GB2312的字符集环境下)正确显示。这里包括了最常见的CJK(Chinese/Japanese/Korea)字符集。
截图2:阅读日文邮件:

这是一封日文邮件,邮件编码是iso-2022-jp,显示完全正确。而此时浏览器的当前语言仍然是GB2312(简体中文),无需进行任何切换。
截图3:阅读繁体中文邮件:

这是一封繁体中文的邮件,发自Gmail,通过Extmail的转化,在简体中文环境下可以顺利的阅读,不需任何页面编码的切换。
截图4:阅读韩文邮件:

阅读韩文邮件同样也没有任何问题。
由于Extmail的设计能支持主流的各国语言,因此使用它能摆脱乱码的窘况,再也不需要为往来邮件的乱码烦恼了。
Posted by hzqbbc at 10:50 PM | Comments (2)
September 20, 2005
Configuration Document - Extmail配置方法
Extmail的配置较为简单,主要集中在源码包根目录中的webmail.cf文件。该文件主要包含了几个部分:
- 系统级配置参数
- 用户初始默认参数
- MySQL认证参数
- LDAP认证参数
以下将分别介绍配置参数的含义和方法:
Basic|基本配置
以下是0.13版的基本配置部分内容,不同发行版之间的配置参数可能会发生变化,因此以对应版本中的ChangeLog和INSTALL等文件中的描述的为准。注意:为方便对照,注释将直接写在下文的配置当中,所有配置参数的值不能以空格结尾,请务必留意!
# sys_config, the config file and webmail programe root # 该参数是所有参数之首,必须正确配置,它表明了webmail程序 # 所安放的绝对目录,请务必书写正确 SYS_CONFIG = /var/www/cgi-bin/extmail/ # sys_langdir, the i18n dir # 语言包的目录,必须为绝对目录,必须书写正确 SYS_LANGDIR = /var/www/cgi-bin/extmail/lang # sys_templdir, the template dir # 界面模板的目录,也为绝对目录。 SYS_TEMPLDIR = /var/www/cgi-bin/extmail/html # sys_warn, show system warning or not, # default to yes # 是否显示系统的一些警告信息?默认为空,如不确定请 # 保留默认值0 SYS_SHOW_WARN = 0 # sys_permit_noquota, permit an account without qouta? # 是否允许“无限额”配置?对于有些邮件系统配置中,没给用户 # 限制磁盘大小,如果该参数设置为1则允许这样的情况,如果设置0 # 则webmail将强加一个默认的限额(100MB) SYS_PERMIT_NOQUOTA = 1 # sys_sess_dir, the session dir # Session文件存放目录,推荐/tmp SYS_SESS_DIR = /tmp/ # sys_sess_timeout, session timeout in seccond, # default 6 hours # Session的会话超时时间,默认6小时(21600秒),必须以秒 # 为单位 SYS_SESS_TIMEOUT = 21600 # Webmail version, useful on outgoing email header # X-Mailer邮件头的信息 SYS_WEBMAIL_VER = ExtMail 0.13fcgi/cgi # sys auth type, mysql/ldap/flat # 用户登陆认证类型,目前可选的是mysql或ldap,必须全部小写 SYS_AUTH_TYPE = mysql # maildir_base, the base dir of user maildir, use # absolute path if not set. # 邮件存储的基本目录,如果用户的maildir的home目录是相对 # 目录,那么home目录的绝对路径则由: # SYS_MAILDIR_BASE + '/' + home 构成,详细请参阅所使用 # 邮件系统的文档,以及存储目录设计。 SYS_MAILDIR_BASE = /home/domains
用户初始默认参数
以下参数将为用户登陆时设置默认的参数。# sys_user_psize, user default page_size # 邮件列表中每页显示的邮件记录数,默认20 SYS_USER_PSIZE = 20 # sys_user_lang, user default language # 默认的用户语言,默认是en_US,对于中国用户,可以将该值 # 设置为zh_CN,这样新用户第一次登陆就可以看到中文 SYS_USER_LANG = en_US # sys_user_template, user default template # 默认的界面模板,目前发行包里只带了一个模板,名称是standard # 因此请保持该值不变。 SYS_USER_TEMPLATE = standard # sys_user_charset, user default charset # 默认的邮件发送字符集,该值必须与SYS_USER_LANG对应,如果 # SYS_USER_LANG设置为zh_CN,则该值应设置为gb2312 SYS_USER_CHARSET = iso-8859-1
MySQL认证参数
如果SYS_AUTH_TYPE 设置为mysql时,则该部分的参数将起作用,否则将不起作用。# if mysql, all relate paramters should prefix as SYS_MYSQL # mysql的用户名 SYS_MYSQL_USER = postfix # mysql的密码 SYS_MYSQL_PASS = postfix # mysql的数据库名 SYS_MYSQL_DB = postfix # mysql的主机名 SYS_MYSQL_HOST = localhost # table name # 存储用户帐户信息的表名 SYS_MYSQL_TABLE = mailbox # 存储用户名的字段名 SYS_MYSQL_ATTR_USERNAME = username # 存储用户密码的字段名 SYS_MYSQL_ATTR_PASSWD = password # 存储用户磁盘限额的字段名 SYS_MYSQL_ATTR_QUOTA = quota # 用户maildir主目录(home)的字段名 SYS_MYSQL_ATTR_HOME = homedir # 用户maildir的路径(绝对或相对)字段名 SYS_MYSQL_ATTR_MAILDIR = maildir
注意:
有关密码加密类型
目前MySQL认证模块只支持crypt类型的加密,因此SHA, SHA1或者MD4/MD5等加密类型还不支持。请确认这一点。
有关maildir/home字段问题
为了获得最大兼容性,Extmail被设计得可以兼容“相对路径”,“绝对路径”,以及只有“home”或只有“maildir”的情况。
LDAP认证配置
如果SYS_AUTH_TYPE 设置为ldap时,则该部分的参数将起作用,否则将不起作用。# if ldap, all relate paramters should prefix as SYS_LDAP # LDAP的base dn,具体请查阅openLDAP的手册 SYS_LDAP_BASE = dc=extmail.org # rootdn,用于程序bind操作,必须提供 SYS_LDAP_RDN = cn=Manager,dc=extmail.org # rootpw,bind操作时的密码,必须提供 SYS_LDAP_PASS = secret # ldif attributes # 存储用户的属性名 SYS_LDAP_ATTR_USERNAME = mail # 存储用户密码的属性名 SYS_LDAP_ATTR_PASSWD = userPassword # 存储用户磁盘限额的属性名 SYS_LDAP_ATTR_QUOTA = mailQuota # 存储用户home路径的属性名 SYS_LDAP_ATTR_HOME = homeDirectory # 存储用户maildir路径的属性名 SYS_LDAP_ATTR_MAILDIR = mailMessageStore
注意: 与mysql的注意基本一致。
模板修改问题
用户可以自行修改模板,具体模板里的标签在这里做简要说明,详细的请参阅HTML::Ktemplate的帮助,地址是:http://search.cpan.org/~kasper/HTML-KTemplate-1.33/KTemplate.pm1) IF ELSE 判断块
<!-- IF FOLDERS_LIST -- > hello world <!-- END FOLDERS_LIST -- >
模板引擎解析上述代码时,将会判断内存中FOLDERS_LIST变量是否为真,如果为真,则输出“hello world”,否则不输出。如果将判断块结尾替换成:
<!-- ELSE FOLDERS_LIST -- > Ooops ! <!-- END FOLDERS_LIST -- >
则在FOLDERS_LIST为假的时候输出Ooops!
2)LOOP 循环块
在webmail模板里大量使用了循环,其基本结构是:
<!-- BEGIN LOOP_A -- > This var = <%VAR1%>, That var = <%VAR2%> <!-- END LOOP_A -- >
如果循环进行2次,每次VAR1和VAR2分别解析为对应的循环代号+1和+2的话,则结果为:
This var = 2, That var = 3 This var = 3, That var = 4
3)<% %>变量替换
模板里最大量的还是具体的模板变量,其格式为<%变量名%>,其中全部大写的变量名是由应用程序中指定的数据内容,而全部小写的变量名大多数是语言包的内容。例如:
<%USERNAME%> 将被替换成test@xxx.com的形式,而<%lang_charset%>则由语言包里的lang_charset 变量所指定的内容决定。
FAQ 问题集锦
Posted by hzqbbc at 01:02 PM | Comments (2)
September 19, 2005
Installation Document - Extmail 安装文档
Pre-requisites
由于Extmail是纯perl语言编写的,而且Maildir标准只在Unix类平台上实现,因此不能在Win32平台下安装。 要安装并使用Extmail至少要满足如下的系统条件:- 操作系统(OS)
至少可以可靠工作的Unix类系统,如Linux, BSD, Solaris等。建议使用Linux或FreeBSD系统,在这些系统下,OpenSource/GNU软件运行配置成功的机会将大大提高。
- Email软件 一个支持Maildir/Maildir++的email系统,如Qmail或Postfix,或者Courier MTA,建议使用Postfix MTA。对于其他MTA,本文档暂不涉及,原则上支持Maildir的都将被支持。
- Web 服务器
一个工作正常,并至少支持CGI的web服务器,例如apache, lighttpd, thttpd等。强烈建议使用Apache,对于超大流量超大规模的ISP或特殊用户,可以考虑lighttpd+FCGI的方式,但需要对Extmail进行小量的改写以适应FCGI。
- Perl解析器
毫无疑问,没有了perl,就不能运行Extmail。为了减少麻烦和问题,请尽量使用最新的Perl解析器,建议使用Perl 5.8.0或以上版本。
- DB_File(可到CPAN下载
- Fcntl
- DBI
- Benchmark
必备Perl模块
通过如下命令校验这些模块在系统里是否有安装:
# perl -e 'use DBI'
如果DBI没有安装,则perl解析器将报错,可以到CPAN搜索下载。
如果不太熟悉命令行的,可以使用Extmail发行包里tools目录的pkg_stats.sh工具来检查模块的存在,检查结果将以彩色显示(但需要bash,如果在FreeBSD下,必须修改该脚本的第一行bash路径)。
首先进入发行包的根目录然后执行:
. ./tools/pkg_stats.sh
注意: 两个“.”号之间有空格
如果模块都没有问题,程序将打印出每个模块的检查结果,如果有个别模块找不到,也将打印出出错信息并提供一个建议的下载URL,一个可能的结果如下:
Benchmark found Carp found DB_File found DBI found Exporter found Fcntl found File::Spec found Net::LDAP not found! Try http://search.cpan.org/search?query=Net::LDAP&mode=module MIME::Base64 found MIME::QuotedPrint found POSIX found
可选Perl模块
- Net::LDAP
- BerkeleyDB
其中Net::LDAP模块在使用ldap认证时是必须安装的,同样也可以在CPAN下载。
开始进行安装
下载最新的Extmail 源码包,目前最新版本是0.13,下载的地址:http://extmail.org/cgi-bin/download.cgi
下载后,用tar命令解开源码包,并将解包后的extmail-0.13目录移动到安装的目录,例如/var/www/cgi-bin/下,
tar xfz extmail-0.13.tar.gz mv extmail-0.13 /var/www/cgi-bin/
Apache的配置
如果是新安装的Apache或Unix系统,则请增加一个虚拟主机配置,如果是在用系统,则请参考下面的虚拟主机配置进行更改。确保没有其他NameVirtual指令在httpd.conf中激活后,在httpd.conf中增加如下的内容:
NameVirtual *:80 <VirtualHost *:80> ServerName mail.example.com DocumentRoot /var/www/cgi-bin/extmail/html/ ScriptAlias /extmail/cgi/ /var/www/cgi-bin/extmail/cgi/ Alias /extmail/ /var/www/cgi-bin/extmail/html/ </VirtualHost>
保存httpd.conf,接下来请确认下一步的配置方式:
Apache + User/Group变更安装模式
该方法的最大特点是需要改变当前Apache的运行用户,即User/Group,使之和邮件存储的uid/gid一致,这样webmail才能对邮件有完全的读写权限。假设邮件的存取uid/gid是mail/mail,那么Apache运行时就以mail:mail来运行了。通过ps aux|grep httpd命令可以证实这一情况。# vi /etc/httpd/conf/httpd.conf 将User Group两条指令更改成当前邮件存储的uid/gid,例如: User mail Group mail
保存httpd.conf
这样做的主要优点是完全避免了setuid/gid的问题,但随之而来的是所有的web应用程序都将以mail/mail的uid/gid运行,包括创建的php的session文件等,某些特定软件将不能正常工作,而且也容易造成其他web程序的漏洞波及webmail甚至邮件数据本身!
Apache + Suexec 模式
有关Suexec的介绍请看这里,利用Suexec模块,可以只改变Extmail的运行Uid/gid,而不需要改变apache的主User/Group,这样的好处很明显,可以运行多种web程序,每个web程序都可以以自己的uid/gid运行,相互之间不会互相影响。要使用Suexec,首先要确定apache安装中是否编译了suexec的支持,最简单的办法是看看编译时的编译指令,或者Apache的libexec目录里是否有mod_suexec.so文件。
其次在上述的虚拟主机配置里,增加如下指令:
SuexecUserGroup vuser vgroup
保存httpd.conf后,重启Apache。
然后检查error_log或suexec的日志,如果出现Unknow Directive 或者Invalid command等错误,则说明suexec没有被安装正确或激活,请按Suexec的安装配置文档说明,重新安装并激活,本文将不再赘述。
建议使用发行版自带的Apache软件,通常都已激活suexec的支持,对于FreeBSD用户,可以安装/usr/ports/www/apache2,并在Makefile.modules里给默认的CATEGORY增加SUEXEC的标签即可,因为SUEXEC已定义好,但默认没被打开。
最后确认Suexec安装配置正确后,在上述的虚拟主机配置中增加如下信息:
SuexecUserGroup mail mail
然后将extmail中的cgi程序的拥有者和组(即uid/gid)改成mail/mail,即:
# chown -R mail.mail /var/www/cgi-bin/extmail/cgi/
Suexec 注意事项
如果使用操作系统带的Apache,Suexec有一定的限制,例如在RedHat 发行版中,Suexec的MIN_UID=500, MIN_GID=100,如果邮件系统的邮件存储uid/gid 比这个限制小则suexec拒绝执行。可能出现如下的错误:
[2005-07-21 15:50:34]: cannot run as forbidden uid (47/abook.cgi)
要获得suexec的限制,请运行:
/usr/sbin/suexec -V
例如在CentOS 4.1上的结果:
-D AP_DOC_ROOT="/var/www" -D AP_GID_MIN=100 -D AP_HTTPD_USER="apache" -D AP_LOG_EXEC="/var/log/httpd/suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=500 -D AP_USERDIR_SUFFIX="public_html"
一般的问题,多数集中在权限问题,或者uid/gid不够大等问题上。
此外,如果是从源码包安装的Apache,suexec默认没有激活,因此如果需要打开请仔细阅读Apache的suexec安装/配置文档。
配置Extmail
重新启动apache,接下进行Extmail的配置,如果没有正确配置extmail,Extmail将不能正确运行,甚至访问首页也不能成功。如下是没有正确配置webmail.cf文件导致的一个错误:Can't locate /en_US in @INC (@INC contains: /var/www/cgi-bin/extmail/ libs /etc/perl /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/ 5.8 /usr/local/lib/site_perl .) at /var/www/cgi-bin/extmail/libs/ Ext/Lang.pm line 46.
详细请参阅Extmail配置
至于其他一些问题,请务必多查看Apache的error_log和suexec.log,日志文件的名称随安装配置的不同而略有不同,详细请检查Apache的安装/配置指令及httpd.conf
基于lighttpd的安装
Posted by hzqbbc at 09:57 AM | Comments (1)
September 18, 2005
About Extmail - 关于Extmail的介绍
什么是Extmail?
Extmail 是一个以perl语言编写,面向大容量/ISP级应用,免费的高性能Webmail软件。它以GPL版权释出,设计初衷是希望设计一个适应当前高速发展的IT应用环境,满足用户多变的需求,能快速进行开发、改进和升级,适应能力强的webmail系统。Extmail还被设计成一个能够替代目前国内外一些主流webmail软件的系统,例如:SqWebMail,OpenWebmail及squirrel,Igenus等。
Extmail设计背景
流行在互联网上的Unix平台webmail软件相当多,有的功能还非常强大,但在实际的应用中,尤其是在ISP、企业邮局、办公邮件平台等要求较高的环境下,这些webmail软件就暴露了很多不足,有的安装要求高、软件包依赖多,有的没实现模板化导致修改困难,有的速度慢,有的功能太简单,有的兼容性差,有的对邮件解析的能力弱,还有大量的并不支持多语言显示。因此,为了适应严格的IT应用环境,我们迫切需要一个拥有实用的功能,便于修改,速度快而稳定,兼容性好,能适应多国邮件的webmail系统,Extmail就是在这样的需求下被设计的。
Why Perl?
为什么使用perl语言呢?因为这两年我做过多次测试,对于Maildir++的webmail系统而言,操作最多的I/O动作,以c速度最快,perl次之,而php慢了很多,有时耗费的时间是perl的10-100倍不等。其次,php不同版本之间的api变动比较大,而perl变动小,perl5以后95%以上的核心api没有大的变化,程序兼容性强。php则有一些升级的问题。
最后,c的开发速度慢,不便修改,perl兼顾了php开发速度快和c性能较好的优点。所以我计划使用perl。
Webmail 特性介绍
目前Extmail 的版本还非常低,截止本文发布时,也只有0.12版,其主要特性有:- 完整支持Maildir++标准
- 支持Index Cache速度极快 对于大型的email系统而言,邮件索引是使用率非常高,当需要支持大型邮箱时,没有索引将导致速度大幅度降低,为此extmail引入了Index Cache,将索引转化成cache,减少了大量的I/O和CPU消耗,并大幅度提高速度,对用户而言则完全透明。目前支持/部分支持Index Cache的有openWebmail和SqWebmail
这里主要包括了maildirsize文件的维护,softquota和quota warning的支持,子目录的支持等。严格按照Maildir++和Maildir标准来实现。在google上能找到的完整的maildir++实现的webmamil只有SqWebmail。OpenWebmail的maildir支持非常有限,且不规范。
- 支持巨型邮箱(超过1GB)海量文件
- 支持大附件,可随意调整限制
- 速度快,安全可靠,无suid问题
- 模板化,MVC设计
- 多字符,多语言支持
- 面向对象设计,体积小易修改
通过优化的设计和小巧的代码,extmail能够较好的应付大型邮箱,例如拥有5000封到1万封的邮箱,I/O速度远超Igenus等php的webmail,也比OpenWebmail/maildir补丁快。仅次于SqWebMail,如需要提速则可用c写相关的XS扩展以达到和c一样的性能速度!
传统的Webmail系统附件限制较严格,通常不能上载太大,例如php的webmail如果上载太大将导致php执行超时,而extmail支持几乎无限的上载时间,经过良好设计的I/O库能以低开销,支持大型附件,及高速Base64编码。目前测试版本至少上载100MB-150MB附件没任何问题。
考虑到安全可靠的因素,extmail没有使用常规的suid设计来访问Maildir,也不需要象igenus那样必须改apache运行权限来实现直接访问Maildir,而是透过Suexec来实现安全的变换运行用户。这样的设计,能避免suid带来的安全问题和改apache运行id带来的隐患及麻烦。
同时,extmail充分考虑到性能的问题,通过大量优化的短小代码和减少不必要的perl模块,并尽量不依赖任何其他第三方perl模块,能实现相当高的web访问速度。如果觉得性能还不够,可以通过mod_perl/fastcgi来大幅度提高速度。
igenus和sqiurrel等不支持真正意义的模板技术,因此修改界面基本上都需要改动php代码,而openwebmail及sqwebmail的模板设计也不甚有效,例如sqwebmail就将大量html代码嵌入c中,修改起来也必不可少的需要改c代码,重新编译,相当麻烦。
extmail使用了轻量级的Template引擎,实现了内容和数据的完全分离,代码中不包含任何html信息,最大化的降低了修改界面的难度。而且支持cache技术,便于提速。
一直以来,webmail软件对非本土字符的支持就不太好,为了能在不改动设置的前提下顺利阅读简体中文,繁体中文,日文,韩文及其他国家的文字,extmail利用utf8转化及Iconv技术,提供了同屏显示多种文字的能力。真正的解决了邮件乱码的问题。
多语言能力主要体现在利用模板引擎,配上不同语言种类的界面。
从高性能角度出发,extmail屏弃了大而全的设计思路,采取了综合面向对象和过程设计优点的方法,尽量利用perl系统函数来实现功能,不依赖其他外挂模块或CPAN上的模块,这样整个代码的维护难度低,且体积小,修改容易。
面向对象的设计利于开发人员理解整个webmail系统。Extmail的系统架构
Extmail按分层的结构设计,最底层的是处理核心CORE modules,中间是应用模块App modules,上层是应用cgi/fcgi程序及模板显示等业务逻辑。
以下是系统结构图;

详细的系统结构图介绍可以参考Webmail Bigpicture - Webmail的结构图
未来发展
从长远来看,Extmail开发队伍将紧紧以OpenSource为基础,并逐步充实Extmail,最终发展成为一个完整的邮件应用解决方案,将包括如下的主要备件:- Webmail
目前的extmail webmail日后将逐步完善成为一个既能单独工作又能与extmail协作工作的软件。
- Spam Filter
垃圾邮件,病毒邮件过滤器,这个部件将基于APF技术和软件,融合其他过滤软件的特色。
- Statistic Monitor
流量、日志分析软件,将以RRDTools、商业系统DMS的分析软件为基础,发展成为一个完善的监控软件。
- Webman admin
新开发一个能兼容mysql/ldap/flat text的帐户管理软件,并基于webmin开发相应的MTA管理软件。替换当前的postfixadmin及其他相关的web管理程序。
- Passport Auth/Manager
基于OpenID和其他单点登陆技术的单点登陆和认证系统,统一所有的web应用的登陆接口。
- ExtMail Installer
基于source或RPM/PKG的邮件解决方案安装包(软件),计划利用商业软件DMS的安装包为蓝本开发。
- 其他部件.....
但发展的路子还是很漫长的,诚挚邀请国内外的朋友一同开发,最终完成这一计划。:-)
Posted by hzqbbc at 08:47 PM | Comments (12)