QMAIL LDAP HOWTO

QMAIL LDAP HOWTO


本HOWTO詳細完整地介紹瞭如何用qmail和openldap構建一個高性能的、高可用性的、大容量的、可分佈式的郵件系統。
由於整套系統對初涉及此領域的朋友來說是非常複雜的,涉及到了許多方面的相關知識,同時由於每人的系統的差異性,所以需要讀者有比較紮實的至少以下幾個方面的知識:
基本的網絡知識
tcp/ip協議族的幾個成員:smtp、pop3、http
Linux基本操作知識
*nix的知識,本HOWTO是基於Redhat Linux 7.1完成的,同時經過測試的OS有FreeBSD4.3、FreeBSD4.4、RH6.1、RH6.2,同時我認爲本HOWTO完全可以應用於其它的Unix和類Unix系統上
qmail知識
qmail是本系統的MTA(Message Transfer Agent 郵件傳輸代理)
openldap知識
openldap是本系統的LDAP服務器,用於存放用戶信息和進行用戶驗證

--------------------------------------------------------------------------------

目錄

本HOWTO的最新版本
簡要介紹和本HOWTO的約定
2.1 簡介
2.2 約定
  2.2.1 域名
  2.2.2 關鍵用戶
  2.2.3 uid和gid
  2.2.4 搜索路徑
  2.2.5 軟件需求
  2.2.6 硬盤和分區
  2.2.7 命令行格式
其它可用資源
關於qmail-ldap系統的一些整體常識
4.1 qmail
4.2 openldap
4.3 qmail-ldap-patch
4.4 ucspi-tcp
4.5 daemontools
4.6 sqwebmail
4.7 phpQLAdmin
4.8 EnderUNIX QLDAPAdmin
關於LDAP的配置方法
5.1 關於openldap
5.2 關於openldap的schema

安裝過程
6.1 準備系統
 6.1.1 安裝Linux
 6.1.2 準備安裝目錄和用戶
 6.1.3 設定目錄權限
6.2 解壓軟件包和打qmail的ldap patch
6.3 編輯Makefile
6.4 編譯安裝
6.5 配置openldap
6.6 配置qmail
 6.6.1 基本~control/配置文件
 6.6.2 創建自動建立Maildir的文件
 6.6.3 qmail啓動文件
6.7 安裝ucspi-tcp-0.88
6.8 安裝daemontools-0.76
6.9 創建qmail、smtp和pop3服務的啓動腳本
6.10 添加郵件用戶和測試系統
關於qmail-ldap系統的程序
7.1. qmail-queue
7.2. qmail-send
7.3. qmail-lspawn
7.4. qmail-local
7.5. qmail-rspawn
7.6. qmail-remote
7.7. qmail-inject
7.8. qmail-smtpd
7.9. qmail-qmqpd
7.10. qmail-popup
7.11. qmail-pop3d
7.12. auth_pop
7.13. auth_imap
7.14. qmail-ldaplookup
7.15. sendmail
高級服務配置實例
8.1. 多域名支持
8.2. imap 服務
8.3. webmail 系統
其它的附加patch
9.1 SMTP AUTH
9.2 qmail-ldap-control
9.3 RBL Tagging
cluster(分佈式)
10.1 分佈郵件服務器的原理
10.2 分佈式郵件服務器的實現方式
10.3 可能產生的問題
一般問題
11.1 共享庫問題
11.2 權限問題
11.3 不能連接LDAP服務器問題
致謝


本HOWTO的最新版本
 本Howto的最新可用版本可從http://qldap.126.com處獲得。注:上面的網址是不可用的,我沒有任何計劃再發布新的版本了(2003.7.31)!


簡要介紹和本HOWTO的約定
2.1 簡介
  本Howto只簡要地介紹瞭如何在一個Linux系統中安裝qmail+ldap,不涉及qmail和openldap的原理方面的知識,因爲它們每一個都可以寫一本書的,本Howto只在關鍵和容易出現問題的地方做了一下說明。
2.2 約定
 本Howto爲了方便做以下約定:
 2.2.1 域名:
   對郵件系統來說域名是至關重要的域名使用iwebmail.net,DNS已經做好解析,IP地址是61.156.28.35;本Howto完全支持多域名。
 2.2.2 關鍵用戶:
   由於權限問題,整個系統中使用ldap做爲運行openldap,用vmail作爲擁有用戶Maildir的用戶;
 2.2.3 uid和gid:
   本系統中所有用到的用戶uid和gid都在添加用戶時指定;
 2.2.4 搜索路徑:
   我的系統設置了搜索路徑所以我直接用useradd、tcpserver等,一般的系統需要使用/usr/sbin/useradd、/usr/local/bin/tcpserver等來寫,也就是說要加上全路徑。
 2.2.5 軟件需求:
  操作系統使用redhat Linux 7.1完全安裝;
  qmail使用qmail-1.03.tar.gz;
  openldap使用redhat7.2自帶的openldap-2.0.7;
  qmail-ldap patch使用最新的qmail-ldap-1.03-20011001a.patch.gz;
  ucspi-tcp使用ucspi-tcp-0.88.tar.gz;
  daemontools使用daemontools-0.76.tar.gz;
  phpQLAdmin使用phpQLAdmin-1.1.tar.gz;
  EnderUNIX QLDAPAdmin使用qldapadmin-0.40-BETA.tar.gz。
 2.2.6 硬盤及分區的建議:
  如果做一個互聯網的大容量郵件服務器,至少要用SCSI硬盤,推薦使用RAID,以提高可用性和性能。
  建議Linux的/、/boot、/usr、/home、/var、/tmp、/vmail進行單獨分區,全部採用ext3日誌分區格式。
  每一個分區都要分配足夠的空間,建議值:
  / 2G
  /boot 100M
  /usr 4.5G
  /home 4G
  /var 4G
  /tmp 2G
  SWAP分區看實際情況,一般分內存的兩倍
  /data 4G 此分區存放openldap的數據,應根據郵件服務器的容量來確定大小,做分佈式系統時可以使用專門的LDAP服務器來實現,不用此分區,在第10小節中詳細介紹。
  /vmail >=36G 此分區存放用戶信件,所以多多益善,如果做分佈式系統時可以使用專門的存儲服務器和NFS來實現,可以不分區,在第10小節中詳細介紹。
 2.2.7 命令行格式:
  本Howto的命令行全部以$或#開頭,換句話說,只要是以$或#號開頭的行就是命令行,$開頭的是以普通用戶執行的,#開頭的是以root用戶執行的。


其它可用資源
書籍:
關於qmail可以看《qmail實用技術指南》清華大學出版社出版,Linuxforum上推薦過,寫的不錯的。
關於openldap到目前爲止還沒有發現好的中文書籍,只好看http://www.openldap.org了。:(
網站:
http://cr.yp.to/qmail.html
qmail的老家,當然值得看;
http://www.openldap.org
openldap的老家,上面有許多關於ldap的資料;
http://www.nrg4u.com/qmail/QLDAPINSTALL
qmail-ldap的官方安裝文檔;
http://www.lifewithqmail.org/ldap
號稱qmail聖經的lifewithqmail的qmail-ldap文檔;
http://www.linuxforum.net/doc/webmail.html
這是我所見的國內最早的qmail-ldap的文檔(本人見識淺薄),也是我的qmail-ldap啓蒙文章,本人在看了這篇文章後,才明白做一個可分佈式的基於qmail的郵件系統的整體架構的;
http://www.linuxforum.net/doc/ldap-qmail.html
LDAP應用概述與qmail+LDAP安裝配置
http://www.linuxaid.com.cn/solution/showsol.jsp?i=290
Qmail+LDAP安裝配置實例
http://www.linuxforum.net/doc/qmail-shangyh.html
分佈式的Qmail郵件系統
http://phpx.hn.org/show.php?d=faqos&i=14
ldap+qmail+postaci 安裝, 用戶管理
http://go1.163.com/linuxmail/
hleil(lhl)的qmail+vpopmail+mysql+sqwebmail的Howto,雖然與ldap無關,但是個人認爲是國內最好的qmail+vpopmail+mysql文檔,看一下對提高對整個系統的認識是非常有好處的。


關於qmail-ldap系統的一些整體常識
4.1 qmail
  qmail是可以完全替代Sendmail-binmail體系的新一代UNIX郵件系統,它是一個基於UNIX操作系統的Internet郵件傳輸代理(Internet Mail Transfer Agent 簡稱MTA)。它採用標準的簡單郵件傳輸協議(Simple Mail Transfer Protocol 簡稱SMTP)與Internet上其他MTA交換信息。爲了解決用戶郵件存儲問題,Qmail提出了Maildir存儲方式,每個郵件作爲單獨的一個文件保存在用戶個人的郵件目錄下,這就避免了加鎖。同時,Qmail支持虛擬域(Virtual Domain)和虛擬用戶(Virtual User),使郵件系統的用戶獨立於UNIX系統用戶。當前在國內許多流行的免費電子郵件系統都是使用的基於Qmail作爲基本服務器軟件,採用NFS網絡文件系統作爲用戶郵件存儲空間,使用Maildir作爲郵件存儲格式,提供多級目錄以支持大規模和超大規模的用戶數。
qmail的特點:
  安全----Qmail將Mail處理過程分爲多個過程,盡力避免用root用戶運行.同時Qmail禁止對特權用戶(root,deamon等)直接發信.
 可靠----Qmail的直接投遞保證Email在投遞過程中不會丟失.Qmail同時支持新的更可靠的信箱格式Maildir,保證系統在突然崩潰情況下不至破壞整個信箱.
 高效----在運行於奔騰的BSD/OS上,Qmail每天可以輕鬆的投遞200000封信件.
 簡單----Qmail要比其他的Internet Mail系統小得多.Qmail通過統一的向前機制完成forwarding,alias和maillist等功能,Qmail使用簡單高效隊列來處理投遞.Qmail-smtpd可以由inetd啓動,節省了一定資源.
4.2 openldap
  LDAP的英文全稱是Lightweight Directory Access Protocol,一般都簡稱爲LDAP。它是基於X.500標準的,但是簡單多了並且可以根據需要定製。與X.500不同,LDAP支持TCP/IP,這對訪問Internet是必須的。LDAP的核心規範在RFC中都有定義,所有與LDAP相關的RFC都可以在LDAPman RFC網頁中找到。現在LDAP技術不僅發展得很快而且也是激動人心的。在企業範圍內實現LDAP可以讓運行在幾乎所有計算機平臺上的所有的應用程序從LDAP目錄中獲取信息。LDAP目錄中可以存儲各種類型的數據:電子郵件地址、郵件路由信息、人力資源數據、公用密匙、聯繫人列表,等等。通過把LDAP目錄作爲系統集成中的一個重要環節,可以簡化員工在企業內部查詢信息的步驟,甚至連主要的數據源都可以放在任何地方。
  LDAP協議是跨平臺的和標準的協議,因此應用程序就不用爲LDAP目錄放在什麼樣的服務器上操心了。實際上,LDAP得到了業界的廣泛認可,因爲它是Internet的標準。產商都很願意在產品中加入對LDAP的支持,因爲他們根本不用考慮另一端(客戶端或服務端)是怎麼樣的。LDAP服務器可以是任何一個開發源代碼或商用的LDAP目錄服務器(或者還可能是具有LDAP界面的關係型數據庫),因爲可以用同樣的協議、客戶端連接軟件包和查詢命令與LDAP服務器進行交互。與LDAP不同的是,如果軟件產商想在軟件產品中集成對DBMS的支持,那麼通常都要對每一個數據庫服務器單獨定製。不象很多商用的關係型數據庫,你不必爲LDAP的每一個客戶端連接或許可協議付費,大多數的LDAP服務器安裝起來很簡單,也容易維護和優化。
  openldap是一個開放源代碼的LDAP項目,我們完全可以儘量使用開源軟件達到最佳的整體應用效果!
4.3 qmail-ldap-patch
  qmail-ldap-patch簡單說來是一個qmail的patch,是把qmail和LDAP服務器整合起來的粘合劑。
4.4 ucspi-tcp
  ucspi-tcp是djb寫的一個基於TCP協議的UNIX客戶端/服務器程序接口;它可以爲服務器/客戶端定義非常詳細的環境變量。
  ucspi-tcp有以下三個最主要的程序:
  tcpserver
可以代替inetd/xinetd來對應用程序提供服務,不同的是一個tcpserver只能提供一個服務。
  tcprules
  編譯控制規則並生成cdb數據庫文件。
  tcpclient
  一個客戶程序助手,功能是與一個遠程服務器建立網絡連接,並把連接傳給另外一個應用程序。
4.5 daemontools
  由於運行一個qmail服務器需要管理服務程序,Daemontools就是一個爲了方便監控和管理服務的程序包。
  有以下幾個主要程序:
  supervise是daemontools的核心程序,用來監控以後臺進程運行的程序。如果一個進程死掉了,supervise將試圖重新啓動它。
  svscan程序可以用來使用一條命令啓動多個服務,而不必發出多個supervise命令。
  svc程序是對進程進行控制的程序。可以停止、暫停、繼續、掛起進程。
  multilog是一個可以代替logger(創建日誌的一個Unix程序)程序的替代品。作者說,它比logger更安全,效率更高。
4.6 sqwebmail
  sqwebmail是一個C語言寫的高可用性的郵件WEB端,只是界面不夠漂亮,不過功能強大,讀者如果有較好的C語言定製能力的話,完全可以改寫出來一個功能強大、界面美觀、性能優異的基於qmail-ldap的WEBMAIL系統。
4.7 phpQLAdmin
  phpQLAdmin是一個PHP語言寫的基於瀏覽器的qmail-ldap管理工具,需要qmail-ldap-control支持。
4.8 EnderUNIX QLDAPAdmin
  EnderUNIX QLDAPAdmin是一個命令行的qmail-ldap管理工具。


關於LDAP的配置方法
5.1 關於openldap
OpenLDAP是一套基於LDAP(輕量目錄訪問協議)服務器工具包。
包括的工具有:
slapd - 獨立的LDAP服務器軟件
slurpd - 獨立的LDAP複製服務器軟件
LDAP協議庫函數
工具包
客戶端軟件

因爲我們的目的是使用開放源代碼軟件來做一個大容量的MAIL系統,所以我們選擇openldap,其實完全可以使用netscape的directory server或Oracle的ldap服務器,理論上性能要比openldap好,不過我們沒有進行專業的測試,無法確定。不過,無論如何使用openldap只要cluster,系統支持數百萬用戶是沒有問題的。
5.2 關於openldap的schema
要讓qmail能和openldap服務器共同整合服務,必須對qmail、openldap進行專門配置。對於openldap來說,1.x版和2.x版是不一樣的。我們只討論2.x版的配置。
編輯/etc/openldap/slapd.conf文件,在最後一個include後加入以下行:
include /etc/openldap/schema/qmail.schema
詳細過程看第6節。


安裝過程
6.1 準備系統
 6.1.1 安裝Linux:
  完全安裝Redhat linux 7.2。
 6.1.2 準備安裝目錄和用戶
  創建目錄
  #mkdir /var/qmail
  #mkdir /var/backup
  添加qmail用戶:
  #groupadd -g 1100 vmail
  #useradd -u 1100 -g vmail vmail
  #groupadd -g 1101 nofiles
  #useradd -u 1101 -g nofiles -d /var/qmail/alias alias
  #useradd -u 1102 -g nofiles -d /var/qmail qmaild
  #useradd -u 1103 -g nofiles -d /var/qmail qmaill
  #useradd -u 1104 -g nofiles -d /var/qmail qmailp
  #groupadd -g 1102 qmail
  #useradd -u 1105 -g qmail -d /var/qmail qmailq
  #useradd -u 1106 -g qmail -d /var/qmail qmailr
  #useradd -u 1107 -g qmail -d /var/qmail qmails
 6.1.3 設定目錄權限:
  #chmod -R 700 /vmail
  #chown -R vmail:vmail /vmail
  #chmod -R 700 /data
  #chown -R ldap:ldap /data
6.2 解壓軟件包和打qmail的ldap patch
 #cd /home/wind '到主目錄,已經把所有需要的軟件包傳到此處了。
 #tar zxvf qmail-1.03.tar.gz
 #gunzip qmail-ldap-1.03-20011001a.patch.gz
 #cd qmail-1.03
 #patch -p1 < ../qmail-ldap-1.03-20011001a.patch
6.3 編輯Makefile
 #vi Makefile
 編輯Makefile文件,修改如下:
 修改"#LDAPFLAGS=-DQLDAP_CLUSTER"成"LDAPFLAGS=-DQLDAP_CLUSTER -DCLEARTEXTPASSWD";
 修改"LDAPLIBS=-L/usr/local/lib -lldap -llber"成"LDAPLIBS=-L/usr/lib -lldap -llber";
 修改"LDAPINCLUDES=-I/usr/local/include"成"LDAPINCLUDES=-I/usr/include";
 修改"#TLSON=-DTLS",去掉前面的#;
 修改"#TLSINCLUDES=-I/usr/local/include"成"TLSINCLUDES=-I/usr/include";
 修改"#TLSLIBS=-L/usr/local/lib -lssl -lcrypto"成"TLSLIBS=-L/usr/lib -lssl -lcrypto";
 修改"#OPENSSLBIN=/usr/local/bin/openssl"成"OPENSSLBIN=/usr/bin/openssl";
 修改"#MDIRMAKE=-DAUTOMAILDIRMAKE"成"MDIRMAKE=-DAUTOMAILDIRMAKE";
 修改"#HDIRMAKE=-DAUTOHOMEDIRMAKE"成"HDIRMAKE=-DAUTOHOMEDIRMAKE";
 修改"BACKUPPATH=/backup/qmail-backup/qmail-ldap.`date "+%Y%m%d-%H%M"`.tar"成"BACKUPPATH=/var/backup/qmail-ldap.`date "+%Y%m%d-%H%M"`.tar";
6.4 編譯安裝
 #make setup check
6.5 配置openldap並啓動openldap
 #cp /home/wind/qmail-1.03/qmail.schema /etc/openldap/schema/
 #vi /etc/openldap/slapd.conf
 在最後一個include後加入這一行:include /etc/openldap/schema/qmail.schema;
 修改suffix "dc=my-domain,dc=com"成suffix "dc=iwebmail.net";
 修改rootdn "cn=Manager,dc=my-domain,dc=com"成rootdn "cn=root,dc=iwebmail.net";
 修改# rootpw secret成rootpw password;
 修改directory /var/lib/ldap成directory /data;
 加入以下行:
access to *
by self read
by self write
by dn="cn=root,dc=iwebmail.net" write
by dn="cn=root,dc=iwebmail.net" read
by * none
 把index那兩行換成:
index objectClass eq
index mail pres,eq,sub
index mailAlternateAddress eq
index uid eq
index cn pres,eq,sub
 然後保存退出。
 #/etc/init.d/ldap start
 #netstat -na | grep LIST
 看有沒有在監聽389端口,有的話就說明LDAP服務正常啓動了。
6.6 配置qmail
 6.6.1 基本~control配置文件
 #cd /var/qmail/control
 #echo > badmailfrom
 #echo > badrcptto
 #echo master > bouncefrom
 #echo 5120 > bouncemaxbytes
 #echo 40 > concurrencylocal
 #echo 40 > concurrencyremote
 #echo '如有任何問題請聯繫我們,感謝使用iWebMail郵件系統,http://www.iwebmail.net' > custombouncetext
 #echo 5242880 > databytes
 #echo 'iwebmail.net'> defaultdomain
 #echo /var/qmail/bin/createhomedir > dirmaker
 #echo 'dc=iwebmail.net'> ldapbasedn
 #echo 0 > ldapcluster
 #echo ldaponly > ldapdefaultdotmode
 #echo '10485760S,500C'> ldapdefaultquota
 #echo 1100 > ldapgid
 #echo 0 > ldaplocaldelivery
 #echo 'cn=root,dc=iwebmail.net'> ldaplogin
 #echo '/vmail'> ldapmessagestore
 #echo '*' > ldapobjectclass
 #echo 'password'> ldappassword
 #echo 0 > ldaprebind
 #echo '127.0.0.1'> ldapserver
 #echo 60 > ldaptimeout
 #echo 1100 > ldapuid
 #echo 'iwebmail.net'> locals
 #echo 10 > maxrcptcount
 #echo 'iwebmail.net'> me
 #echo 'iwebmail.net' > plusdomain
 #echo 21600 > queuelifetime
 #echo '您的硬盤空間已滿,請儘快清理您的信件。' > quotawarning
 #echo 'iwebmail.net' > rcpthosts
 #echo 'iWebMail System 2.0' > smtpgreeting
 #echo 5 > tarpitcount
 #echo 5 > tarpitdelay
 #echo 60 > timeoutconnect
 #echo 120 > timeoutremote
 #echo 120 > timeoutsmtpd
 #cd ~alias
 #touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
 6.6.2 創建自動建立Maildir的文件
 #echo '#!/bin/sh' > /var/qmail/bin/createhomedir
 #echo 'mkdir -m 700 -p $1' >> /var/qmail/bin/createhomedir
 #chmod +x /var/qmail/bin/createhomedir
 6.6.3 qmail啓動文件
 #cp /var/qmail/boot/home /var/qmail/rc
 #vi /var/qmail/rc
 修改"qmail-start ./Mailbox splogger qmail"成"qmail-start ./Maildir/"
 #chmod +x /var/qmail/rc
 6.6.4 創建relay規則文件/etc/tcp.smtp
 #echo '127.0.0.1:allow,RELAYCLIENT=""' > /etc/tcp.smtp
 #echo '61.156.28.35:allow,RELAYCILENT=""' >> /etc/tcp.smtp
 #echo '' > /etc/tcp.pop3
6.7 安裝ucspi-tcp-0.88
 #cd /home/wind
 #tar zxvf ucspi-tcp-0.88.tar.gz
 #cd ucspi-tcp-0.88
 #make
 #make setup check
6.8 安裝daemontools-0.76
 #mkdir -p /package
 #chmod 1755 /package
 #cd /package
 #cp /home/wind/daemontools-0.76.tar.gz ./
 #tar zxvf daemontools-0.76.tar.gz
 #cd admin/daemontools-0.76
 #package/install
6.9 創建qmail-send、smtp和pop3服務的啓動腳本
 #tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
 #tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp < /etc/tcp.pop3
 #chmod 644 /etc/tcp.smtp.cdb
 #chmod 644 /etc/tcp.pop3.cdb
 #mkdir /var/qmail/supervise
 #mkdir /var/qmail/supervise/qmail-send
 #mkdir /var/qmail/supervise/qmail-smtpd
 #mkdir /var/qmail/supervise/qmail-pop3d
 #chmod +t /var/qmail/supervise/qmail-send
 #chmod +t /var/qmail/supervise/qmail-smtpd
 #chmod +t /var/qmail/supervise/qmail-pop3d
 #mkdir /var/qmail/supervise/qmail-send/log
 #mkdir /var/qmail/supervise/qmail-smtpd/log
 #mkdir /var/qmail/supervise/qmail-pop3d/log
 #vi /var/qmail/supervise/qmail-send/run
內容如下:
#!/bin/sh
exec /var/qmail/rc
 #vi /var/qmail/supervise/qmail-smtpd/run
內容如下:
#!/bin/sh
# /usr/local/bin/softlimit -m 2048000 /
exec tcpserver -H -R -v -c 150 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
 #vi /var/qmail/supervise/qmail-pop3d/run
內容如下:
#!/bin/sh
# /usr/local/bin/softlimit -m 2048000 /
exec tcpserver -H -R -v -c 150 -x /etc/tcp.pop3.cdb 0 pop3 /var/qmail/bin/qmail-popup iwebmail.net /
/var/qmail/bin/auth_pop /var/qmail/bin/qmail-pop3d Maildir 2>&1
 #vi /var/qmail/supervise/qmail-send/log/run
內容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t '+*' s102400000 n7 /
/var/log/qmail/qmail-send 2>&1
 #vi /var/qmail/supervise/qmail-smtpd/log/run
內容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t '+*' s102400000 n7 /
/var/log/qmail/qmail-smtpd 2>&1
 #vi /var/qmail/supervise/qmail-pop3d/log/run
內容如下:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t '+*' s102400000 n7 /
/var/log/qmail/qmail-pop3d 2>&1
把以上文件設置可執行權限
 #chmod 755 /var/qmail/supervise/qmail-send/run
 #chmod 755 /var/qmail/supervise/qmail-send/log/run
 #chmod 755 /var/qmail/supervise/qmail-smtpd/run
 #chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
 #chmod 755 /var/qmail/supervise/qmail-pop3d/run
 #chmod 755 /var/qmail/supervise/qmail-pop3d/log/run
創建完以上目錄和文件後用以下命令做鏈接:
 #ln -s /var/qmail/supervise/qmail-send /service/qmail-send
 #ln -s /var/qmail/supervise/qmail-smtpd /service/qmail-smtpd
 #ln -s /var/qmail/supervise/qmail-pop3d /service/qmail-pop3d

下面創建日誌目錄,這樣我們就擁有了強大的日誌記載功能:
 #mkdir /var/log/qmail
 #mkdir /var/log/qmail/qmail-send
 #mkdir /var/log/qmail/qmail-smtpd
 #mkdir /var/log/qmail/qmail-pop3d
 #chown -R qmaill:nofiles /var/log/qmail
爲了便於管理,我們使用三個啓動腳本來實現整個系統的啓動,分別負責qmail服務、smtp服務的和pop3服務的啓動、停止、重啓等
下面就是我改編的三個服務的腳本,分別是:
qmail-send、qmail-smtpd、qmail-pop3d
只要把它們分別拷貝到/etc/init.d/下就可以了,可以使用/etc/init.d/qmail-send start/stop來啓動/停止qmail-send,其它兩個服務也一樣。
這三個腳本需要supervise進程的支持,因爲在6.8節中安裝daemontools時,系統已經把啓動/service的命令加入了/etc/inittab文件的最後一行,並已經啓動了/service,所以這時候正常情況下三種服務已經全部啓動了。用ps -aux應該可以看到許多關於qmail的進程應該如下:
/bin/sh /command/svscanboot
svscan /service
readproctitle service errors: .......................................
supervise qmail-send
supervise log
supervise qmail-smtpd
qmail-send
/usr/local/bin/multilog t +* s102400000 n7 /var/log/qmail/qmail-send
tcpserver -p -H -R -c 200 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp
qmail-lspawn ./Maildir/
qmail-rspawn
qmail-clean
supervise log
supervise qmail-pop3d
supervise log
/usr/local/bin/multilog t +* s102400000 n7 /var/log/qmail/qmail-smtpd
tcpserver -H -R -v -c 200 0 pop3 /var/qmail/bin/qmail-popup mail.jnin
/usr/local/bin/multilog t +* s102400000 n7 /var/log/qmail/qmail-pop3d
用netstat -na | grep LIST應該可以看到25和110的監聽端口。

如果不正常的話,那麼就編輯/etc/inittab文件,把最後的一行註釋掉。然後
#kill -HUP 1
再分別調試/service下的三個服務。如有問題請仔細理解http://www.lifewithqmail.org/lwq.htmlhttp://cr.yp.to/daemontools.html,或者也可以不用daemontools,而直接用手動啓動服務。分別是:
#csh -cf "/var/qmail/rc &"
#tcpserver -p -H -R -c 200 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 &
#tcpserver -H -R -v -c 200 0 pop3 /var/qmail/bin/qmail-popup iwebmail.net /var/qmail/bin/auth_pop /var/qmail/bin/qmail-pop3d Maildir 2>&1 &
分別啓動qmail、smtp、pop3服務。
6.10 添加郵件用戶和測試系統
在服務器上創建一個root.ldif文件,內容如下:
dn: dc=iwebmail.net
objectClass: inetOrgPerson
sn: root
cn: root
wind.ldif內容如下:
dn: cn=wind,dc=iwebmail.net
cn: wind
sn: wind
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
deliveryMode: normal
qmailDotMode: both
mail: [email protected]
mailHost: iwebmail.net
mailMessageStore: /vmail/wind
uid: wind
accountStatus: active
userPassword: passwd

然後用下面的命令往LDAP中添加數據:
#ldapadd -x -D"cn=root,dc=iwebmail.net" -w password -f user.ldif
這樣就添加了一個wind用戶。注意:user.ldif的第一部分一個根,第二部分纔是真正的第一個用戶。再添加其它用戶時,只要建立第二個部分樣式的ldif文件就可以了。
這樣[email protected]用戶就可以進行收發電子郵件了。如果不成功的話,那麼就需要每一步進行推敲,具體哪兒出的問題需要慢慢測試,請多看各軟件包的README或INSTALL文檔。


關於qmail-ldap系統的程序
7.1. qmail-queue
qmail-queue程序用來處理來自於qmail-inject和qmail-smtpd程序的郵件消息,並將他們轉移到一個郵件隊列中等待發送,當qmail-queue處理這些消息時,它會掃描發送方和接受方地址。Qmail-queue等待如下特定格式的發送方和接受方信息的出現:發送方地址前面以一個F字符開頭,以一個NULL(空)字符結束。每一個接收方地址以一個T字符開頭,以一個NULL(空)字符結束。接收方列表的最後用一個額外的NULL(空)字符指明。按照RFC 822標準,qmail-queue程序總是把恰當的Received:頭加到郵件消息頭中。
7.2. qmail-send
一旦消息成功進入郵件隊列中,qmail-send程序將被調用來處理該消息,qmail-send檢查郵件隊列中每一個消息的狀態。在前一次郵件發送嘗試中失敗的消息被標識出來,並對它們進行判斷,看它們是處於一個暫時的還是永久的發送失敗狀態。處於暫時發送失敗狀態裏的消息將被再一次發出,而處於永久失敗狀態裏的郵件消息將被投遞給qmail-clean程序進行刪除。這樣,這些沒有發送的消息都能夠繼續轉發。qmail-send使用了qmail-lspawn和qmail-rspawn程序,任何帶有確定接收方爲本地服務器的郵件消息都被傳送給qmail-lspawn。任何帶有確定接收方爲遠程郵件服務器的郵件消息都被傳送給qmail-rspawn程序。一旦消息被地送到這兩個程序中的任何一個,qmail-send就算完成了它的任務。
7.3. qmail-lspawn
qmail-lspawn程序是用來調度本地郵件系統上的郵件投遞進程的。qmail-lsapwn命令的格式如下:
qmail-lsawpn defaultdelivery
其中defaultdelivery是用來標識投遞本地郵件系統上的郵件消息的必要的命令。
7.4. qmail-local
qmail-local是被qmail用來江消息投遞給郵件服務器上一個本地用戶的,qmail-local的命令格式如下:
qmail-local [-nN] user homedir local dash ext domain sender defaultdelivery
其中user是本地的用戶名,homedir是用戶的主目錄,local和domain是合併起來用來生成用戶郵件地址的,dash和ext是用來定義任何用戶使用的.qmail的配置文件的,sender是消息信封的發送者,defaultdelivery是任何本地用來投遞郵件消息的必要的指令。
7.5. qmail-rspawn
qmail-rspawn程序是被qmail-send調用的,它用在將消息傳遞給遠程郵件服務器上的用戶,qmail-rspawn程序試圖調度消息以便通過qmail-remote程序投遞,然後異步激活qmail-remote程序。qmail-rspawn的一個任務是爲每一個消息的接收方判斷目的郵件服務器。qmail-remote爲每一個遠程目的主機調用一次。
7.6. qmail-remote
qmail-remote程序總是把郵件消息投送給遠程目的郵件主機的。Qmail-remote命令的格式如下:
qmail-remote host sender recip [recip…]
其中,host是遠程郵件服務器的主機名,sender是發送方信封的地址,recip是在遠程主機上應該接收消息的用戶名。Qmail-remote是用了smtp協議來把郵件消息傳輸給遠程郵件主機。
7.7. qmail-inject
qmail-inject程序是把新的消息插入到郵件隊列中去的,qmail-inject命令的格式是:
qmail-inject -[nNaAhH] [-fsender] [recip…]
其中sender是傳送給qmail-queue的信封上的發送方地址,recip是該消息的接收方,下表描述了qmail-inject的選項:
-a 將消息發送給命令行上列出的全部接收方
-A 將消息發送給所有列出的接收方,如果沒有列出接收方,發送該消息給所有的消息頭裏的接收方
-h 將消息發送給所有的在消息頭裏的接收方
-H 將消息發送給所有在消息頭裏的接收方和所有在命令行上的列出者
7.8. qmail-smtpd
qmail-smtpd程序監聽來自遠程郵件服務器的網絡連接請求。並使用簡單郵件傳輸協議smtp來接收郵件消息,並將這些消息傳送給qmail-queue程序去插入到qmail郵件隊列中。
7.9. qmail-qmqpd
qmail-qmqpd程序監聽來自遠程郵件服務器的網絡連接請求。並使用簡單郵件傳輸協議qmtp來接收郵件消息。
7.10. qmail-popup
qmail-popup程序是用在於qmail-pop3d程序的連接上的。Qmail-popup程序在激活qmail-pop3d之前,驗證pop3連接的pop用戶ID和密碼。1mail-popup程序能夠使用user-pass的無格式認證或者APOP的加密認證機制。
7.11. qmail-pop3d
qmail-pop3d程序是一個pop3服務器程序的qmail版本,它允許遠程客戶端使用pop協議連接到qmail郵件服務器並閱讀他們郵箱中的消息,這個程序只能工作在qmail的Maildir郵箱格式下。
7.12. auth_pop
POP3的驗證模塊
7.13. auth_imap
IMAP的驗證模塊
7.14. qmail-ldaplookup
用戶和密碼查詢程序
7.15. sendmail
sendmail是qmail用來取代標準的sendmail程序的,因爲sendmail程序在過去已經變得非常流行,以至於大多數MUA程序都使用它來向外轉發郵件消息,通過將消息和接收方地址傳遞給sendmail程序,MUA能夠不用提供MTA代碼就能包含MTA功能。


配置實例
8.1. 多域名支持
其實qmail-ldap系統的多域名實現是很簡單的,在郵件系統中的多域環境中 ,第一個域稱爲主域 ,其它域爲虛擬域,主域和虛擬域用戶在使用上是有區別的,區別在於:主域用戶使用POP3接收郵件時用戶名只要填寫其用戶名就可以了,而虛擬域用戶則必須填寫整個郵件地址,如:一用戶wind@iwebmail爲主域用戶,則只需填寫“wind”,另一用戶[email protected]用戶名需填寫[email protected]”,除此之外沒有其它區別!
添加虛擬域用戶的方法:
如: 我們需要填加虛擬域iwebmail.com的用戶
則iwebmail.ldif文件內容如下:
dn: ou=iwebmail.com, dc=iwebmail.net
objectClass: top
objectClass: organizationalUnit
ou: iwebmail.com
description: iwebmail.com
用戶ldif文件內容如下:
dn: [email protected], ou=iwebmail.com, dc=iwebmail.net
cn: <a href="mailto:[email protected]">[email protected]</a>
sn: <a href="mailto:[email protected]">[email protected]</a>
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
deliveryMode: normal
qmailDotMode: both
mail: <a href="mailto:[email protected]">[email protected]</a>
mailHost: iwebmail.com
mailMessageStore: /vmail/iwebmail.com/wind
uid: <a href="mailto:[email protected]">[email protected]">[email protected]</a>
sn: <a href="mailto:[email protected]">[email protected]</a>
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
deliveryMode: normal
qmailDotMode: both
mail: <a href="mailto:[email protected]">[email protected]</a>
mailHost: iwebmail.com
mailMessageStore: /vmail/iwebmail.com/wind
uid: <a href="mailto:[email protected]</a>
accountStatus: active
userPassword: passwd
把這兩件文件分別導入LDAP庫就可以產生[email protected]這個用戶了!
8.2 imap 服務
8.3 webmail 系統


其它的附加patch
9.1 SMTP AUTH
增加了SMTP驗證的功能,使用方法:
在打完ldap的補丁後,patch -p1 < ../smtp-auth-xx-xx.patch
然後再編譯就可以了,此patch增加了一個程序:
auth_smtp
功能即爲SMTP啓動時的驗證模塊,/var/qmail/supervise/qmail-smtpd/run文件內容變爲:
#!/bin/sh
# /usr/local/bin/softlimit -m 2048000 /
exec tcpserver -H -R -v -c 150 -x /etc/tcp.smtp.cdb -u 1102 -g 1101 0 smtp /var/qmail/bin/qmail-smtpd /
/var/qmail/bin/auth_smtp /usr/bin/true 2>&1
9.2 qmail-ldap-control
9.3 RBL Tagging


cluster(分佈式)
10.1 分佈郵件服務器的原理
10.2 分佈式郵件服務器的實現方式
10.3 可能產生的問題


一般問題
11.1 共享庫問題
11.2 權限問題
11.3 不能連接LDAP服務器問題
本HowTo中LDAP服務器用的dc=iwebmail.net作爲BASEDN,用戶可以自己更改。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章