qmail安裝過程文檔-版主給加精哦
本系統為:Red Hat Linux----Advanced Server release 2.1AS
二、安裝qmail
本次採用源代碼形式安裝
2.1、下載源代碼(如下面地址不能下載,請到其它網址下載)
* qmail: ftp://cr.yp.to/software/qmail-1.03.tar.gz
* ucspi-tcp: ftp://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
* daemontools: ftp://cr.yp.to/daemontools/daemontools-0.76.tar.gz
2.2、構建源代碼
在命令行提示符下,輸入cc和並且敲回車:
# cc //確認是否有C編譯器
cc: No input files specified //系統有C編譯器
#
2.3、打開源文件包
將qmail放在/usr/local/src目錄下,ucspi-tcp 和 daemontools 放在/package目錄下。
此時應成為root(超級用戶)身份,如不是,執行:
$ su
& umask 022
# mkdir -p /usr/local/src
# mv qmail-1.03.tar.gz ucspi-tcp-0.88.tar.gz /usr/local/src
# mkdir -p /package
# chmod 1755 /package
現在展開源文件包:
# cd /usr/local/src
# gunzip qmail-1.03.tar.gz
# tar xpf qmail-1.03.tar
# gunzip ucspi-tcp-0.88.tar.gz
# tar xpf ucspi-tcp-0.88.tar
# rm *.tar //註釋:可選,除非空間緊張
# cd /package
# gunzip daemontools-0.76.tar.gz
# tar xpf daemontools-0.76.tar
# rm *.tar // 註釋:同上
現在源文件的目錄路徑為 /usr/local/src/qmail-1.03, /usr/local/src/ucspi-tcp-0.88, 和 /package/admin/daemontools-0.76.
2.4、創建目錄
# mkdir/var/qmail
註:由於qmail的安裝程序將會創建所需要的子目錄,所以僅僅需要創建qmail的「主」文件夾就行了
2.5、創建用戶和組
編輯/etc/group
追加下列2行在文件的末尾:
qmail:*:2107:
nofiles:*:2108:
註:確認2107和2108不已經被使用。
如果他們已經被使用,請選其他不被使用的數字。
編輯/etc/passwd
加下面內容:
alias:*:7790:2108::/var/qmail/alias:/bin/true
qmaild:*:7791:2108::/var/qmail:/bin/true
qmaill:*:7792:2108::/var/qmail:/bin/true
qmailp:*:7793:2108::/var/qmail:/bin/true
qmailq:*:7794:2107::/var/qmail:/bin/true
qmailr:*:7795:2107::/var/qmail:/bin/true
qmails:*:7796:2107::/var/qmail:/bin/true
註:確認7790-7796不被使用,並且2107和2108是同一個組的id號。
如果這些UID的某一個已經被使用,選不正被使用的數字。
《解決方案》
2.6、開始構建
切換到/usr/local/src/qmail-1.03目錄下:
# cd /usr/local/src/qmail-1.03
現在輸入下面命令就行了:
# make setup check
在編譯完后,需要配置郵件。
提供了兩個腳本使得這工作更簡單。
如果DNS已經配置好了,則輸入下面命令就行了:
# ./config
如果由於某種原因配置文件不能在域名伺服器(DNS)中發現主機名稱,則必須與運行config-fast腳本程序:
# ./config-fast test.example.com //本主機名
現在qmail被安裝在系統上了!
2.7、安裝ucspi-tcp
現在切換目錄到ucspi-tcp文件夾:
# cd /usr/local/src/ucspi-tcp-0.88
接著,做:
# make
# make setup check
就這樣,ucspi-tcp被成功安裝。
2.8、安裝daemontools
改變目錄到文件夾daemontools:
# cd /package/admin/daemontools-0.76
接著,做:
# package/install
用 "ps -ef | grep svscan" 或 "ps waux | grep svscan" 來驗證svscan是否運行。
2.9、運行qmail
2.9.1、/var/qmail/rc
用編輯器在把下面的內容寫入/var/qmail/rc:
#!/bin/sh
# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`"
然後執行命令:
# chmod 755 /var/qmail/rc
# mkdir /var/log/qmail
現在,除了.qmail文件方式,你要選擇你預設的郵件接收方式。下面的表格是一些常用的選擇:
郵箱格式 名字 位置 預設的運送點 備註
mbox Mailbox $HOME ./Mailbox 最常用,可與大多數MUA's一起運轉
maildir Maildir $HOME ./Maildir/ 更可靠,MUA支持較少
mbox username /var/spool/mail 參見INSTALL.vsm 傳統UNIX郵箱
更多信息參見:INSTALL.mbox,INSTALL.maildir,INSTALL.vsm。
為了選擇預設的郵箱類型,只要把defaultdelivery的值寫入/var/qmail/control/defaultdelivery就可以了。例如,選擇標準qmail郵箱,那麼:
echo ./Mailbox >/var/qmail/control/defaultdelivery
注意:defaultdelivery並不是qmail的控制文件,而是上面/var/qmail/rc文件的部分。
2.9.2、系統啟動文件
2.9.2.1. qmail的啟動腳本
如果是手動執行/var/qmail/rc腳本,qmail可能只是部分時間啟動,而我們需要一旦系統啟動,qmail就可以自動的無時不刻的運行,系統掛起時,我們需要qmail被乾淨利索的關閉。
下面是一個成功的實現這個目的的腳本(用編輯器將下面代碼寫入/var/qmail/bin/qmailctl):
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
export PATH
case "$1" in
start)
echo -n "Starting qmail: svscan"
cd /var/qmail/supervise
env - PATH="$PATH" svscan &
echo $! > /var/run/svscan.pid
echo "."
;;
stop)
echo -n "Stopping qmail: svscan"
kill `cat /var/run/svscan.pid`
echo -n " qmail"
svc -dx /var/qmail/supervise/*
echo -n " logging"
svc -dx /var/qmail/supervise/*/log
echo "."
;;
stat)
cd /var/qmail/supervise
svstat * */log
;;
doqueue|alrm)
echo "Sending ALRM signal to qmail-send."
svc -a /var/qmail/supervise/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /var/qmail/supervise/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /var/qmail/supervise/qmail-send
echo "Pausing qmail-smtpd"
svc -p /var/qmail/supervise/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /var/qmail/supervise/qmail-send
echo "Continuing qmail-smtpd"
svc -c /var/qmail/supervise/qmail-smtpd
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /var/qmail/supervise/qmail-smtpd
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /var/qmail/supervise/qmail-send
echo "* Restarting qmail-smtpd."
svc -u /var/qmail/supervise/qmail-smtpd
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp*
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat < stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac
exit 0
注意:如果你發現qmail在系統引導之後存在時間很短,在腳本的開始段以nohup前置env命令,例如:
nohup env - PATH="$PATH" svscan &
使腳本能執行,並建立鏈接,輸入下面命令:
# chmod 755 /var/qmail/bin/qmailctl
# ln -s /var/qmail/bin/qmailctl /usr/bin
《解決方案》
2.9.2.2、 管理腳本
為管理腳本建立目錄:
# mkdir -p /var/qmail/supervise/qmail-send/log
# mkdir -p /var/qmail/supervise/qmail-smtpd/log
# chmod +t /var/qmail/supervise/qmail-send
# chmod +t /var/qmail/supervise/qmail-smtpd
建立/var/qmail/supervise/qmail-send/run文件:
#!/bin/sh
exec /var/qmail/rc
建立/var/qmail/supervise/qmail-send/log/run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail
建立/var/qmail/supervise/qmail-smtpd/run文件:
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
注意:目前建立的腳本並不是標準的qmail控制文件,而是上面的腳本的部分。
注意:是否增加內存的容量取決於操作系統和硬體,可以在軟體限量命令下指定內存用量。如果埠25訪問失敗,或者遠程系統不能發送郵件給本系統,試著把內存用量提高到3,000,000到4,000,000。
建立concurrencyincoming控制文件:
# echo 20 > /var/qmail/control/concurrencyincoming
# chmod 644 /var/qmail/control/concurrencyincoming
建立/var/qmail/supervise/qmail-smtpd/log/run文件:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd
修改文件屬性,使這些文件可執行:
# 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
建立日誌(log)文件目錄:
# mkdir -p /var/log/qmail/smtpd
# chown qmaill /var/log/qmail /var/log/qmail/smtpd
2.9.2.3、SMTP存取控制
允許本地主機通過SMTP傳送郵件:
# echo '127.:allow,RELAYCLIENT=""' >>/etc/tcp.smtp
# /usr/local/sbin/qmail cdb
2.9.3、停止已經安裝的MTA並使之失效
儘管同時運行qmail與已經存在的MTA是可能的,比如Sendmail,但並不推薦這麼做.
如果已經存在的MTA是Sendmail,可以通過運行在init.d的Sendmail的控制腳本的「stop」參數來終止它的運行。例如,下面中的一個可能在系統上可以運行:
/etc/init.d/sendmail stop
/sbin/init.d/sendmail stop
/etc/rc.d/init.d/sendmail stop
也可以通過如下命令來結束:
ps -ef |grep sendmail
kill PID-of-sendmail
如果系統應用的MTA不是Sendmail,檢查一下它的文件找到正確的應該終止的進程。
應該考慮一下,安裝qmail之後,是否把原來的舊的MTA完全的卸載並刪除,至少禁止init.d下的Sendmail的啟動腳本,避免重新引導的時候再次啟動。
對於Red Hat Linux,刪除Sendmail:
rpm -e --nodeps sendmail
最後,以qmail版本的執行文件代替Sendmail原來的文件:
# mv /usr/lib/sendmail /usr/lib/sendmail.old #忽略錯誤
# mv /usr/sbin/sendmail /usr/sbin/sendmail.old #忽略錯誤
# chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old #忽略錯誤
# ln -s /var/qmail/bin/sendmail /usr/lib
# ln -s /var/qmail/bin/sendmail /usr/sbin
2.9.4、 建立系統別名
在qmail安裝中需要三個系統別名:
別名 目的
postmaster RFC 821要求,指出郵件管理員(就是你自己)
mailer-daemon 事實上標準的反彈郵件接收者
root 重定向系統特權賬戶給系統管理員
建立別名的目的是為了確定郵件的目的地(可以是一個本地用戶或者一個遠程地址),生成並且轉移到合適的.qmail文件中。舉個例子,假如本地用戶test是操作系統和郵件系統的管理員:
# echo test > /var/qmail/alias/.qmail-root
# echo test > /var/qmail/alias/.qmail-postmaster
# ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon
# chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster
細節見INSTALL.alias文件。
2.9.5、啟動、停止與重啟qmail
# qmailctl start //啟動
# qmailctl stop //停止
# qmailctl restart //重啟
2.10、測試安裝結果
現在,qmail應該已經運行起來了,按照TEST.deliver和TEST.receive的指導檢驗qmail是否正常運行。
《解決方案》
三、配置
3.1、相關的配置文件
除了在~alias中描述的.qmail文件,都在目錄/var/qmail/control中。qmail控制幫助裡面包括下面的一個表格:
Control Default Used by Purpose
badmailfrom none qmail-smtpd blacklisted From addresses
bouncefrom MAILER-DAEMON qmail-send username of bounce sender
bouncehost me qmail-send hostname of bounce sender
concurrencyincoming none /service/qmail-smtpd/run max simultaneous incoming SMTP connections
concurrencylocal 10 qmail-send max simultaneous local deliveries
concurrencyremote 20 qmail-send max simultaneous remote deliveries
defaultdelivery none /var/qmail/rc default .qmail file
defaultdomain me qmail-inject default domain name
defaulthost me qmail-inject default host name
databytes 0 qmail-smtpd max number of bytes in message (0=no limit)
doublebouncehost me qmail-send host name of double bounce sender
doublebounceto postmaster qmail-send user to receive double bounces
envnoathost me qmail-send default domain for addresses without "@"
helohost me qmail-remote host name used in SMTP HELO command
idhost me qmail-inject host name for Message-ID's
localiphost me qmail-smtpd name substituted for local IP address
locals me qmail-send domains that we deliver locally
me FQDN of system various default for many control files
morercpthosts none qmail-smtpd secondary rcpthosts database
percenthack none qmail-send domains that can use "%"-style relaying
plusdomain me qmail-inject domain substituted for trailing "+"
qmqpservers none qmail-qmqpc IP addresses of QMQP servers
queuelifetime 604800 qmail-send seconds a message can remain in queue
rcpthosts none qmail-smtpd domains that we accept mail for
smtpgreeting me qmail-smtpd SMTP greeting message
smtproutes none qmail-remote artificial SMTP routes
timeoutconnect 60 qmail-remote how long, in seconds, to wait for SMTP connection
timeoutremote 1200 qmail-remote how long, in seconds, to wait for remote server
timeoutsmtpd 1200 qmail-smtpd how long, in seconds, to wait for SMTP client
virtualdomains none qmail-send virtual domains and users
需要更多特殊控制文件細節,請參看在「Used by」下列出的幫助文件。
3.2、轉信
3.2.1、介紹
什麼是轉信?就是當一個MTA通過SMTP協議接收到一個郵件,但是這個郵件既不是給一個本地地址也不是從一個本地用戶發出的。
在沒有垃圾郵件的年代,MTA基本都是開放轉信的,伺服器不加限制的接收任何人發的郵件,也不加限制的傳送郵件給任何人。
但是現在的MTA被設置成完全不能轉信,或者只能讓某些確定可信的用戶和系統通過它們轉信。
Chris Johnson為qmail的使用者們寫了一篇非常棒的文章,我建議你去看一下,地址是http://www.palomine.net/qmail/relaying.html。
3.2.2、禁止轉信
如果按照正式的指導安裝qmail,預設情況下轉信功能是被關閉的。這是通過locals和virtualdomains(本地主機)下列出的主機名填寫/var/qmail/control/rcphosts文件進行的。控制文件rcpthosts的名字來源於SMTP RCPT(接收郵件方)命令。在一個SMTP會話中,RCPT用來確定接收郵件方的地址,然後,列出可以出現在RCPT地址中的有效的主機名。
3.2.2、為特定的地址提供轉信
大多數單用戶和小的工作組伺服器可以設置為完全拒絕轉信,但是對於一個分散式的用戶社區,必須准許你的用戶,而且僅僅是你的用戶能利用的你系統轉信。這個功能是通過設置RELAYCLIET環境變數,用tcpserver來調用qmail-smtpd實現的,這個功能將越過rcpthosts文件的限制。
如果你是按照這個文檔安裝qmail的話,預設情況下,選擇性轉信功能被激活。給一個客戶轉信的權利,在/etc/tcp.smtp文件中加入類似這樣的內容:
IP address of client:allow,RELAYCLIENT="" (斜體為客戶的IP地址)
然後重建SMTP擁有使用權者資料庫:
# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
# chmod 644 /etc/tcp.smtp*
如果你是按照正規的指導來安裝的,Chris Johnson有一篇關於如何配置qmail的選擇轉信主機的文章,地址在: http://www.palomine.net/qmail/selectiverelay.html 。
3.3、多主機名
如果你的系統擁有不止一個名字,例如,所有的形如 user@host1.example.com 的地址也可以寫作user@example.com或者user@mail.example.com,然後你必須告訴qmail這些,表示qmail可以傳送給郵件給本地的地址以及qmail可以從遠程主機接收的郵件。
為了做到這一點,需要兩個控制文件加上所有的主機名:
??rcpthosts,這個文件記錄了qmail-smtpd將那些地址作為接收郵件主機名的
??locals,這個文件記錄了qmail-send將傳送到那些地址的主機的郵件傳送到本地的
3.4、虛擬域名
虛擬域名類似於上一節我們討論的多主機名,不過他們有本質的不同。首先,如果example.net主持虛擬域名virtual.example.com,一般來說,傳送給joe@virtual.example.net的郵件不會在同名地址joe@example.net結束上結束傳送過程,名字空間對於每一個虛擬域都是獨一無二的。
對於qmail,虛擬域在virtualdomains文件內配置,由一個或多個入口形如:
user@domainrepend
qmail轉換user@domain地址為prepend-user@dmomain,並且將結果domain視為本地地址。user@部分是可選的,如果忽略,入口將對應於all@domain地址
回到我們剛才的example假設中,如果example.net郵件管理員想要創建一個虛擬域virtual.example.com,在virtualdomains文件可能是這樣表達的:
virtual.example.com:john
一個發給joe@virtual.example.com的郵件進入系統后將被重寫給john-joe@virtual.example.com然後作本地傳送。見.qmail節,以及extension addresses分節有更詳細的關於john如何管理這個虛擬域的內容。
如果作為多主機名,所有的虛擬域必須在rcpthosts中記錄,這樣qmail-smtpd才能夠接受具有這些目的地址的郵件。不過,不像多主機名,虛擬域不能被加入locals文件。
注意:域名伺服器(DNS)的郵件交換(MX)紀錄必須設置指向虛擬域到適當的郵件伺服器。這是域名伺服器管理員的工作,而且超出了我們的介紹範圍。
3.5、別名
qmail的標準別名機制是qmail本地傳送機制的自然產物。qmail-local傳送一個地址為localpart@host的郵件給一個叫做localpart的本地用戶。如果沒有找到對應用戶,郵件將傳送給別名用戶,這個偽用戶在所有的qmail系統上主目錄都是/var/qmail/alias。
舉個例子,假如你創建了一個叫做info@example.com的別名轉發郵件給用戶tom。在example.com上,以root用戶身份,這樣做:
# echo tom > /var/qmail/alias/.qmail-info
.qmail節以及extension addresses分節描述了如何創建.qmail文件,這個文件指定了存在的別名,以及如何處理髮給這些別名的郵件。
注意到別名在qmail系統內的工作方式,別名是不能重載一個(同名的)有效用戶的傳送的。例如,如果rachel是個正常的用戶,~alias/.qmail-rachel將是無用的。
在fastforward包內提供了一個可選的別名機制,這個機制將多個別名寫入一個單獨的文件內,這個文件和Sendmail的別名資料庫兼容。
《解決方案》
3.6、關於qmail-users
qmail-users是一個分派地址給用戶的系統。一系列的配置文件放置在/var/qmail/users下面。分配文件是以一個分配表形式存在。有兩種分配方式:逐一方式的和通配符方式。
注意:其中包含一系列的分配,每行一個,緊隨一行包括一個點(.)。如果你手工建立分配,不要忘記這個點行。
3.6.1、逐一分配
一個逐一分配看起來是這個樣子的:
=address:user:uid:gid:directory:dash:extension:
這意味著傳送給address的郵件將以指定的uid和gid,由用戶user運行,文件directory/.qmaildashextension確定如何傳送郵件的方式來接收郵件的。
3.6.2、通配符分配
一個通配符分配分配看起來是這個樣子:
+prefix:user:uid:gid:directory:dashrepend:
這個意味著傳送給prefixrest表達式代表的地址的郵件將以指定的uid和gid,由用戶user運行,文件directory/.qmaildashprependrest確定如何傳送郵件的方式來接收郵件的。
3.6.3、qmail-user程序
qmail-user有兩個幫助程序:qmail-newu和qmail-pw2u。
qmail-newu處理分配文件並且在/var/qmail/users下生成常量資料庫(CDB)文件叫做cdb。CDB是二進位格式,這樣甚至存在幾千條分配項的時候,也可以由qmail-lspawn快速訪問。
qmail-pw2u轉換系統資料庫/etc/passwd為一系列適合分配的項。qmail-pw2u應用一批文件修改轉換規則。
include: 包含的用戶
??exclude: 排除的用戶
??mailnames: 可選的「郵件名字」
??subusers: 額外的用戶可控制地址,用一個可選的.qmail擴展
??append: 其他分配
注意:如果應用qmail-pw2u,添加用戶、刪除用戶或者改變UID和GID,不要忘記重複運行qmail-pw2u和qmail-newu。
3.7、垃圾郵件控制
Chris Hardie寫了一個很不錯的qmail反垃圾HOWTO。可以在地址http://www.summersault.com/chris/techno/qmail/qmail-antispam.html訪問到。
四、使用方法
這一節包含了qmail的標準使用方法。如果你應用qmail系統收發信件,這裡你就能找到相關的qmail的使用用法。
4.1、.qmail文件
郵件的傳送通常有一個或者多個」.qmail」(發音dot kyoo mail)文件,這些文件放置在用戶的主目錄下,文件名以.qmail開始。dot-qmail手冊頁(man page)描述了具體的用法。
.qmail文件包含了一個傳送指令列表,一行一個指令。每行的第一個字元確定是那種傳送方式:
字元 傳送方式 含義
# 註釋 忽略
| program 在shell下運行的命令
/或者. mbox (如果最後一個字元不是一個 /) mbox路徑(包括 / 或者 .)
/ or . maildir (如果最後一個字元是一個/) maildir的路徑(包括 / 或者 .)
& forward 轉發的地址
字母或數字 forward 轉發的地址,包括第一個字元
4.1.1、程序傳送
當執行一個程序傳送的時候,qmail調用一個命令解釋器(shell)(/bin/sh)來執行命令。它通過標準輸入傳送一個引入的郵件的副本給命令。在qmail-command的手冊頁(man page)有詳細的關於這個過程細節的描述。
程序傳送非常的強大,可以用來實現大範圍的功能比如郵件過濾,自動回復,通過第三方傳送代理,如procmail傳送郵件。
例如:
??preline /usr/ucb/vacation djb
將使qmail調用preline,轉送/usr/ucb/vacation給這個命令,以djb為參數,並且生成一個郵件的副本到標準輸入。
4.1.2、mbox 傳送
「Mbox」是qmail-speak作為標準UNIX信箱格式,這種格式把多個郵件儲存在一個文件里,每個郵件以」Form」開頭,開頭的一行看起來像一個頭,不過這可不是傳送代理簡單的附加來表示每個郵件在這個文件內部的開始部分的。
例如:
./Mailbox
這個格式把郵件附加到$HOME/Mailbox下,郵件用一個預置的」From」開始。
一個簡單的mbox擁有一封郵件的信箱在文件內部看起來是這個樣子的:
From user1@example.net Thu May 13 18:34:50 1999
Received: (qmail 1287205 invoked from network); 13 May 1999 18:34:49 -0000
From: user1@example.net
To: user2@example.com
Subject: hey
What's up?
第一行是qmail在傳送過程中加上的。
4.1.3、maildir傳送
「Maildir」是由Dan Bernstein為了避免mbox格式的缺點而開發的郵箱格式。一個maildir郵箱包含三個子目錄:new,cur和tmp。郵箱裡面的每個郵件在哪一個子目錄取決於郵件的狀態,new是未讀郵件,cur是已讀郵件,tmp是正在傳送中的郵件。maildir的幫助頁(man page)有詳細的格式描述。
maildir格式的一個優點在於,雖然maildir方式不是應用鎖定來保護不同傳送代理對郵件的并行更新,它的工作同樣可靠,這意味著maildir郵箱能夠安全的在NFS文件系統上應用。
例如:
./Maildir/
這個格式把郵件保存到$HOME/Maildir下的maildir格式的郵箱。
注意:qmail-local能夠傳送郵件到maildir信箱,可是不能創建這種格式的信箱。maildir信箱可以由qmail附帶的maildirmake程序創建。例如:「maildirmake ~/Maildir 」 。
4.1.4、forward傳送
forward用來重發郵件到指定地址。地址清單在.qmail文件內,並且不能包括注視和額外空間。
下面這些是錯誤的寫法:
&
& user@example.com
&Joe User
正確的應該是這樣的:
&user@example.com
user@example.com
&user
前兩個將給user@example.com發送一個郵件的副本,最後的發一個副本給本地用戶user。
4.1.5、擴展地址
qmail支持用戶控制的擴展地址。在基本地址上附加,形如,username@hostname.domain,用戶可以用username-extension@hostname.domain來接收郵件。對於剩下的部分,由於動作發生在本地系統上,我們將捨棄」@hostname.domain」部分。
對於username-extension的傳送指令在~username/.qmail-extension內部指定。
擴展可以發生在多個地方,例如,dave-list-qmail,由~dave/.qmail-list-qmail控制。這個例子裡面,dave-list-qmail定作qmail的郵件列表,而~dave/.qmail-list-qmail歸檔郵件到另外的郵箱內。
.qmail等文件預設的情況下可以應用-default。所以dave-list-qmail也被~dave/.qmail-list-default控制。這允許一個控制全局的.qmail文件操作所有的dave-list-whatever(任意的)地址。注意dave-list不會被~dave./qmail-list-default控制,因為在」list」後面沒有」-」。
qmail應用最相近匹配查找,例如,當一個發給地址dave-list-qmail的郵件,會按照下面找到的第一個地址發送:
.qmail-l ist-qmail
.qmail-list-default
.qmail-default
如果沒有找到匹配的.qmail文件,qmail返回傳送失敗消息,並反彈郵件給發送者。
《解決方案》
4.2、發信
郵件使用者通常不直接應用MTA來發送郵件。典型的,寫好郵件並應用郵件用戶代理(Mail User Agent,MUA),比如pine或者mutt來發送郵件,然後MUA調用MTA來傳送郵件。這個提交到MTA的過程,被稱作注入(injection)。
有兩種方法將郵件注入MTA:通過簡單郵件傳送協議,SMTP,或者應用一個MTA支持的程序來完成。
4.2.1、SMTP
MUA能夠在本地或者指定的郵件伺服器上打開標準SMTP埠25,然後MUA和MTA將開始一個對話,取決於兩種可能中的一種:
??郵件正在傳送到MTA,或者
??返回給MUA的錯誤狀態
SMTP是沒有認證功能的,所以發送郵件不要求用戶名和密碼,但是,大量的MTA拒絕接受既不是從本地用戶發送的,也不是發送給本地用戶的郵件。如果這樣的郵件被拒收,很有可能是因為轉信規則的設置導致的。請參見轉信查找具體配置。
4.2.2、/var/qmail/bin/sendmail
Sendmail作為UNIX的MTA有好多年了。它的存在太普遍了,大量的程序員僅僅認定Sendmail為MTA。結果Sendmail的本地諸如機製成為了標準的本地郵件注入(injection)應用程序員介面(Application Programmer』s Interface,API)。qmail和其他的類Sendmail的MTA提供了一個sendmail本地注入程序,和真正的Sendmail的同名程序以相同的方式工作。
qmail的sendmail,一般來說在/var/qmail/bin/sendmail,在qmail通常用來代替Sendmail的sendmail程序。sendmail程序典型的位置包括:
?? /usr/lib/sendmail
?? /usr/sbin/sendmail
在qmail系統里,」ls –l path-to-sendmail」可以看出sendmail是/var/qmail/bin/sendmail的一個符號鏈接。
$ ls -l /usr/lib/sendmail
lrwxrwxrwx 1 root root 29 Feb 19 11:04 /usr/lib/sendmail -> /var/qmail/bin/sendmail
sendmail的幫助頁(man page)提供了qmail下的應用程序。
4.2.3、qmail-inject
除了仿效sendmail API之外,i有自己的注入程序—qmail-inject。實際上,sendmail僅僅是qmail-inject的一個外包裝。
作為API,sendmail因為它的廣泛的應用,可能更好。qmail的API由qmail-inject提供,只能工作在qmail系統下,不過它和sendmail的界面介面幾乎是一樣的。
舉個例子,發送一個內容為空的郵件給joe@example.com:
# echo To: joe@example.com | /var/qmail/bin/qmail-inject
4.3、環境參數
某些qmail程序設置或者應用了環境變數。下面的表就是這些參數以及描述。
名稱 幫助頁 設置或應用 目的
DATABYTES qmail-smtpd 應用的 重載control/databytes
DEFAULT qmail-command 設置的 匹配.qmail 文件名內的"-default" 地址部分
DTLINE qmail-command 設置的 Delivered-To報頭區域
EXT qmail-command 設置的 地址擴展
EXT2 qmail-command 設置的 在第一個破折號之後的EXT部分
EXT3 qmail-command 設置的 在第二個破折號之後的EXT部分
EXT4 qmail-command 設置的 在第三個破折號之後的EXT部分
HOME qmail-command 設置的 用戶主目錄
HOST qmail-command 設置的 接收地址的域部分
HOST2 qmail-command 設置的 HOST的最後一個點之前的部分
HOST3 qmail-command 設置的 HOST的倒數第二個點之前的部分
HOST4 qmail-command 設置的 HOST的倒數第三個點之前的部分
LOCAL qmail-command 設置的 接收地址的local 部分
LOGNAME qmail-inject 應用的 在From頭部分的用戶名(4)
MAILHOST qmail-inject 應用的 在From頭部分的主機名(2)
MAILNAME qmail-inject 應用的 在From頭部分的人名(2)
MAILUSER qmail-inject 應用的 在From頭部分的用戶名(2)
NAME qmail-inject 應用的 在From頭部分的人名(3)
NEWSENDER qmail-command 設置的 轉發的收件人地址(參見 "man dot-qmail")
QMAILDEFAULTDOMAIN qmail-inject 應用的 重載 control/defaultdomain
QMAILDEFAULTHOST qmail-inject 應用的 重載 control/defaulthost
QMAILHOST qmail-inject 應用的 在From頭部分的主機名(1)
QMAILIDHOST qmail-inject 應用的 重載 control/idhost
QMAILINJECT qmail-inject 應用?指定不同的選項(參見下一個表)
QMAILMFTFILE qmail-inject 應用的 File containing list of mailing list addresses for Mail-Followup-To generation
QMAILNAME qmail-inject 應用的 指定不同的選項(參見下一個表)
QMAILPLUSDOMAIN qmail-inject 應用的 重載 control/plusdomain
QMAILSHOST qmail-inject 應用的 信封上的發件人地址的主機名
QMAILSUSER qmail-inject 應用的 信封上的發件人地址的用戶名
QMAILUSER qmail-inject 應用的 在From頭部分的用戶名(1)
RECIPIENT qmail-command 設置的 信封上的收件人地址
RELAYCLIENT qmail-smtpd 應用的 忽略 control/rcpthosts 並且附加接收人地址
RPLINE qmail-command 設置的 返迴路徑頭部分
SENDER qmail-command 設置的 信封上的發件人地址
UFLINE qmail-command 設置的 UUCP格式的 "From " 行
USER qmail-command 設置的 目前的用戶
USER qmail-inject 應用的 在From頭部分的用戶名(3)
qmail注入標誌位
字元 用途
c 在From頭部分應用地址註釋模式(address-comment style)
s 不考慮任何引入的返迴路徑部分(Return-Path field)
f 刪除所有引入的From部分
i 刪除所有引入的郵件ID部分
r 應用一個每用戶VERP
m 應用一個每郵件VERP
《解決方案》
五、提高(高級)話題
5.1、procmail
procmail是流行的郵件傳送代理(MDA)。MDA的功能是為特定的用戶從MTA接收郵件,然後按照用戶的意圖傳送郵件。procmail可以根據不同的頭部分或者郵件體內容來「過濾」郵件。舉個例子,從某個特定用戶發來的郵件可以被指引到只為著個用戶準備的信箱里。
在qmail下運行procmail有兩個訣竅,第一個,procmail通常用來傳送到一個郵件到/var/spool/mail下的mbox格式的郵箱。你可以重新安裝procmail使之傳送到預設目錄$HOME,或者指令用戶不依賴procmail傳送到mbox的預設位置。除非你修補procmail傳送到$HOME,procmail仍然會把/var/spool/mail作為臨時文件。
另外一個問題是qmail-command和procmail下的exit返回值不是普通理解上的含義。procmail應用標準UNIX返回值:零是成功,非零失敗。失敗的原因由/usr/include/sys/errno.h指示。但是qmail-command用確定的非零返回指示永久性錯誤,其餘的作為臨時返回值。可以用一個小的外殼(shell)外包腳本來為qmail-command翻譯exit返回值。這個腳本已經被發表在qmail列表上,可以在 http://www.ornl.gov/its/archives/mailing-lists/qmail/1998/04/msg00487.html下載
同樣,較老版本的procmail(3.14之前)不直接傳送郵件到maildir格式的信箱。你最好升級到最新版本的procmail。另外一個解決方式是safecat,這個程序通過標準輸入將郵件寫到指定的maildir。用戶可以編寫procmail的recipes(傳送指令),它用safecat來歸檔郵件。你也可以完全跳過procmail,用maildrop。
最後,procmail能夠接受的郵件格式是mbox,普通的qmail程序程序傳送僅僅包括郵件的實際部分,不包括」From」行。preline命令可以用來格式化procmail需要的郵件。
舉個例子,我們假設用戶」dave」需要用procmail處理他的郵件,dave的系統管理員已經設置了預設情況下讓procmail傳送郵件到$HOME而且編寫了一個退出代碼外包,來調用/usr/local/bin/qmail-procmail。他的.qmail文件應該是這樣寫的:
??/var/qmail/bin/preline /usr/local/bin/qmail-procmail dave
5.2、POP和IMAP伺服器
qmail包括一個POP伺服器,qmail-pop3d,不過在qmail的安裝和配置過程中,是不包括這個伺服器的。你也可以用其它的為Sendmail編寫的POP或IMAP伺服器,但是要在qmail下運行故且鮃恍┎鉤淶墓ぷ鰲?br />
5.2.1、qmail-pop3d
qmail-pop3d是包含在qmail里的POP伺服器。用起來很不錯,而且很多應用qmail的站點也同時用它。它是模塊化的,通過不同的認證模塊可以實現多種配置的認證。
注意:qmail-pop3d只支持maildir格式的郵箱,所以如果你的用戶登錄到POP伺服器或者本地運行MUA的話,都是需要maildir的支持的。如果你的所有用戶都是通過POP來收信的,那麼郵箱的格式就無關緊要了。
5.2.1.1、qmail-pop3d結構
qmail-pop3d伺服器包括三個模塊:
??qmail-popup—取 用戶名/密碼
??checkpassword—驗證用戶名/密碼
??qmail-pop3d—POP 守護進程
qmail-popup是很典型的通過inetd或者tcpserver來運行的程序,監聽110的POP3埠,當建立一個連接之後,提示輸入用戶名和密碼,然後調用checkpassword,蔥Q橛沒?密碼,如果通過校驗,則調用qmail-pop3d。
5.2.1.2、安裝qmail-pop3d
1. 完整的安裝和測試qmail。如果你像要所有用戶都擁有POP郵箱,確認defaultdelivery已經設置位./Maildir/,如果你是按照說明安裝的qmail腳本,那麼配置文件應該在control/defaultdelivery。如果沒有找到,很有可能在/var/qmail/rc裡面的qmail-start命令行。
2. 在http://www.qmail.org/top.html#checkpassword下載一個口令檢查程序。標準的checkpassword,在http://cr.yp.to/checkpwd.html也有一個,如果你想做點其他有趣的事的話。
3. 按照指導編譯並安裝checkpassword,確定你安裝在/bin/checkpassword。
4. 新建一個腳本/var/qmail/supervise/qmail-pop3d/run包含如下內容:
#!/bin/sh
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -v -R -H -l 0 0 110 /var/qmail/bin/qmail-popup \
FQDN /bin/checklocalpwd /var/qmail/bin/qmail-pop3d Maildir 2>&1
註: FQDN是設定的POP伺服器的全名,如:test.example.com。
5、新建一個腳本/var/qmail/supervise/qmail-pop3d/log/run包含如下內容:
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
/var/log/qmail/pop3d
6、建立記錄文件夾並使run腳本可執行,並使服務文件鏈接到/service:
# chmod +t /var/qmail/supervise/qmail-pop3d # if daemontools < 0.75
# mkdir /var/log/qmail/pop3d
# chown qmaill /var/log/qmail/pop3d
# chmod 755 /var/qmail/supervise/qmail-pop3d/run
# chmod 755 /var/qmail/supervise/qmail-pop3d/log/run
# ln -s /var/qmail/supervise/qmail-pop3d /service
7. 將下面代碼加入到qmailctl的 "start"段:
if svok /service/qmail-pop3d ; then
svc -u /service/qmail-pop3d /service/qmail-pop3d/log
else
echo qmail-pop3d supervise not running
fi
8. 將下面代碼加入到qmailctl的 "stop"段:
echo " qmail-pop3d"
svc -d /service/qmail-pop3d /service/qmail-pop3d/log
9. 將下面代碼加入到qmailctl的 "stat"段:
svstat /service/qmail-pop3d
svstat /service/qmail-pop3d/log
10. 將下面代碼加入到qmailctl的 "pause"段:
echo "Pausing qmail-pop3d"
svc -p /service/qmail-pop3d
11. 將下面代碼加入到qmailctl的 "cont"段:
echo "Continuing qmail-pop3d"
svc -c /service/qmail-pop3d
12. 將下面代碼加入到qmailctl的 "restart"段:
echo "* Restarting qmail-pop3d."
svc -t /service/qmail-pop3d /service/qmail-pop3d/log
5.2.2、Qpopper
如果你需要一個以mbox格式工作的POP守護程序的話,你可以用Qualcomm的qpopper。Vince Vielhaber作了一個能使它在用戶的主目錄下的郵箱工作的補丁,放在http://www.qmail.org/qpopper2.53.patch.tar.gz。qpopper可以在http://www.eudora.com/freeware/qpop.html得到。
5.2.3、Solid
Solid POP3伺服器支持maildir和mbox郵箱。主頁在http://solidpop3d.pld.org.pl/。
5.2.4、imap-maildir
David R. Harris整理了華盛頓大學(University of Washington)IMAP伺服器。文檔和安裝過程參見http://www.davideous.com/imap-maildir/。
5.2.5、Courier-IMAP
Sam Varshavchik編寫了一個只支持maildir郵箱的IMAP伺服器,見http://www.inter7.com/courierimap/。
5.3、POP和IMAP客戶端
5.3.1、fetchmail
fetchmail是一個從POP或者IMAP伺服器上接收並且本地重新注入的程序。fetchmail從qmail伺服器上接收郵件沒問題,可是作為qmail客戶端,要順利工作,還要知道兩個訣竅。
下面是一個範例,顯示了qmail系統下的一個.fetchmailrc文件:
poll mail.example.net proto pop3 nodns
user dsill with password flubgart is dave here
fetchall forcecr to * here
這些腳本指示fetchmail通過POP3連接mail.example.net,作為用戶dsill登錄,密碼是flubgart,接收所有郵件並轉送到dave@localhost上。forcecr這項使fetchmail通過SMTP注入郵件到本地系統的時候用會車鍵結束每一行,這是qmail要求的。
注意:fetchmail不是非常的可靠。如果重注入過程由於某種原因失敗(例如格式錯誤導致的反彈或者SMTP伺服器沒有運行),郵件將會丟失。
5.3.2、getmail
getmail接收POP郵件,傳送到maildir格式郵箱里。實際上它是一個Python腳本,所以你需要事先安裝Python解釋器。
getmail由Charles Cazabon編寫,它維護一個關於getmail的網頁http://www.qcc.sk.ca/~charlesc/software/getmail/。
5.4、多接收和逐一接收的比較
假設你是一個MTA,你的一個用戶發送一封郵件給三個在hoxtx.example.com上的信箱,有幾種方法可以接收它。
1、你可以建立一個SMTP到hostx的連接,發送一個郵件的副本給第一個信箱,一個副本給第二個信箱,一個給第三個,然後關閉連接。
2、你可以開三個進程,每一個都建立一個到hostx的連接,每個連接發送一個副本給每個信箱,然後關閉連接。
3、你可以建立一個SMTP連接到hostx,發送一個有三個地址的郵件副本,然後關閉連接。
第一個方法明顯的比第三個差,即使郵件很微小,多傳送一個副本同樣要耗費一定的時間。如果郵件很大,就會耗費相當多的時間和帶寬。
所以,排除第一個。
第二個和第三個方法很有意思。
第三個方法僅僅建立一個連接到hostx,只發送一個郵件的副本,是非常節約帶寬的方法。第二個應用多個連接發送多個副本,非常「浪費」帶寬,可是由於SMTP協議要求更小的來回延遲的特點,它是要比第三種方法更快的。而且比第三種方法更簡單,這樣就可以以更直接的方式編寫MTA的代碼。這可能有助於MTA解決VERP(見下節)。
qmail總是應用第二種方式(逐一接收)。沒有關於第三種方式(多接收)的補丁—這需要大量的工作。
雖然逐一接收比多接收要慢,可是簡單性和VERP的優勢重於前者。
單接收傳送比多接收應用更多的帶寬,可是這種差別常常只是誇大其詞,絕大多數郵件最多只有兩個接收者,而郵件的目的地通常是不同的主機,多接收對此毫無益處。至於在列表伺服器上,多接收可能是有用的,潛在的優點也是很微小的,因為SMTP在大多數連接中只用掉了帶寬的一小部分—HTTP留下的殘羹剩飯。
舉個例子,如果你的上行帶寬中10%用來聯繫SMTP,應用多接收能夠降低帶寬25%,僅僅降低你的SMTP帶寬到7.5%。
5.5、可變回複信封路徑 VERP
如果郵件未能傳送成功,MTA將按照信封上的返迴路徑(ERP)反彈郵件。被反彈的郵件必須有反彈接收者的地址,以及未能發送的原因,是否是暫時的還是永久性的問題。某些MTA可能作的並不好,可能反彈郵件給發送者的地址,或者反彈不校驗接收者。
對於大多數用戶-用戶郵件,這個毛病不是大問題,通常可以按照定時反彈和反彈內容解決。但是對於郵件列表,錯誤反彈就是嚴重的問題,如果訂閱者改變了接收地址,轉發郵件到新的地址,新地址出現傳送問題,他將不可能告知是那個方面中斷了。
Dan Bernstein提出VERP(Variable Envelope Return Path,可變信封回復路徑)解決這個問題。應用VERP每個發送給用戶的列表郵件都擁有一個完整的返迴路徑,這就使反彈控制者檢查問題用戶成為可能。
舉個例子,一個典型的非VERP郵件列表的返回地址形如listname-owner@domain,而VERP的返回地址是listname-owner-subscriber=sdomain@ldomain,這裡訂閱者的地址被嵌入在」owner」和」@」之間。(在訂閱者地址內的」@」被」=」代替)。
ezmlm列表管理程序應用VERP來自動控制反彈,ezmlm還提供了解決因為暫時的傳送問題導致列表郵件丟失的錯誤,訂閱者可以從存檔文件中重新接找回未能接收的郵件。
Russell Nelson為qmail下的Majordomo製作了一個反彈管理器,不過沒有繼續維護,可以在http://www.qmail.org/bounce
《解決方案》
5.6、問題處理
5.6.1、進程
一個能夠正常運行的,完整的,最小化安裝的qmail應該有下面四個進程:
??qmail-send由用戶qmails運行
??qmail-clean由用戶qmailq運行
??qmail-rspawn由用戶qmailr運行
??qmail-lspawn由用戶root運行
下面的命令格式和你應用的UNIX有關,能列出上面的這些進程,可能會少一些:
# ps -ef | grep qmail
# ps waux | grep qmail
例如:
$ ps waux|grep qmail
dave 2222 0.0 0.8 836 348 p4 S 10:25 0:00 grep qmail
qmaild 351 0.0 1.0 840 400 ? S N 12:43 0:00 /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 49491 -g 31314 0 smtp /var/qmail/bin/qmail-smtpd-
qmaild 2220 0.0 1.0 844 420 ? S N 10:25 0:00 /usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u 49491 -g 31314 0 smtp /var/qmail/bin/qmail-smtpd-
qmaill 365 0.0 0.8 748 344 ? S N 12:43 0:00 splogger qmail
qmailq 368 0.0 0.7 736 292 ? S N 12:43 0:00 qmail-clean
qmailr 367 0.0 0.6 732 272 ? S N 12:43 0:00 qmail-rspawn
qmails 350 0.0 0.8 776 336 ? S N 12:43 0:00 qmail-send
root 340 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/qmail-send /var/qmail/rc
root 341 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/tcpserver-qmail /usr/local/bin/tcpserver -v -x /etc/tcp.smtp
root 366 0.0 0.7 736 276 ? S N 12:43 0:00 qmail-lspawn ./Mailbox
$
如果你在supervise下運行qmail,作為上面的例子,你也能能夠看到那些進程。如果你在tcpserver下運行qmail-smtpd,你可以看到一個tcpserver父進程加一個另外的處理每個引入的SMTP的進程。
如果你用splogger(或者multilog或者cyclog)控制日誌,你還有一個splogger(或者multilog或者cyclog)進程或者兩個由用戶qmaill運行的進程。
同樣,如果qmail忙於傳送郵件本地和遠程主機的時候,你可以在上面看到concurrencylocal qmail-local(本地)進程和concurrencyremote qmail-remote(遠程)進程。
5.6.2、日誌
5.6.2.1、splogger
splogger應用syslog 日誌記錄系統給郵件打時間戳,然後送交syslog守護進程。syslog的配置文件在/etc/syslog.conf。sysloge通過郵件具有的****和優先權分配郵件到指定的日誌文件,遠程日誌,或者控制台。splogger預設記錄郵件的****,所以你在syslog.conf文件裡面用grep查找字串」mail」,可以看出qmail郵件郵件郵件日誌記錄的部署情況。
典型的位置包括:
/var/log/syslog
/var/adm/SYSLOG
/var/log/maillog
典型的syslog記錄入口看起來類似於:
Jun 3 11:35:23 sparge qmail: 928424123.963558 delivery 153: success: did_1+0+0/
"Jun 3 11:35:23" 是syslog時間戳
"sparge" 是發送郵件系統的名字
"qmail:" splogger置於所有qmail 日誌入口
"928424123.963558" 是一個可選的TAI時間戳(見下節)
"delivery 153: success: did_1+0+0/" 是郵件日誌本身
5.6.2.2、multilog
multilog,記錄郵件日誌為一系列指定目錄下的文件,multilog是daemontools包的一部分。
日誌紀錄文件夾由multilog的命令行來設定,qmail的啟動腳本能夠找到這個命令。
multilog的選項決定了日誌紀錄文件夾內的文件的最大大小,以及文件的個數。日誌文件的文件名是根據文件開始記錄時的TAI( Temps Atomique International )時間戳命名的。這個tai64nlocal命令,同樣來自daemontools,轉換TAI時間戳為本地,易讀時間戳。
一個典型的multilog日誌入口:
@4000000038c3eeb104a6ecf4 delivery 153: success: did_1+0+0/
" @4000000038c3eeb104a6ecf4 " 是TAI時間戳,是可選的,建議你選上它,
" delivery 153: success: did_1+0+0/ " 是郵件收發紀錄。
5.6.2.3、郵件日誌紀錄
下面的是一個典型的從本地系統發送郵件到遠程系統的郵件紀錄:
1 @4000000038c3eeb027f41c7c new msg 93869
2 @4000000038c3eeb027f6b0a4 info msg 93869: bytes 2343 from qp 18695 uid 49491
3 @4000000038c3eeb02877ee94 starting delivery 2392: msg 93869 to remote lwq@w3.to
4 @4000000038c3eeb0287b55ac status: local 0/10 remote 1/20
5 @4000000038c3eeb104a13804 delivery 2392: success: 209.85.127.177_accepted_message.
/Remote_host_said:_250_CAA01516_Message_accepted_for_delivery/
6 @4000000038c3eeb104a4492c status: local 0/10 remote 0/20
7 @4000000038c3eeb104a6ecf4 end msg 93869
第1行顯示qmail接受了一個新郵件,隊列標示符為93869,這個標示符其實是包含這個郵件的 /var/qmail/queue/mess/NN/ 文件的i節點數。標示符保證了在隊列內的郵件的唯一性。
第2行顯示了這個郵件來自dave@sparge.sill,大小是189位元組。
第3行顯示了qmail-remote開始傳送郵件到lwq@w3.to,並且分配給這個傳送標示符2392。
第4行顯示0本地傳送和1遠程傳送在傳輸中。
第5行顯示2392傳送已經成功完成,返回遠程伺服器的回應,這個紀錄里通常包含了遠程郵件主機的管理者可能需要的對於這次傳送的跟蹤信息。在這個例子里,"CAA01516" 是遠程系統的傳送標示符。
第6行顯示0本地傳送和0遠程傳送在傳輸中,也就是說,傳送完成了。
第7行顯示郵件已經被傳送並且被移出隊列,這裡,隊列標示符93869被重用到其它的傳送。
5.7、大型伺服器
同時參見qmail-ldap。
5.7.1、可升級并行系統
應用快速NFS網路文件伺服器存儲用戶目錄。建立多個等優先順序SMTP伺服器來傳送郵件到文件伺服器上的maildir郵箱。
5.8、從Sendmail到qmail的轉移
首先,參考Dan Bernstein的Sendmail到qmail頁:http://cr.yp.to/qmail/sendmail.html。
5.9、郵件列表管理器
郵件列表管理器(MLM』s)能夠幫助郵件列表的擁有者管理列表,管理任務分擔為兩個主要部分:管理訂戶,控制訂戶的郵件重發。
大多數(所有的?)UNIX郵件列表管理器都可以被應用在qmail下。
5.9.1、ezmlm
ezmlm由Dan Bernstein編寫,他也是qmail的作者。ezmlm是為qmail編寫的,為qmail的幾個特點支持,特別顯著的是,ezmlm應用VERPs來可靠的處理反彈郵件。相對於其他郵件列表管理器(MLM』s),ezmlm有點獨特的地方是它不處理髮送到列表主地址的命令,而是附加在列表名字後面的命令,例如:如果你要訂閱」foo@list.example.net 」列表,需要發信到foo-subscribe@list.example.net。
需要更多關於ezmlm的信息,請參考http://www.ezmlm.org/,這是很有用的東西。
5.9.2、Majordomo
Majordomo是最受歡迎的UNIX郵件列表管理器,如果有一些簡單的修改,它能和qmail共同運行的相當好。Russ Allbery撰寫了一個關於qmail/Majordomo的FAQ,http://www.eyrie.org/~eagle/faqs/mjqmail.html。
5.10、補丁
下載補丁
http://www.ckdhr.com/ckd/qmail-103.patch
http://www.qmail.org/qmailqueue-patch
http://www.shupp.org/patches/qmail-maildir++.patch
http://qmail.te8.com/rpms/glibc-2.3.1/qmail-1.03.errno.patch
http://qmail.te8.com/rpms/glibc-2.3.1/qmail-1.03.qmail_local.patch
http://members.elysium.pl/brush/qmail-smtp-auth/dist/qmail-smtpd-auth-0.31.tar.gz
進入qmail源代碼目錄,運行patch命令來安裝補丁。
# cd /usr/local/src/qmail/qmail-1.03
# patch -p0
通過結束qmail-send進程或者依靠qmail的啟動腳本使qmail停止:
# qmailc stop
然後重新編譯安裝二進位代碼:
# make setup check
5.11、快速郵件傳送協議(QMTP)
QMTP,快速郵件傳輸協議(Quick Mail Transfer Protocol),由Dan Bernstein設計的SMTP的替代協議。這個協議的定義在http://cr.yp.to/proto/qmtp.txt。QMTP與SMTP相似,而且更簡單,更快,和SMTP兼容。qmail包括QMTP伺服器,qmail-qmtp,非常類似於qmail-smtp。QMTP通常應用埠209。
qmail不包括QMTP客戶端,serialmail裡面包括一個客戶端。maildir2qmtp通過QMTP傳送一個maildir郵箱下的郵件到指定的QMTP伺服器。
QMTP並不是一個SMTP的代替品,在互聯網上應用也不是很廣泛。