开放原代码的 Qmail+Mysql+Jsp 中文电子邮局系统说明
2005-08-24 10:00 am
作者:linux宝库 (http://www.linuxmine.com)
来自:linux宝库 (http://www.linuxmine.com)
联系:linuxmine#gmail.com
前面介绍了两个国外的程序, 现在介绍一个我正在改进的系统给大家.
系统也是建立在 qmail + mysql 基础上的, WEB 部分用 JSP 和 JAVA 完
成, 包括有 WEB 管理功能. 我感觉这个系统很适合中小企业的网站使用, 一
般万人以内肯定都没什么问题, 我花了时间修复了很多系统中存在的 BUG,
目的是想发布一个可以投入正式使用的版本给大家, 当然界面美工不是我的拿
手本事, 这个只有大家自己去做了, 但是基本功能我尽量做到没有问题.
先提供文档给大家参考, 我个人网站已经在使用了大家可以去看一下地址是:
http://www.fastirc.com/mail/
user: test
pass: test
################################################################
下面是一点关于 JeticMail 的说明
首先感谢 D. J. Bernstein 完成的 qmail-1.03 和 checkpassword-0.9
JeticMail 最先由风云和青山两位华源前辈完成, 架构在 www.gbsource.com
上稳定运行了八个月. 随后由 Capitain (mail:hyzd5@263.net 负责 Java 程序)
和 dennis (mail: zuestc@263.net 系统配置) 加以改进, 增加了 POP3 收
信功能, 并做了部分优化.
JeticMail 底层使用 qmail-1.03 来做邮件服务器, 风云在其基础上做了部
分改动, 加 入了对 mysql 的支持. 同时在 checkpassword-0.9 也加入了
mysql 支持. 前端使用 jsp 来完成 webmail. 这个系统沿袭了 qmail 独特
的油箱格式 Maildir, 为了更好的服务于 webmail 在 /mail/path/Maildir
下采用了五个子目录, 分别是 dsb, rev, snt, src, tmp, 分别是垃圾箱,
收信箱, 发件箱, 草稿箱, 临时.
为了给 GNU 事业做一份贡献, 为了大家更好的学习和参考, 他们 opensource
了这个邮件系统, 并且取名为 JeticMail.
################################################################
我对 JeticMail 的改进说明
由于华源网络的倒闭这个项目没有能够继续发展下去, 我对此感到非常的可惜,
毕竟国内这样实用的好程序真的太少了. 但是自从华源网络公布这个邮件系统
以后, 到目前为止真正安装配置成功的用户实在太少了, 我觉得这是由多方面
的因素造成的, 首先也是最关键的一点就是这个系统自带的说明文档太少和太
简陋了, 其实这也是许多 GPL 项目的一个特点. 其次是原代码和自带的某些配
置文件还有脚本中存在许多的小错误, 造成了很多用户遇到无法编译或者无法
连接数据库或者无法调用 JAVA servlet 的问题. 再次是许多安装使用此系统
的朋友是一些 UNIX 新手对 UNIX 和 qmail 以及 mysql jdk 并不是很了解,
于是安装过程中会走许多的弯路以至最后无法正常使用这个系统.
因为希望这样的好程序可以有更多的朋友一起使用和改进, 并充分发扬 GPL 精
神我编写了这份安装说明文档, 并修正了到目前为止我所发现的所有程序和脚本
以及配置文件中的错误, 我将这个程序重新打包提供给需要的朋友使用, 希望
对大家的学习和生活有所帮助.
到目前为止我除了编写这个说明外所做的工作如下:
1, 对 qmail-1.03-jeticmail 的核心程序做了调整, 增加了 smtp 发信认证功
能, 同时打了两个官方网站推荐的补丁.
qmail-smtpd.c 来源 http://www.cuni.cz/~vhor/qmail/smtpauth-en.html
这个补丁要比很多文章中说的 http://www.nimh.org/ 上的好许多, 并且增
加了 auth login 的系统日志, 这样你可以查到那些用户通过 smtp auth 后
对外发信. 我在它的基础上做了对 mysql 的支持.
官方网站推荐补丁来源 http://www.qmail.org/top.html#patches
现在关于 qmail 的补丁很多, 但是我建议大家不是官方推荐使用的补丁最好
不要使用, 否则难以确保安全和稳定性能.
2, 修正了 qmail-1.03-jeticmail 和 checkpassword-0.9-jeticmail 在某些环
境下无法编译通过的问题.
3, 升级原来的 ucspi-tcp-0.84.tar.gz 到最新的 ucspi-tcp-0.88.tar.gz .
4, 修正作者提供的 resin.conf 配置文件中的一个错误.
5, 修正 getAttachment.java 中存在的错误.
6, 修正了当来信的原始信息中时间为空值时无法通过 WEBMAIL 收取邮件的问题.
7, 修正了在 WEBMAIL 中发送电子邮件时无法通过地址本导入邮件地址的问题.
8, 对一些 JSP 文件中页面部分的小错误做了一些修改和调整.
做了以上修改后系统基本可以运行投入正式使用了, 当然还是存在许多小错误的
我会在以后继续改进, 另外在争得作者同意后我会考虑和大家一起继续发展这个
项目, 推出新的版本增加更多的功能.
################################################################
JeticMail 安装说明
doc 目录下是一些说明, 主要是作者自己编写的程序的使用说明.
jsp 目录下存放的是 WEBMAIL 和 servlet .
lib 目录下是使用 WEBMAIL 所需要的 JAVA CLASS 包.
soft 目录下的东西大家一定知道是什么我就不再介绍了.
old 目录下是当初作者自己发布的那个安装包.
我在 RedHat 6.2 和 7.3 下安装了 JeticMail 都可以正常使用. 其他系统
我没有做严格测试, 这个工作将在以后继续进行.
将 jsp 和 soft 目录下的所有东西传到服务器上, 并且上传 mysql 和 jdk
的安装包到你的服务器上. mysql 建议使用 3.22.X 或者 3.23.X 因为其它
版本我还没有测试, jdk 我测试的是 1.2.2 和 1.3.1 版本, 最新的 1.4.X
我没有测试过. resin 我使用的是 1.2.10 原作者使用过 1.2.3 和 1.2.5
更高的版本我没有用过. 我有朋友在 TOMCAT 下也运行成功了这个系统, 不
过需要调整的配置可能比较多, 有时间我会写出 TOMCAT 下的配置说明.
注意: 上传文本文件要用 ASCII 方式, 上传二进制文件要用 BIN 方式.
下面是安装示例, 您可以根据实际情况有所变动.
注意: 我是按照下面方法配置的, 如果你有所改动的话需要在相应的配置文件
和程序以及数据库结构中做一些调整才能正常运行.
在安装前大家必须首先关闭目前正在使用的邮件系统, 包括 SMTP 以及
POP3 服务, 如果你本来装的是 qmail 建议将本来的系统删除, 并且需
要删除本来安装 qmail 时增加的所有用户和组.
################################################################
/htdocs/jeticmail 为你的 jsp 站点根目录.
/home/mail 为你的邮件系统用户目录的根目录.
/home/mail/attachment 为临时保存上传附件的目录.
/usr/local/mysql 为 mysql 目录.
/usr/local/resin 为 resin 目录.
/usr/local/jdk 为 jdk 目录.
/var/qmail 为 qmail 目录.
################################################################
0. # mkdir /htdocs
# mkdir /home/mail
# mkdir /home/mail/attachment
# chmod -R 777 /home/mail
# cp mysql-3.22.X.tar.gz /usr/local/src/
# cp jdk-1_2_2_X-linux-i386.tar.gz /usr/local/src/
# cp qmail-1.03-jeticmail.tar.gz /usr/local/src/
# cp checkpassword-0.9-jeticmail.tar.gz /usr/local/src/
# cp ucspi-tcp-0.88.tar.gz /usr/local/src/
# cp resin-1.2.10.tar.gz /usr/local/src/
# cp -Rf jsp /usr/local/src/
# cd /usr/local/src/
# tar -xzvf mysql-3.22.X.tar.gz
# tar -xzvf jdk-1_2_2_X-linux-i386.tar.gz
# tar -xzvf resin-1.2.10.tar.gz
1. 安装 mysql 数据库软件.
# cd /usr/local/src/mysql-3.22.X
# ./configure --prefix=/usr/local/mysql
# make
# make install
# cd /usr/local/mysql/bin
# ./mysql_db_install
# cp ../share/mysql/mysql.server ./
# chmod 711 mysql.server
# ./mysql.server start (启动 mysql 数据库)
# cd /etc/rc.d
# vi rc.local
在最后一行添加: /usr/local/mysql/bin/mysql.server start (系统启动时自动启动 mysql 数据库)
# cd init.d
# vi killall
在最后一行添加: /usr/local/mysql/bin/mysql.server stop (系统关闭时自动关闭 mysql 数据库)
# vi /etc/profile
增加路径, 在 PATH 行尾加上: /usr/local/mysql/bin:/usr/local/bin 以 ":" 间隔.
# ./mysqladmin -u root password ....
设置你的 mysql 管理员密钥.
# mysql -u root -p -h localhost
系统会提示输入密码输入你刚设置好的密码就可以进入 mysql 字符管理截面.
# mysql> grant all privileges on *.* to root@127.0.0.1 identified by 'your_password';
这一步操作一定不能少, 目的是在 mysql 中建立一个 root@127.0.0.1 的用户, 这个用户拥有对
所有数据库的操作权限, 但是不具备开设其他用户的权限. 因为 JDBC 驱动只接受 uid@127.0.0.1
这样的方式连接数据库而不接受 uid@localhost 所以你必须增加这样的一个数据库用户.
以上操作完成后在 mysql 中建立 jeticmail 数据库, 并将 jeticmail.sql 的内容导入到该数据库中.
注意: mysql 3.23.X 需要使用 mysql 用户来安装, 如果你使用这个版本的 mysql 请先在你的系统中
添加 mysql 用户, 并将 mysql 安装到的目录的所有权给 mysql 用户, 我这里就不具体介绍了.
2. 安装 jdk 环境.
# cd /usr/local/src
# mv jdk1.2.2 /usr/local/jdk
# ln -s /usr/local/jdk/jre /usr/local/jre
# vi /etc/profile (设置你的环境变量)
在 PATH 行尾加上: /usr/local/jdk/bin
加入以下几行:
CLASSPATH=/usr/local/jdk/lib/tools.jar:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:./:/usr/local/jdk/lib/tomcatjsp.jar:/usr/local/jdk/lib/mm.mysql-2.0.7-bin.jar:/usr/local/jdk/lib/jsdk23.jar
export CLASSPATH
JAVA_HOME=/usr/local/jdk
export JAVA_HOME
保存该文件后推出系统从新登陆以获得新的环境变量并将本软件包中 lib 目录下的所有文件复制到
/usr/local/jdk/lib 目录下, 然后你需要 login out 一下重新登陆系统, 这样你设置的全局环境
变量才能起效.
注意: Redhat 7.x 开始以及其他一些 *nix 系统采用了 glibc 2.2.x 的库环境, 在使用这个版本的
库环境下 jdk1.2.2 无法正常使用, 你必须安装 jdk1.3.1 或更高版本.
3. 安装 qmail 邮件传输代理程序.
# cd /usr/local/src/
# tar -xzvf qmail-1.03-jeticmail.tar.gz
# cd qmail-1.03
# vi Makefile
编辑 Makefile 文件修改其中的一行:
在 mysql 3.23.X 系统中:
MYSQL_LIBS=/usr/local/mysql/lib/mysql/libmysqlclient.a -lm -lz
在 mysql 3.22.X 系统中:
MYSQL_LIBS=/usr/local/mysql/lib/mysql/libmysqlclient.a -lm
注意: Makefile 文件中的 MYSQL_LIBS 和 MYSQL_INCLUDE 路径可能由于安装 mysql 的方式不同会不一样
你需要根据自己的实际情况做调整.
# ./install.sh yourdomainname
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# mv /usr/lib/sendmail /usr/lib/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# cp /var/qmail/boot/proc /var/qmail/rc
# vi /var/qmail/rc
将其内容改为:
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/ splogger qmail
# cd /usr/local/src/
# tar -xzvf ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88
# make
# make setup check
# cd ..
# vi tcp.smtp
内容如下:
127.0.0.1:allow,RELAYCLIENT=""
:allow
# cp tcp.smtp /etc
# cd /etc
# /usr/local/bin/tcprules tcp.smtp.cdb tcp.smtp.tmp < /etc/tcp.smtp
# cd /usr/local/src/
# tar -xzvf checkpassword-0.9-jeticmail.tar.gz
# cd checkpassword-0.9
# vi Makefile
编辑 Makefile 文件修改其中的一行:
在 mysql 3.23.X 系统中:
MYSQL_LIBS=/usr/local/mysql/lib/mysql/libmysqlclient.a -lm -lz
在 mysql 3.22.X 系统中:
MYSQL_LIBS=/usr/local/mysql/lib/mysql/libmysqlclient.a -lm
注意: Makefile 文件中的 MYSQL_LIBS 和 MYSQL_INCLUDE 路径可能由于安装 mysql 的方式不同会不一样
你需要根据自己的实际情况做调整.
# make
# make setup check
# chmod 4755 /var/qmail/bin/checkpassword
在 /var/qmail/control 里写一个文件 sqlserver 文件内容为:
server localhost
port 3306
login root
password yourpassword
db jeticmail
注释:
server Mysql 服务器的名字
port Mysql 端口
login 登陆 Mysql 的用户名
password 登陆 Mysql 的密码
db 数据库的名字
如果邮件到: user1@domain1, qmail-mysql 将在 mbox_host 和 id 字段.
# vi /bin/smtp
SMTP 启动脚本内容如下:
#!/bin/sh
/usr/local/bin/tcpserver -H -R -l 0 -t 1 -c 200 -x /etc/tcp.smtp.cdb -u 444 -g 444 0 smtp /var/qmail/bin/qmail-smtpd /var/qmail/bin/checkpassword /bin/true 2>&1 | /var/qmail/bin/splogger smtpd 3 &
# vi /bin/pop3
POP3 启动脚本内容如下:
#!/bin/sh
/usr/local/bin/tcpserver -c 200 -v 0 pop3 /var/qmail/bin/qmail-popup yourdomainname /var/qmail/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
POP3 启动脚本你需要查看一下你的 /etc/services 文件, 如果其中指定的是 pop-3 那么脚本里
也要修改成 pop-3 . 另外以上两个脚本除了 #!/bin/sh 其它部分都要写在一行里.
# csh -cf '/var/qmail/rc &' (启动 qmail 后台程序)
# /bin/smtp (启动 smtp)
# /bin/pop3 (启动 pop3)
4. 安装 resin-1.2.10 (jsp 服务器).
# mv /usr/local/src/resin-1.2.10 /usr/local/resin
# export RESIN_HOME=/usr/local/resin/
# cp /usr/local/src/resin.conf /usr/local/resin/conf/ (或者$RESIN_HOME/conf/)
注意: 请使用我配置好的 resin 的配置文件 resin.conf 如果你要自己优化配置, 请注意要取消
<multipart-form/> 这个项, 否则不能上传附件.
5. 安装 jeticmail (安装前端 jsp 界面).
# cp /usr/local/src/jsp /htdocs/jeticmail
这个命令的意思是把本软件包里的 jsp 目录下面的所有文件和子目录全部复制到 /htdocs/jeticmail 下.
注意: jsp 连接 mysql 的驱动已经打包在了 lib 目录的 mm.mysql-2.0.7-bin.jar 中所以不需要另外安装了.
我对代码分析和实际检验后发现目前的 WEBMAIL 可以使用的最高版本 mysql jdbc 驱动就是这个, 如果
你需要升级 mysql jdbc 驱动那你可能需要对 WEBMAIL 部分的代码自己做一些修改和调整才能运行.
6. 配置 jeticmail.
修改: /htdocs/jeticmail/WEB-INF/jeticmail.properties
配置好你的连接数据库用户密码等......
# /usr/local/resin/bin/httpd.sh start (启动 resin 服务器)
7. 访问 jeticmail.
启动 resin 后就可以通过 http://yourdomainname:8080 访问 jeticmail 了.
系统管理员界面地址是 http://yourdomainname:8080/admin/
初始系统管理员帐号: admin
初始系统管理员密码: 123456
你可以在 mysql 的 jeticmail 数据库中的 admin 表中修改这个密码, 对应字段是 password
但是你必须使用 mysql 自带的 password 函数生成这个密码, 一个简单的处理办法是你可以
先在 WEBMAIL 中注册一个用户输入, 当这个用户密码生效后, 你可以查看数据库将产生的密码
复制到 admin 表相应的地方.
8. 测试.
本地Mail测试:
% echo to: me | /var/qmail/bin/qmail-inject
注意: 要用你的用户名代替 me
Mail 应该立即出现在你的信箱之中 ./var/log/maillog 中应该有如下记录:
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20345 uid
666
qmail: starting delivery 1: msg 53 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 1: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
给一个不存在的本地用户发信:
%echo to: nonexistent | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20351 uid
666
qmail: starting delivery 2: msg 53 to local
nonexistent@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 2: failure: No_such_address.__#5.1.1_/
qmail: status: local 0/10 remote 0/20
qmail: bounce msg 53 qp 20357
qmail: end msg 53
qmail: new msg 54
qmail: info msg 54: bytes 743 from <> qp 20357 uid 666
qmail: starting delivery 3: msg 54 to local me@domain
qmail: status: local 1/10 remote 0/20
qmail: delivery 3: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 54
远程投递测试:
向你在其他机器上的账户发信:
% echo to: me@wherever | /var/qmail/bin/qmail-inject
qmail: new msg 53
qmail: info msg 53: bytes 246 from <me@domain> qp 20372 uid
666
qmail: starting delivery 4: msg 53 to remote me@wherever
qmail: status: local 0/10 remote 1/20
qmail: delivery 4: success: 1.2.3.4_accepted_message./...
qmail: status: local 0/10 remote 0/20
qmail: end msg 53
投递过程将在 starting delivery 和 success 中有个间断, SMTP 传送是相对较慢的.
然后去检查一下 me@wherever 是否正确收到 email.
后面还有三个测试, 分别测试本地 postmaster, 两次弹回 mail 和通过 mail 执行.
命令. 具体方法可以在 TEST.deliver 中找到.
SMTP Server测试, me 是你的用户, domain 是你的机器名.
% telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 domain ESMTP
helo dude
250 domain
mail <me@domain>
250 ok
rcpt <me@domain>
250 ok
data
354 go ahead
Subject: testing
This is a test.
.
250 ok 812345679 qp 12345
quit
测试一下 mysql 的版本:
shell # ./qmail-getpw user1 somewhere.com
user1123456778/somewhere/username
反回了用户的 id, uid, gid, home 字段的内容
如果不能找到改用户, 则返回 'qmail alias'
例如:
shell # ./qmail-getpw u1 a
alias7065534/var/qmail/alias-u1
如果你启动 mysqld 时加了 --log 选项, 可以看 mysql 的 log 文件
9. jeticmail 调试.
因为我们的 jeticmail 系统是基于 qmail-1.03 的, 所以请参考 qmail 的 man, 会受益非浅.
java 和 jsp 方面的问题请参考 resin 的日志, 或者在前台运行 resin 或者 tomcat, 查看
java 的抛出异常. 因为增加了 smtp 发信认证你需要在你的邮件客户端软件中做相应的设置才
可以使用 smtp 对外发信, 当然通过浏览器进入邮件系统, 在任何地方都可正常收发电子邮件.
################################################################
以上就是我的安装过程, 我正在自己个人网站 http://www.fastirc.com/mail/
使用这个系统有问题的朋友可以发我 EMAIL: webmaster@fastirc.com
另外需要一起交流讨论邮件系统的朋友可以加我的 QQ: 8273949
################################################################
目前还有两个 WEBMAIL 部分的 BUG 我在修复, 大家也可以看看我以上的说明
那里写的不够好和完善的, 我在最终发布这个版本前修改好!