深入了解 Qmail的工作原理和配置文件
在文章里,我們主要是介紹qmail的工作原理和配置文件的設(shè)置。通過這一節(jié),讓我們
更好的分析問題和設(shè)施qmail。來幫助大家更好的了解和融入到Qmail
1 qmail是什么?
qmail包是在unix系統(tǒng)上的一個(gè)郵件程序。qmail程序是由dan bernstein開發(fā)出來的
為標(biāo)準(zhǔn)的unix服務(wù)器提供郵件傳輸代理的(mail transfer agent,mta)功能的,用來替代sendmail。qmail因特網(wǎng)主頁http://www.qmail.org。
2 qmail和相關(guān)的服務(wù)
qmail提供了mta功能,但是客戶要能看到自己的信件,還需要其他協(xié)議和軟件。兩種
常見的遠(yuǎn)程用戶取回他們消息的機(jī)制是郵政協(xié)議(post office protocal,pop3)和互交郵件訪問協(xié)議(interactive mail access protocol,imap)。
綜述:
qmail系統(tǒng)包括幾個(gè)可執(zhí)行程序、配置文件、qmail工具和環(huán)境變量,這些彼此互相影響,共同提供郵件服務(wù)。
3 qmail投遞郵件進(jìn)程流程
qmail系統(tǒng)中有9個(gè)核心程序,這里簡單的介紹一下。qmail-smtpd負(fù)責(zé)接收來自遠(yuǎn)程主機(jī)的郵件消息并將它們傳送給qmail-queue處理。qmail-inject程序是用來接收本地產(chǎn)生的郵件消息并傳送給qmail-queue程序。qmai-queue程序處理他們發(fā)來的郵件,移進(jìn)郵件隊(duì)列以便發(fā)送。一旦消息被成功的放在郵件隊(duì)列中,就調(diào)用qmail-send程序來處理他。qmail-send檢查郵件隊(duì)列中每一個(gè)消息狀態(tài),前一次郵件請求失敗的消息被識別,并決定它是臨時(shí)失敗還是永久的,臨時(shí)失敗會再次投遞,永久失敗將被送遞到qmail-clean程序,被刪除掉。也就是說,qmail-clean實(shí)用來清除永久失敗的的郵件消息的。
qmail-send調(diào)用了qmail-lspawn 和qmail-rspawn程序。qmail-send判斷郵件是發(fā)給誰的,發(fā)給本地的,就交給qmail-lspawn程序,再由qmail-local投送到本地郵件服務(wù)器。要是確定為遠(yuǎn)程主機(jī),就調(diào)用qmail-rspawn程序,qmail-rspawn為每一個(gè)郵件消息的接受方?jīng)Q定目的的郵件服務(wù)器,再調(diào)用qmail-remote程序發(fā)送。
2.2qmail的進(jìn)程
qmail-send
splogger qmail
qmail-lspawn
qmaiil-rspawn
qmail-clean
qmail在任何時(shí)候都要求有五個(gè)程序在后臺運(yùn)行。這些核心的程序允許qmail掃描新郵件,并將他們發(fā)送到適當(dāng)?shù)哪康牡亍?/P>
4 qmail實(shí)用工具程序
除了以上五個(gè)qmail進(jìn)程外,進(jìn)程和本地用戶在處理和傳輸消息的過程中,都還會用到幾個(gè)其他的qmail實(shí)用工具程序。如下:
bouncesaying 允許用戶將消息轉(zhuǎn)發(fā)給程序或者程序不可用時(shí)反彈回信息
condredirect 允許用戶將消息轉(zhuǎn)發(fā)給程序,然后把消息轉(zhuǎn)發(fā)到另一個(gè)地址
except 過去常用來修改一個(gè)調(diào)用程序的退出編碼
forward 將消息轉(zhuǎn)發(fā)給一個(gè)備用的郵件地址
maildir2mbox 將在maildir格式郵箱中的消息轉(zhuǎn)換到一個(gè)標(biāo)準(zhǔn)的sendmail郵箱中
maildirwatch 產(chǎn)生一個(gè)maildir格式的郵箱
maildirwatch 監(jiān)控一個(gè)用戶的郵件目錄并報(bào)告所有的新消息
preline 在將消息轉(zhuǎn)發(fā)給相關(guān)程序前預(yù)處理這些消息
qbiff 當(dāng)新消息到達(dá)后向用戶終端顯示器上寫一個(gè)通知
qmail-clean 從qmail郵件隊(duì)列中永遠(yuǎn)的移出無法到達(dá)的消息
qmail-inject 將新消息插入到qmail郵件隊(duì)列中
qmail-local 向本地郵件系統(tǒng)上的用戶投遞消息
qmail-lspawn 由qmail-send調(diào)用以便向qmail-local程序轉(zhuǎn)發(fā)消息
qmail-newmrh 用來從morercpthosts文件中創(chuàng)建qmail數(shù)據(jù)庫
qmail-newn 從一個(gè)包含系統(tǒng)用戶名和郵件名的ASCII文件表建立一個(gè)qmail用戶文件
qmail-pop3d 接受pop3連接以便讓用戶閱讀他們的郵箱
qmail-popup 用來驗(yàn)證pop3連接中的用戶ID和密碼
qmail-pw2u 將UNIX系統(tǒng)的用戶id和密碼轉(zhuǎn)換成qmail-newn能用的一個(gè)表結(jié)構(gòu)
qmail-qmtpd 接受遠(yuǎn)程主機(jī)發(fā)來的qmtp連接請求
qmail-qread 產(chǎn)生一個(gè)顯示當(dāng)前qmail郵件隊(duì)列里消息的報(bào)告
qmail-qstat 產(chǎn)生一個(gè)報(bào)告來顯示當(dāng)前處在qmail投送狀態(tài)下等待發(fā)送的消息數(shù)目
qmail-queue 將郵件消息排隊(duì)等待投送
qmail-remote 將消息投送給遠(yuǎn)程郵件用戶
qmail-rspawn 由qmail-send調(diào)用來向qmail-remote轉(zhuǎn)發(fā)消息
qmail-send 嘗試投送qmail郵件隊(duì)列里的郵件消息
qmail-showctl 顯示當(dāng)前的qmail系統(tǒng)配置情況
qmail-smtpd 接收來自遠(yuǎn)程主機(jī)的smtp連接請求
qmail-start 初始化qmail的啟動腳本
qmail-tcpok 用來清空qmail-remote中用到的tcp超時(shí)記錄表
qmail-tcpto 顯示當(dāng)前的tcp超時(shí)記錄表
qreceipt 用來會應(yīng)對要求受到進(jìn)行確認(rèn)的消息
sendmail 用來將sendmail程序的功能復(fù)制到mta程序中
splogger 將消息插入系統(tǒng)登陸程序中
tcp-env 將網(wǎng)絡(luò)連接的信息轉(zhuǎn)換成unix環(huán)境變量
每一個(gè)qmail實(shí)用工具程序都在正確的處理和投遞郵件消息中扮演不同的腳色。其中有一些只能qmail內(nèi)核程序調(diào)用,其他的就可以由qmail的系統(tǒng)管理員用來處理消息并得到統(tǒng)計(jì)信息。還有一些可以被單個(gè)普通郵件用戶來制定自己的郵件消息處理。
5 qmail環(huán)境變量
除了控制文件之外,qmail程序還能使用unix環(huán)境變量來控制他們的動作。多數(shù)的控制文件的值都能被一個(gè)相應(yīng)設(shè)定的環(huán)境變量重載。如果該環(huán)境變量沒有設(shè)定,就使用控制文件的值。qmail的環(huán)境變量是在qmail程序運(yùn)行前就被設(shè)置好的。這是由一個(gè)包裝程序完成的。常見的是tcpwrapper和tcpserver。本文就是用的tcpserver。在以后的《(四)ucspi-tcp的原理和設(shè)置》內(nèi)容中,再詳細(xì)討論。
#p#
6 qmail控制文件
這一部,對于管理好qmail,非常重要的??刂莆募莙mail配置中的中心環(huán)節(jié),它控制了qmail的操作性為。它位于/var/qmail/control目錄下。每一個(gè)文件包含一個(gè)值,這個(gè)值定義了相應(yīng)的qmail可執(zhí)行程序的變量。qmail控制文件是定義了qmail參數(shù)的ASCII文本文件。大多數(shù)控制文件要求一個(gè)單一的文本值,該值可以在一行中輸入。也有一些控制文件能包含多個(gè)值。在這種情況下,每一個(gè)值被輸入到單獨(dú)的一行中,每一行以一個(gè)標(biāo)準(zhǔn)的UNIX換行符(LF)結(jié)尾。還有一個(gè)要重點(diǎn)注意,就是控制文件的權(quán)限問題,推薦root可讀寫,其他只讀。
#chmod 644 /var/qmail/control/*
以下將逐一介紹個(gè)控制文件:
-------- badmailfrom
這個(gè)控制文件實(shí)現(xiàn)拒收郵件功能的,每一個(gè)地址遵循前面說的規(guī)則,要單獨(dú)一行。而且,不用重起qmail就能生效。
例如:
peng@96633.net -----限制一個(gè)特定的用戶
@jp.yahoo.com -----限制一臺遠(yuǎn)程主機(jī)上的所有主機(jī)上的所有用戶
@sina.com ----限制整個(gè)域中的郵件
------ bouncefrom
用來定義用戶名的,該用戶名是出現(xiàn)在那些被退回給原始發(fā)件人的消息中,一般都是永久的投遞失敗消息。Bouncefrom默認(rèn)值是MAILER-DAEMON,它通常是一個(gè)虛擬用戶名,是一個(gè)真實(shí)用戶的別名。你要是想給用戶的退信消息中用另一個(gè)名字,可以用一下命令:
# echo postmaster > /var/qmail/control/bouncefrom ---給改為postmaster,我習(xí)慣的。
------- bouncehost
制定了退信消息中的主機(jī)名,默認(rèn)的值是me文件的主機(jī)名。
-------- concurrencylocal
定義了qmail能夠同時(shí)運(yùn)行的本地投送進(jìn)程數(shù)。對于大型的郵件主機(jī),非常重要。他的默認(rèn)參數(shù)是10。就是允許多達(dá)10個(gè)本地郵件投遞進(jìn)程同時(shí)運(yùn)行。這個(gè)控制文件的最大值是由qmail源代碼中的conf-spawn變異參數(shù)設(shè)置的,這個(gè)編譯參數(shù)默認(rèn)值是120,他的最大值是255。
-------- concurrencyremote
定義了qmail可以同時(shí)運(yùn)行的遠(yuǎn)程投遞進(jìn)程數(shù),默認(rèn)值是20。它也是由conf-spawn設(shè)置的,默認(rèn)值是120,最大可設(shè)255。但是要根據(jù)你的實(shí)際情況,因?yàn)檫\(yùn)行進(jìn)程要需要內(nèi)存和硬盤的,設(shè)太大了小心你的服務(wù)器負(fù)載!
------- defaultdomain
默認(rèn)域名,如果給本地的郵件用戶發(fā)信,沒有加上域名,qmail-inject會給他添加defaultdomain文件中的域名。如果設(shè)置了QMAILDEFAULTDOMAIN環(huán)境變量,他就會重載defaultdomain控制文件的值。
--------- defaulthost
默認(rèn)主機(jī)名,同一郵件服務(wù)器上,給本地用戶發(fā)郵件,如果收信的用戶地址沒加域名,就會添加主機(jī)名。例如:郵件主機(jī)mail.chinaunix.net,給本地用戶peng@rchinaunix.net發(fā)郵件,from:peng ,那么qmail就會給這個(gè)消息擴(kuò)充為peng@mail.chinaunix.net,qmail-send識別更容易了。通常,大家希望只看到域名@chinaunix.net,不看到主機(jī)名@mail.chinaunix.net,因而qmail就只讓你看到了域名。
------databytes
定義由qmail-smtpd接受到的郵件消息所允許的最大字節(jié)數(shù),也就是發(fā)送和接受郵件的大小(本機(jī)上給本機(jī)用戶出發(fā)和接受除外)。就是說,遠(yuǎn)程郵件主機(jī)和你用outlook、foxmail等遠(yuǎn)程的mua工具發(fā)信,都受他的限制。默認(rèn)值是0,表示不限制。無法理解的是,默認(rèn)沒有這個(gè)文件,一定要加上。假想以下,有個(gè)電信的哥們給你使壞,在骨干網(wǎng)機(jī)房,寫個(gè)定時(shí)任務(wù),沒事就給你發(fā)幾個(gè)100m的信件,嘿嘿。。。
# echo 10000000 >/var/qmail/control/databyte ---設(shè)置為10m,超過10m,將得到code 552,告知:其郵件大小超出了該郵件主機(jī)所能容忍的限度
---- doublebouncehost
用來為那些經(jīng)歷了兩次反彈后的消息指定主機(jī)名。默認(rèn)是me文件的值
---- doublebounceto
用來為那些經(jīng)歷了兩次反彈后的消息指定用戶名,默認(rèn)是postmaster。
---- envnoathost
是qmail-send用來為沒有指定主機(jī)名的郵件接受方指定他的主機(jī)名的,默認(rèn)是沒有這個(gè)控制文件的,qmail-send使用me文件定義的
---- helohost
指定在qmail-remote與遠(yuǎn)程郵件服務(wù)器的smtp會話中用到的主機(jī)名。如果helohost控制文件沒有給出,qmail-remote使用me文件的值。
---- idhost
指定了用來在消息中產(chǎn)生message-ID:頭字段得主機(jī)名,默認(rèn)qmail-inject用me文件的值。
---- localiphost
用來為郵件消息指定本地地址的,內(nèi)容是郵件主機(jī)的ip地址。但是它用在dns上就會有問題。建議不要設(shè)置。
---- locals
指定郵件本地地址,不存在,qmail-send就假定me文件的值為郵件主機(jī)的唯一可用本地郵件主機(jī)。
---- me
用來指定本地郵件服務(wù)器的主機(jī)名,最重要的控制文件,如果沒有,qmail將不會運(yùn)行。
me控制文件通常是靠運(yùn)行qmail配置子目錄下的config腳本文件來建立的,config腳本自動判斷郵件服務(wù)器的dns域名,并產(chǎn)生一個(gè)適當(dāng)?shù)目刂莆募?me ,locals,rcpthhosts)。如果某種原因你的郵件服務(wù)器無法連通dns服務(wù)器,可以手工運(yùn)行configfast來指定郵件服務(wù)器主機(jī)名:
# /var/qmail/configure/config-fast mail.chinaunix.net
---- plusdomain
用來將一個(gè)域名指定成任何一個(gè)以一個(gè)加號(+)結(jié)尾的地址。缺省的情況下,出現(xiàn)在me文件的域名被添加到任何一個(gè)以加號結(jié)尾的郵件地址中。
---- queuelifetime
用來指定一個(gè)消息在他被刪除前,可以在郵件列表中保存的時(shí)間秒數(shù)。默認(rèn)是604800,當(dāng)投遞失敗的消息超過規(guī)定的時(shí)間,將被從郵件隊(duì)列中刪除。
---- rcphosts
定義了qmail可以接收消息的主機(jī)和域名。 不過因?yàn)閞cpthosts中的域名最好不要超過50行,多出的添加到morercpthosts中。
---- morercpthosts
用來指定qmail將要為其接受消息的額外的主機(jī)和域名。
---- smtpgreeting
用來指定SMTP連接的歡迎標(biāo)志 ,默認(rèn)是用me文件的主機(jī)名。
例如:smtpgreeting值為 welcome connect to out open relay mail server –mail.chinaunix.net
那么建立一個(gè)smtp連接的時(shí)候?qū)吹饺缦滦畔ⅲ?/P>
Trying 198.160.x.x...
Connected to mail.96633.net
Escape characteris ^].
220 welcome connect to out open relay mail server –mail.chinaunix.net ESMTP
---- smtproutes
用來指定能夠被用來將郵件投送給特定目的地的靜態(tài)smtp連接的。
smtprouter行格式如下:
host : relay
其中host可以是一個(gè)主機(jī)名或者域名,這個(gè)值將被重定向到有relay所定義的一個(gè)特定的郵件主機(jī)上。
舉例:
beijing.chinaunix.net :shanghai.chinaunix.net
chinaunix.net :
:tianjin. chinaunix.net :2000
第一行,定義了任何到beijing. chinaunix.net的消息重定向到shanghai. chinaunix.net
第二行,強(qiáng)制qmail對任何以chinaunix.net結(jié)尾的地址進(jìn)行dns查詢。
第三行,通過不指定第一個(gè)參數(shù),任何不在前兩行范圍內(nèi)的消息都會被轉(zhuǎn)發(fā)到郵件服務(wù)器tianjin.96633.net。同時(shí),還用2000端口替代標(biāo)準(zhǔn)的smtp tcp的25端口。這個(gè)技術(shù)常常用在通過一個(gè)防火墻連接到internet郵件中繼中。
注意:smtproutes可定義許多特定的smtp路由。需要主機(jī)的是他的地址列表,qmail會按照smtproutes文件中出現(xiàn)的順序,來處理這些地址。有時(shí)順序不對,會引起郵件循環(huán),切記!
---- timeoutconnect
用來指定qmail-remote將要等待的一個(gè)時(shí)間秒數(shù)。也就是說等待遠(yuǎn)程smtp服務(wù)器接受本地的一個(gè)smtp請求響應(yīng)的時(shí)間,默認(rèn)是60秒。對于質(zhì)量不好的網(wǎng)絡(luò),可以適當(dāng)調(diào)節(jié)。
---- timeoutremote
用來指定qmail-smtpd等待遠(yuǎn)程SMTP主機(jī)發(fā)送數(shù)據(jù)的時(shí)間線。默認(rèn)的情況下,如果連接建立后1200秒內(nèi)沒有 接受到遠(yuǎn)程SMTP主機(jī)的任何信息,那么將關(guān)閉這個(gè)連接。
---- timeoutsmtpd
用來指定qmail-smtpd等待遠(yuǎn)程smtp客戶端連接的時(shí)間秒數(shù)。默認(rèn)是1200,超過這個(gè)時(shí)間,連接取消。
---- virtualdomains
讓qmail接受本地郵件以外,還接受該文件中指定的域或者郵件地址,就是常說的虛擬域支持。
以上說的一些控制文件,qmail默認(rèn)不是都有的,只有一些必須要得。根據(jù)你的mail不同的使用情況,自己選擇來建立和設(shè)置。
7 系統(tǒng)別名
qmail的系統(tǒng)別名和sendmail不太一樣,沒有用一個(gè)大文件來包含所有的。而是建立了許多獨(dú)立的別名文件。
在/var/qmail/alias中,格式如下:
。qmail-alias ---alias是要建立的別名。
舉例:我要給postmaster建立一個(gè)別名文件,使寄給postmaster的郵件都給peng
echo peng > /var/qmail/alias/.qmail-postmaster
8 用戶別名
除了系統(tǒng)文件,。Qmail還可以支持獨(dú)立的用戶系統(tǒng)配置文件。在用戶的家目錄中。
例如,在用戶peng目錄下,建立一個(gè)peng-sales的郵件列表,就可以建立 .qmail-sales文件,在文件中添加郵件地址,每個(gè)一行。這樣發(fā)給peng-sales的郵件,就會給任何一個(gè)地址copy一份。
9 改變MUA程序接口
qmail程序包含了一個(gè)可執(zhí)行程序,該程序替代了unix標(biāo)準(zhǔn)的sendmail程序。你要想用qmail作為你的mail服務(wù)器,必須用qmail的sendmail包裝程序替代現(xiàn)有的sendmail程序。
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# chmod 0 /usr/sbin/sendmail.bak
# ln –s /var/qmail/bin/sendmail /usr/sbin/sendmail
10 建立qmailsmtp功能
傳統(tǒng)上使用inetd程序來監(jiān)聽網(wǎng)絡(luò),但是缺點(diǎn)很多。本文中用ucspi-tcp包的tcpserver服務(wù)來代替它。參考了iceblood的qmail-setup.1.5.3的腳本文件,我是這樣完成的:
1、 建立/etc/qmail目錄,建立了smtp.sh and pop3.sh啟動腳本
2、 建立了tcp.smtp 和tcp.smtp.cdb文件。
具體我是這樣做的:
#echo “/etc/qmail/start” >> /etc/rc.d/rc.locad --- 開機(jī)執(zhí)行/etc/qmail/start
# touch /etc/qmail/start --- 建立執(zhí)行文件
# touch /etc/qmail/smtp --- 建立smtp腳本文件
# touch /etc/qmail/pop --- 建立pop腳本文件
# touch /etc/qmail/tcp.smtp ---建立tcpserver的連接規(guī)則文件
# echo "csh -cf '/var/qmail/rc &'">/etc/qmail/start -- 開機(jī)啟動qmail
# echo "/etc/qmail/smtp.sh">>/etc/qmail/start -- 開機(jī)執(zhí)行smtp.sh
smtp腳本內(nèi)容:
/usr/local/bin/tcpserver -H -R –l chinaunix.net -t 1 -c 100 -v -p -x/etc/qmail/tcp.smtp.cdb
-u 502 -g 501 0 smtp /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true | /var/qmail/bin/splogger &
(注:502 and 501換成系統(tǒng)上的qmaild與nofiles的uid and gid的值。)
pop腳本內(nèi)容:
/usr/local/bin/tcpserver -c 100 -v -l chinaunix.net -U -H -R 0 pop3 /var/qmail/bin/qmail-popup chinaunix.net /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
| /var/qmail/bin/splogger &
tcp.smtp腳本內(nèi)容
127.0.0.1:allow,RELAYCLIENT=" "
:allow
# /var/qmail/bin/tcprules /etc/qmail/tcp.smtp.cdb /etc/qmail/tcp.smtp.tmp < /etc/qmail/tcp.smtp
以上配置,可以做到開機(jī)自動啟動了。具體的詳細(xì)參數(shù)配置,我們《(四)ucspi-tcp的原理和設(shè)置》部分再詳細(xì)討論。
其實(shí),/var/qmail/control/下的位置文件,有許多是不必要的。我的系統(tǒng)就用了一下幾項(xiàng):
databytes locals me rcpthosts virtualdomains
defaultdomain locals.lock plusdomain rcpthosts.lock virtualdomains.lock
badmailfrom
只有databytes 、badmailfrom是我添加的,剩下都是系統(tǒng)默認(rèn)有的。之所以介紹這么多,就是讓大家根據(jù)自己的不同情況,自己設(shè)置。
11 小結(jié)。
到這里,qmail這一部分就介紹完了?;仡櫼幌拢?/P>
我們明白了qmail的工作流程。
創(chuàng)建了基本的qmail控制文件。
在安裝時(shí),創(chuàng)建了必要的qmail系統(tǒng)別名。
決定了本地郵件的投遞方式,安裝時(shí)用的maildir。
創(chuàng)建了qmail啟動腳本。
改變了mua的程序接口。
建立了qmail的smtp功能。
簡單的講了qmail配置文件.qmail。
從qmail這一部分來說,應(yīng)該是可以了。
通過本文的介紹,我們可以清楚的了解到qmail的工作原理和如何配置文件,希望大家能更好、更快的學(xué)會qmail,并應(yīng)用他,用過的人都說好用!
【編輯推薦】