開放原代碼的 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 我在修復, 大家也可以看看我以上的說明
那里寫的不夠好和完善的, 我在最終發布這個版本前修改好!