『qmail的運行程序』
qmail是一個模塊化設計的郵件系統,每一個子功能都是由一個運行程序來實現的,而每個程序的屬性以及運行方式由一個或多個配置文件和環境變量來控制的。在qmail安裝成功和啟動以后,qmail的相關進程一直在內存中駐留,qmail會不斷掃描郵件隊列,并且把郵件投遞到正確的目的地址。
運行ps命令可以查看到qmail的相關進程:
#ps –ax | grep qmail
0:00.00 grep qmail
23282 con- I 0:00.77 qmail-send
23289 con- I 0:00.21 splogger qmail
23290 con- I 0:00.13 qmail-lspawn ./Mialdir/
23291 con- I 0:00.03 qmail-rspawn
23292 con- I 0:00.05 qmail-clean
qmail所有的運行程序都安裝在/var/qmail/bin目錄下。比較重要的運行程序如下:
1. qmail-smtpd
它的作用是接收遠端主機投遞的郵件,然后將郵件傳遞給qmail-queue進行處理。qmail-smtpd是通過SMTP協議和遠端主機驚醒通訊的。qmail-smtpd并不是常駐內存的,他需要一個外部程序來激活,本文所做的系統是使用tcpserver來激活的。Tcpserver監視著系統的IP連接請求,如果檢測到有SMTP的連接請求,tcpserver就會自動的激活qmail-smtpd,然后將IP連接的控制權交給qmail-smtpd,一旦qmail-smtpd和遠端主機建立起SMTP連接后,遠端主機就可以將郵件投遞到本地的郵件服務器了。
2. qmail-inject
它的作用是接收本地生成并投遞的郵件,并把郵件傳遞給qmail-queue來處理。在郵件傳遞給qmail-queue之前,qmail-inject先掃面郵件的郵件頭,來查看郵件頭是否符合RFC822標準,如果不符合它將會自動的更改和修正這個郵件的郵件頭。
3. qmail-send
當一個郵件被放入郵件隊列之后,qmail-send就開始對該郵件進行處理,。它會檢查郵件隊列中的每一個郵件的狀態,對于沒有投遞過的和投遞暫時失敗的郵件,對于沒有投遞過和投遞暫時失敗的郵件,qmail-send會將目標地址是本地主機的傳遞給qmail-lspawn,目標地址是遠端主機的傳遞給qmail-rspawn,對于投遞永久失敗的郵件,qmail-send將會把該郵件傳遞給qmail-clear,讓這個程序永久刪除這個郵件。qmail-send是一個常駐內存進程程序,如果qmail-send中止,qmail的其他進程將會自動中止。
4. qmail-clean
它的作用是從郵件隊列中刪除投遞永久失敗的郵件。qmail使用多種狀態標示來標記郵件,每個郵件在每一次被處理后它的狀態表示都會被改變。如果系統當機,系統重新啟動以后,qmail-send仍然可以找到郵件隊列中上次最后一次成功處理過的郵件的位置,并且從這里重新開始處理郵件隊列。如果由于其他原因造成qmail-send不能處理的郵件隊列,qmail-send會調用qmail-clean從郵件隊列中刪除郵件。qmail-clean也是常駐內存的進程。
5. qmail-rspawn
當qmail-send判明郵件目標地址是遠端郵件服務器時,qmail-send就會將郵件交給qmail-rspawn,qmail-rspawn的作用是調度郵件的投遞時間和順序,然后激活qmail-remote來進行投遞。qmail-rspawn還有一個作用是決定每一個郵件的目標郵件服務器,每次和遠端郵件服務器的連接都會調用qmail-remote一次。qmail-rspawn也是常駐內存的進程。
6. qmail-lspawn
功能和qmail-rspawn類似,qmail-lspawn也是被qmail-send調度來投遞郵件的,不過qmail-lspawn是負責目標地址是為本地郵件服務器的郵件。
7. qmail-remote
它的作用是通過SMTP協議將郵件投遞到遠端的用戶。郵件是通過qmail-rspawn傳遞過來的,qmail-remote每次只可以同一個遠端主機連接,不過在連接時qmail-remote可以投遞這個遠端主機上的多個接收者的郵件。投遞當中的調度是由qmail-rspamwn來負責的。
8. qmail-local
它的作用是投遞本地郵件服務器的郵件。這個程序通常是用來檢測因為轉發命令使用不當造成的郵件循環故障。
9. qmail-queue
他處理從qmail-inject和qmail-smtpd傳遞過來的郵件,并把這些郵件傳遞到郵件隊列中,它會掃描每個郵件的發送者和接收者的地址,一般傳遞給qmail-queue的郵件的標示都是為0,如果為1時,它會認為這個郵件的發送者和接收者的地址要經過特殊格式的處理。
qmail的配置文件是由多個文件組成的,不是集中在一個文件中,每個文件控制相應部分的功能和屬性,一個可執行程序可能有多個配置文件控制,所有的配置文件共同決定了qmail運行的實現和模式。這些配置文件都在qmail的control目錄中,一般位于位于/var/qmail/control目錄中。
『qmail的配置文件』
1. badmailfrom
這個配置文件是控制郵件系統拒絕接收的郵件地址和郵件域,主要是為了防止垃圾郵件。如果一個郵件地址或者郵件域被列入到這個文件中,系統就會拒絕接收這個郵件地址發來的郵件,或者拒絕郵件域下所有郵件地址發來的郵件。不過這個配置文件只是一般的垃圾郵件防范手段,對于比較全面的垃圾郵件過濾技術還要靠第三方軟件來實現。該文件的格式如下:
11@11.com //拒絕這個地址發來的郵件
22@2w.com
@33.com //拒絕這個郵件域下的所有帳號發來的郵件
@44.com
2. boucefrom
bouceform是定義當郵件投遞失敗時系統返回給發送者一個包含失敗信息的郵件時的發送者。如果不存在這個文件,默認的發送者是MAILER-DAEMON。比如本文的
echo postmaster > /var/qmail/control/bouncefrom
就是定義投遞者為postmaster,這樣所有投遞失敗的返回郵件的發送者就成了postmaster。
3. concurrencylocal
這個文件定義了qmail可以同時投遞的本地郵件的個數。這個參數的缺省值是10,也就是說系統允許同時有10個郵件在本地投遞。concurrencylocal這個參數的最大值是由編譯時的conf-spawn參數來決定的,缺省值是120,最大值是255。
4. concurrencyremote
這個參數定義了qmail可以同時投遞的遠端郵件的個數,這個參數的缺省值是20。這個參數的最大值也是由conf-spawn來決定的。
5. defaultdomain
它主要用于郵件用戶在投遞給同一郵件服務器的郵件用戶時的郵件投遞處理,比如郵件服務器cnunix.com.cn用戶user發送郵件給另一個郵件用戶user1@cnunix,這實qmail-inject會將defaultdomain中定義的郵件域名加入到這個郵件的目標地址中,qmail會自動認為這個郵件的目標地址是user1@cnunix.com.cn,并按照這個地址進行投遞。當這個文件不存在的時候,qmail會從配置文件me中讀取這個參數。如果系統變量QMAILDEFAULTDOMAIN已經設置,defaultdomain定義的參數將被忽略。
6. defaulthost
它和defaultdomain類似,當郵件系統接收到沒有目標主機名的郵件時,這個設置文件定義了系統往這個郵件中加入的目標主機名名稱。在缺省情況下,qmail-inject會將defaulthost中定義的名稱加入到沒有定義投遞郵件地址的郵件的目標主機名中,如果defaulthost不存在,加入的目標主機名將時字符串“defaulthost”,defaulthost主要用于郵件用戶在投遞給同一郵件服務器的郵件進行投遞處理。如果系統變量QMAILDEFAULTHOST已經設置,defaulthost定義的參數將被忽略。
7. databyes
它定義了qmail-smtpd所允許接收的郵件的最大字節數。這個參數的缺省值為0,表示對接收郵件的字節數沒有限制。如果要限制最大的接收為10M,操作如下:
echo 10485760 > /var/qmail/control/databytes
這是任何大于10M的郵件都會被拒絕。這個參數最好設置上,以避免惡意的對你服務器發送大量的超大郵件,產生郵件服務器負荷過大,甚至系統崩潰的危險。
8. doublebouncehost
這個配置文件定義了出現“雙重反彈”的時候,系統轉發的郵件的主機名稱?!半p重反彈”就是當系統因為投遞失敗將郵件返回給發送者時,發送者又將此郵件返回,這個時候qmail將會把這個郵件轉發到另一個郵件地址,一般這個地址就是管理員的地址。doublebouncehost就是定義這個轉發的郵件地址的主機名部分,而這個郵件地址的用戶名部分是由doublebouceto來定義的,因此這兩個配置文件一般都是結合起來使用的。當doublebouncehost不存在的時候,系統將會從配置文件me中讀取這個參數
9. doublebounceto
這個參說是結合blebouncehost來使用的,當這個參數不存在的時候,系統缺省值是postmaster用戶。
10. helohost
這個配置文件定義了當程序qmail-remote和遠程郵件系統建立連接時所使用的主機名。如果這個配置文件不存在,系統將會從配置文件me中讀取這個參數值,如果me不存在,qmail-remote將不能正常運行工作。
11. locals
這個配置文件是定義本地郵件域的,在qmail-send處理郵件投遞時,將會使用locals定義的值和郵件的目標地址進行比較,如果相同,系統就會將這個郵件投遞到本地交給qmail-lspawn來處理。如果一個郵件的目標主機名在locals找不到,系統將會把這個郵件投遞到遠端郵件服務器系統,即使這個郵件的目標地址可能是本地郵件系統的。如果locals不存在,系統將會從配置文件me中讀取這個參數,如果me不存在,qmail-send將不能正常運行。
12. me
這個配置文件是qmail系統十分重要的一個文件,如果這個文件不存在,qmail系統將無法運行。me是用來定義本地郵件服務器的主機名的,上面已經介紹到了,有多個配置文件是和me有關聯的,如果那些配置文件不存在系統默認會從me中讀取參數值的。me這個配置文件一般都是在qmail系統安裝時使用configure-fast來創建的,在上面qmail系統安裝的時候已經使用過了這個參數。
13. queuelifetime
這個配置文件是定義一個郵件在郵件隊列中存活的時間,缺省值為7天(604800s),這個期限掉了以后qmail-send將會進行最后一次的投遞嘗試,如果投遞失敗,該郵件將會從郵件隊列中刪除。
14. rcphosts
這個配置文件也是qmail一個十分重要的文件,這個文件是定義系統允許轉發郵件的郵件域,如果這個文件不存在或者為空,你的系統將會接收Internet上所有的域的郵件轉發,即你的系統是Open relay。配置文件rcpthosts最多可以支持50個主機名和域名,如果超個這個數字,就需要保存到他的擴充配置文件morercphosts中,然后使用qmail的命令程序qmail-newmrh(在本系統中,該文件在/var/qmail/bin目錄下)來生成二進制的morercpthosts.cdb文件,這樣qmail-smtpd才可以從這個二進制文件中讀取信息。
15. virtualdomains
這也是qmail的一個非常重要的配置文件,它定義了qmail的虛擬郵件域,qmail結合vpopmail的虛擬域管理功能可以定義多個虛擬郵件域。
16. smtproutes
這個配置文件是定義qmail郵件系統的靜態SMTP路由表信息的,他的格式應該是:
HOST: targetHOST //HOST可以是主機名或者域名。這行所表示的是意思是將所有目標是HOST的郵件轉發到targetHOST郵件服務器中,這個是最常規的表示方式。
下面給一些例子和一些特殊的表示方法:
cnunix.com.cn:cnunix.com //這行表示的意思是將所有發往cnunix.com.cn的郵件全部轉發到cnunix.com這個郵件服務器。qmail不會在cnunix.com.cn郵件服務器中投遞時查詢DNS中的MX記錄,直接投遞到cnunix.com郵件服務器中,加快了投遞的速度。
.cnunix.net: //這行表示強迫qmail對DNS的MX記錄進行查詢,因為沒有定義轉發的主機名,qmail將在DNS中查詢任何以.cnunix.net結尾的郵件服務器
:mail.cnunix.com.cn:2525 //這行定義表示所有發往該機器的所有郵件都將會轉發到mail.cnunix.com.cn這個郵件服務器,并且轉發到對方的2525端口,這個方式一般都是做郵件網關時用的到的。
注意:smtproutes如果設置不正確或者DNS的變動會產生郵件的循環投遞。
17. timeoutconnect
這個配置文件定義了qmail-remote在和遠端SMTP服務器在SMTP連接斷開以前接受一個新的連接等待的最大時間(單位為秒s),默認值為一分鐘(60s)。如果你的網絡連接速率比較低,就需要相應的調整這個參數到一個適合的值。
18. timeoutremote
這個配置文件定義了qmail-remote等待遠端的SMTP服務器相應時等待的最大時間,默認值為20分鐘(1200s),如果到達這個最大值沒有相應,qmail才和對方斷開連接并且把失敗的記錄寫到qmail的日志中。
19. smtpgreeting
這個配置文件定義了用戶在登錄SMTP服務時顯示的系統歡迎信息。修改這個信息可以掩蓋一些你的系統的本身的信息,可以相對的迷惑一下登錄者。:)
『qmail郵件投遞工作基本原理』
qmail-inject負責接收本地郵件用戶投遞的郵件,qmail-smtpd負責接收遠端郵件用戶投遞的郵件,交給程序qmail-queue處理后放入郵件隊列,qmail-send會依次檢查郵件隊列中的狀態,如果郵件的狀態時投遞永久失敗,qmail-send會調用qmail-clean將郵件從郵件隊列中刪除,如果郵件狀態是沒有投遞過或者是暫時失敗,qmail-send會把投遞到本地郵件服務器的郵件傳遞給qmail-lspawn,把投遞到遠程郵件服務器的郵件傳遞給qmail-rspawn,qmail-lspawn會調度郵件投遞的序列和時間,然后讓qmail-local將郵件投遞到本地郵件用戶的郵箱中,qmail-rspawn也會調度郵件的投遞序號和時間,然后調用qmail-remote將郵件投遞到遠端用戶的郵箱中。
后記:
這幾天本來想做一個qmail結合vpopmail虛擬域管理、openldap用戶信息存儲認證信息、日志統計等mail服務器,然后寫一份詳細的安裝和軟件的基本原理的文檔。但是由于種種原因沒有成功,至于什么時候能做好我自己也不是很清楚,嘻嘻。先將我這篇沒有完成的文檔的qmail基本介紹部分貼出來,供大家對qmail有一個基本的認識作參考,同時有什么錯誤的地方也忘指出來,到時候誤導各位我就有愧了。