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
























