| 導購 | 订阅 | 在线投稿
分享
 
 
 

Life with qmail -- 中文版

來源:互聯網  2008-05-31 00:03:28  評論

原(英)文作者: Dave Sill 本中文版發布時間:14 Apr, 2006原文web地址:http://www.lifewithqmail.org/翻譯:Jerry Zhou (Jerry underline ZhiJun(@)21cn.com)

原始版權由作者Dave Sill擁有

中文翻譯版使用權由原作者和翻譯者共同所有, 請不要用于商業用途.

轉載, 刊登, 摘錄請首先取得原作者和譯者的同意

中文版上一版爲2003年8月16日, 這個舊版本的討論和取得請訪問這裏:lwq2003.justso.cn,

這個版本的討論主頁設在linuxforum 的郵件和DNS服務器版面,可以訪問這裏到達 lwq2006.justso.cn.

本文爲完整的中文版本. 這個版本由Dave Sill收藏于http://www.lifewithqmail.org/.

謹以此翻譯的勞動致謝我的父母, 姐姐一家以及很多朋友和同事.

也可以通過我的blog地址找到我: www.justso.cn

紫色小字號爲譯者注, 包括英文原文考量和一些基礎知識.

文中將統一應用英文逗號(,) 和句號(.) 以及引號(")等英文標點符號.

如果哪位港台同胞樂意制作Big5碼的版本, 請和我聯系.Jerry underline ZhiJun(@)21cn.com. 如果你對裏面翻譯的文字有任何意見和商榷, 請e-mail譯者, 我們一起來把LWQ翻譯的更好! 給譯者信箱發送郵件, 請指定標題爲"For Translations of LWQ". 否則將被作爲垃圾郵件處理, 不情之請, 希望見諒.

中文翻譯 版本: 2006-4-14

下面是這個版本和2003-8-16版本相比的更新修正:

本版本安裝部分完全遷移到netqmail, 相應有比較大的修改; 和2003-8-16相比, 目錄和內容中增加了5.12, 5.13 兩節; 附錄G17, G18 兩節; 其他增加的小節和內容不一一贅述; 修改了附錄H9的部分贊助連接和文字; 修改了附錄H10所有文字, 增加修改了H.10.1 - H.10.7 的內容; 修改了很多翻譯BUGs和筆誤, 潤色了一些語句, 糾正了矛盾的語句; 核對了所有增加的和修改的鏈接和文字, 重新核對了全文; 核對了所有代碼, 是否是

結構, 便于直接複制;

以下爲Life with qmail 中文版正文

目錄1. 介紹 1.1. 適合閱讀本文的讀者

1.2. 什麽是qmail?

1.3. 爲什麽用qmail?

1.4. 發展曆史

1.5. 特點

1.6. 相關的軟件包

1.7. 體系結構

1.8. 版權許可信息

1.9. 和其他MTA相比較

1.10. 文檔

1.11. 技術支持

2. 安裝 2.1. 不同的安裝形式以及相互的比較

2.2. 准備工作

2.3. 系統要求

2.4. 下載源代碼

2.5. 編譯源代碼

2.6. 安裝 ucspi-tcp

2.7. 安裝daemontools

2.8. 運行 qmail

2.9. 測試

3. 配置 3.1. 配置文件

3.2. 中繼轉信

3.3. 多主機名

3.4. 虛擬域

3.5. 別名

3.6. 關于 qmail-users

3.7. 反垃圾郵件

3.8. 病毒掃描

4. 使用方法 4.1. .qmail 文件

4.2. 發送郵件

4.3. 環境變量

5. 高級話題 5.1. 關于 procmail

5.2. POP 和 IMAP 服務器

5.3. POP 和 IMAP 客戶端

5.4. Multi-RCPT 與 Single RCPT 傳送方式的比較

5.5. 關于 VERP

5.6. 故障處理

5.7. 大型服務器

5.8. 從 Sendmail 轉移到 qmail

5.9. 郵件列表管理器

5.10. 補丁

5.11. QMTP

5.12. 在SMTP對話過程中拒絕非法接收者

5.13. TLS 和 STARTTLS

附錄 A. 致謝

附錄 B. 相關軟件包介紹 B.1. dot-forward

B.2. fastforward

B.3. ucspi-tcp

B.4. daemontools

B.5. qmailanalog

B.6. rblsmtpd

B.7. serialmail

B.8. mess822

B.9. ezmlm

B.10. safecat

B.11. djbdns

B.12. maildrop

B.13. syncdir

附錄 C. 因特網郵件工作原理 C.1. 郵件如何從A點到達B點

C.2. 其他資料

附錄 D. 體系結構 D.1. 模塊化系統結構

D.2. 文件結構

D.3. 隊列結構

D.4. 圖片

附錄 E. 一些不常見的問題 E.1. qmail如何處理延期發送的郵件?

E.2. 爲什麽我無法給一個有很多MX記錄的大站點發送郵件?

E.3. QUEUE_EXTRA是什麽?

附錄 F. 錯誤訊息

附錄 G. 新手常見問題 G.1. qmail 不能給超級用戶發郵件

G.2. qmail 不能給沒有主目錄的用戶發郵件

G.3. qmail 不能給名字含有大寫字符的用戶發郵件

G.4. qmail 處理擴展地址的時候用冒號(:)替換掉了點(.)

G.5. qmail 處理擴展地址的時候把大寫字符轉換成了小寫字符

G.6. qmail 不使用/etc/hosts 文件.

G.7. qmail 不在日志記錄 SMTP 的活動

G.8. qmail 不生成郵件延遲通知

G.9. qmail 由于/var/qmail/queue/lock/trigger 文件丟失、權限設置錯誤或者錯誤的文件屬性設置等原因變的很慢

G.10. DNS 或者 IDENT 查詢使 SMTP變慢

G.11. 回車(Return)和換行(CRLF) 不同

G.12. 日志回滾造成qmail-send 和 tcpserver 停止

G.13. qmail-smtpd 不能使地址的本地部分生效

G.14. 設置防火牆導致遠程無法連接 SMTP/POP3/IMAP 服務器

G.15. 如果USER 和 LOGNAME 沒有設置的話, qmail-inject 將設置郵件發送方字段(From)爲匿名(anonymous)

G.16. 停止qmail-send進程的時候, 它不總是立即退出.

G.17. 不能通過把郵件傳送到/dev/null 將郵件丟棄.

G.18. qmail-send 正在運行過程中修改郵件隊列是危險的.

附錄 H. 關于本文Life with qmail 的常見話題 H.1. 這個Life with qmail 的版本是多少?

H.2. 誰擁有Life with qmail?

H.3. Life with qmail 的版權信息?

H.4. 我怎麽取得新版 LWQ 的發布通知?

H.5. 在哪裏可以爲 LWQ 投稿, 捐助以及討論它?

H.6. Life with qmail 被翻譯成其他語言了嗎?

H.7. Life with qmail 有沒有 PostScript, PDF, plain text, 或者其他任何除了HTML的格式?

H.8. 我按照 Life with qmail 說的作了, 可是我的系統崩潰了, 或者弄壞了我的硬盤, 或者毀了我的愛情, 或者弄死了我的狗, 等等問題, 我該怎麽辦? (這屬于老外的幽默啦. ^_^, 譯者注)

H.9. 我怎麽爲 LWQ捐贈和投稿?

H.10. 這個版本的LWQ有那些變化呢?

1. 介紹1.1. 適合閱讀本文的讀者Life with qmail 的目標讀者是那些對qmail有興趣, 卻被歸類于業余愛好者, 新手的人, 那些在一台空閑(原文爲: a spare PC 譯者注)PC機上操作Linux, 希望日後成爲經驗豐富的系統管理員或郵件系統管理員的人寫作的. 如果你發現文章中有缺陷或者不清楚的地方, 請用電子郵件告訴我. (英文) lwq at sill dot org. (譯者的電子郵件: Jerry underline ZhiJun(@)21cn.com 譯者注).

各種不同的來源存在著豐富的 qmail相關信息. 其中一些是以新手爲目標, 另外一些假定讀者具有比較多的經驗, Life with qmail 就是一篇試圖成爲"膠水"性質的文章, 集合這些信息爲一體, 不過讀者必須首先掌握下面這些基礎知識:

在UNIX環境下熟練的操作文件和目錄的能力 會使用web浏覽器和FTP客戶端軟件 能夠讀懂下面的使用方法 1.2. 什麽是 qmail?qmail是一個因特網郵件傳送代理, (英文: Mail Transfer Agent, 簡寫爲MTA, 譯者注) 它運行在UNIX兼容系統下, 是一個直接代替UNIX下 Sendmail軟件的郵件傳送程序. qmail 使用簡單報文傳送代理協議 SMTP 傳輸郵件(Simple Mail Transfer Protocol).

注意: 它的名字是 "qmail" , 而不是 "Qmail".

1.3. 爲什麽用 qmail?你的操作系統如果包含一個MTA, 那很有可能是Sendmail, 而你閱讀了下面的文檔之後, 你可能想(抛棄Sendmail, 另外)找一個更好的MTA了.

1.3.1. 安全qmail 是面向安全而設計的. Sendmail 的曆史上出現過很多嚴重的安全問題. 在編寫Sendmail的時代, 網絡是非常友好的地方, 每個在網上交流的人都能夠很容易的了解對方, 幾乎沒有必要爲了安全而設計軟件, 編寫代碼. 而現在的因特網對于網絡服務器卻是險象叢生. Eric Allman, Sendmail的作者, 和目前的維護者Claus Assman 爲了加強Sendmail的安全做了很多工作, 但是無論如何, 除了重新設計, 怎樣的修正也不能讓Sendmail達到真正的安全.

1.3.2. 性能qmail 並行處理郵件傳送, 缺省配置情況下, 能夠達到20個並行郵件同時傳送.

1.3.3. 可靠性qmail保證已經接收的新郵件不被丟失, qmail使用一種新的郵箱格式, 其可靠性超過了沒有文件鎖的NFS存儲系統.

1.3.4. 簡單Simplicityqmail 比其他實現同樣功能的MTA都要小.

注意: qmail 的正式主頁, http://cr.yp.to/qmail.html 有更多的 qmail 特色介紹.

1.4. 發展曆史qmail由 Dan Bernstein (DJB)編寫, 關于他可以參考這裏http://en.wikipedia.org/wiki/Daniel_J._Bernstein. 他現在任職于 Illinois 大學 Chicago 分校數學教授. 它在密碼術研究方面的工作, 以及他關于密碼術源代碼的出版問題對美國政府的訴訟也是很有名的, 關于這次訴訟的情況詳見 http://en.wikipedia.org/wiki/Bernstein_v._United_States 或 http://cr.yp.to/export.html 查看關于訴訟的信息. (可能wikipedia在中國大陸無法訪問, 請參考使用代理或其他方式. 譯者注)

第一個公開發行的 qmail 版本是1996年1月24日發表的 0.70 beta 版. 第一個 gamma 發行版是在1996年8月1日的0.90版.

第一個常規發行版本是1.0, 時間是1997年2月20日. 現在使用的1.03版本, 發行于1998年6月15日.

預期下一個版本將是2.0評估版, 即將在2.0版裏面出現的一些新功能可以在http://cr.yp.to/qmail/future.html 找到.

1.5. 特點 qmail 的web頁 http://cr.yp.to/qmail.html 列出了非常全面的qmail的特點. 本節即針對這個頁面列出的特點予以著重介紹.

1.5.1. 安裝自動適應于UNIX的各種版本 自動適應于單主機配置 快速安裝--不必作大量的配置工作 1.5.2. 安全 地址, 文件以及程序之間分隔清晰 最少限度的應用setuid編碼 最少限度的應用root編碼 五個不同權限信任級別區隔運行(指利用五個分隔的uid運行qmail的不同功能模塊. 譯者注) --深入的安全保障 可選的郵件單向散列計算功能, 包括整個郵件內容的hash計算等功能. (參考 附錄 E 的什麽是 QUEUE EXTRA?) 1.5.3. 郵件結構 符合RFC 822 和RFC 1123 標准. 郵件地址組的完整支持. 自動轉換舊格式地址爲RFC 822 格式. 支持sendmail命令, 與目前的郵件用戶代理兼容. 僅受限于內存大小的長郵件頭支持. 主機僞裝(參見 defaulthost) 用戶僞裝(參見 MAILUSER和 MAILHOST) 自動生成郵件跟蹤列表(參見 QMAILMFTFILE ) 1.5.4. SMTP 服務 兼容 RFC 821, RFC 1123, RFC 1651, RFC 1652, 和 RFC 1854 標准 全 8-bit 操作(qmail直接對郵件進行8bit操作. 譯者注) 支持 RFC 931/1413/ident/TAP 回查--用來跟蹤垃圾郵件和僞造郵件 轉信控制--阻止未授權的外來轉信請求. 自動識別本地IP地址. 每緩沖超時 躍點計算 並行訪問限制(通過 ucspi-tcp) 對已知的垃圾郵件發送者, 拒絕連接(通過 ucspi-tcp) 支持授權用戶轉信和消息重寫 可選的黑洞名單(Realtime Blackhole List, RBL)和開放轉信系統修正(Open Relay Behavior-modification System, ORBS) 支持(通過 rblsmtpd) 1.5.5. 隊列管理對加入隊列的郵件即時處理 並行處理限定 分割隊列目錄--隊列很大時不降低處理速度 二次冪重試時間表排定算法--隊列內越陳舊的消息得到的發送機會相對新消息越小 (參考 附錄 E) 每個郵件獨立的重試時間表 自動安全隊列--系統崩潰情況下不丟失郵件. 自動每郵件接收者檢查 自動隊列清除 隊列觀察(參看 qmail-qread) 詳細的傳送過程分析 (通過 qmailanalog)1.5.6. 郵件反彈 QSBMF反彈郵件--包括機器易讀和人類易讀兩種格式 HCMSSC 支持--不受語言約束的 RFC 1893 錯誤代碼 發送兩次反彈郵件給系統管理員(postmaster) 1.5.7. 基于域名的郵件路由 支持任意數量的本地主機名(參看 locals) 支持任意數量的虛擬域 (參看 virtualdomains) 支持域名通配符 (參看 virtualdomains) 可配置的"percent hack"支持 (參看 percenthack) UUCP 鈎 (UUCP hook) 1.5.8. SMTP 傳輸 兼容 RFC 821, RFC 974, 和 RFC 1123 協議 全8-bit字符支持 對關閉的主機自動延遲處理 人工路由--smarthost, localnet, mailertable (參考 smtproutes) 每緩沖超時設定 被動SMTP隊列--對(低速)SLIP/PPP線路的完美支持 (通過 serialmail) Auto TURN支持 (通過 serialmail)1.5.9. 轉發和郵件列表 兼容Sendmail的 .forward控制文件(通過 dot-forward). 散列的轉發數據庫(通過 fastforward) 兼容Sendmail的 /etc/aliases 控制文件(通過 fastforward) 地址通配符 (參見 .qmail-default) 郵件列表所有者--自動轉移反彈郵件和假期郵件 VERPs--自動郵件列表反彈郵件接收者識別 自動防止循環成環郵件傳送, 甚至可以避免對于交叉串聯主機的配置方式成環郵件傳送 1.5.10. 本地(郵件)傳送 支持用戶控制的地址分級--任意FRED(Fast Random Enquiry Display 快速隨 機詢問顯示, 譯者注) mbox傳送 可靠的NFS傳輸(參見 maildir) 支持用戶可控的郵件程序傳送, 比如procmail等, (參見 qmail-command) 可選的新郵件通知(參見 qbiff) 可選的NRUDT返回收條(參見 qreceipt) 條件過濾(參見 condredirect 和 bouncesaying) 1.5.11. POP3 服務 兼容 RFC 1939 支持UIDL 支持TOP APOP鈎 模塊化的密碼檢查(通過 checkpassword) 1.6. 相關的軟件包qmail遵循經典UNIX哲學: 每個軟件工具都要有專一的, 規範良好的功能; 而複雜的功能應該由一系列多個獨立的簡單工具聯合完成, 形成一個"流水線"模式. 另外一種方式是在更爲簡單的工具上不斷的建立和豐富越來越複雜的的功能來完成大量的複雜的功能.

qmail並沒有擁有所有人要求的任意功能, 這點並不令人驚訝驚訝. 相反的, qmail擁有的是一些實現那些功能的流行的插件(add-ons). 當然了, 許多標准UNIX實用工具也都可以作爲插件和qmail協同工作. 下面介紹一些插件:

dot-forward --一個兼容Sendmail的.forward控制文件的插件 fastforward -- 一個兼容Sendmail別名數據庫的插件 ucspi-tcp -- 一個inetd超級服務器的替換程序 daemontools -- 一個管理後台服務程序以及日志的工具套件 qmailanalog -- 一個qmail日志文件分析工具套件 serialmail -- 用于低速網絡郵件傳送的工具 mess822 -- 一個對因特網郵件的進行分析的工具 ezmlm -- 一個基于qmail的管理郵件列表的工具 1.7. 體系結構 附錄 D 介紹了qmail的功能和結構. 簡單的說, qmail包含了一系列的程序(模塊)來完成不同的任務.

1.8. 版權許可信息qmail的版權由作者Dan Bernstein所有, qmail沒有和用戶權利聲明一同發布. 在web頁面 http://cr.yp.to/softwarelaw.html 上, 作者Dan Bernstein概要陳述了他認爲用戶在美國版權法下擁有的權利和義務. 在web頁 http://cr.yp.to/qmail/dist.html 上描述了作者授權給qmail的源代碼分發用戶的權利和義務. 二進制發行遵循條款在下面這個web頁面上可以找到 http://cr.yp.to/qmail/var-qmail.html, 也可以參考這裏: http://en.wikipedia.org/wiki/License-free_software.

發行權限的最底線: 你可以將qmail用于任何用途, 你可以再次分發未修改的qmail源代碼和有資格的var-qmail二進制發行包, 你也可以發行qmail補丁程序. 但是你不能發行修改過的qmail源代碼和non-var-qmail二進制發行包.

1.9. 和其他MTA相比較 這個題目完全可以寫一本書啦. 不過可能是很單調乏味的一本. 這裏給出一個qmail和其他最常見的UNIX MTA的快速比較表格(中: medium, 高: high, 低: low, 是: yes, 否: no, 插件: addons, 可選的: optional. 譯者注)

MTA

成熟度

安全性

特色

性能

是否兼容Sendmail

模塊化

qmail

插件

Sendmail

-

Postfix

exim

Courier

可選的

兼容Sendmail意思是MTA運轉是否類似于Sendmail, 從而可以在某種用戶透明度上從此MTA和Sendmail之間過渡和切換, 比如.forward控制文件, /etc/aliases文件以及是否傳送郵件到目錄 /var/spool/mail等等行爲.

Jonathan de Boyne Pollard 曾經回顧了很多UNIX下的MTA, web頁面在http://homepages.tesco.net/~J.deBoynePollard/Reviews/UnixMTSes/ . 另外一個很詳細的的比較文章請參考http://www.geocities.com/mailsoftware42/. (geocities可能在國內無法直接訪問. 譯者注)

1.10. 文檔 1.10.1. man 幫助手冊 qmail發行包包含了完整的man手冊. 安裝qmail之後, 他們通常位于 /var/qmail/man. 你可能需要自己手動增加這個手冊目錄路徑到你的環境變量MANPATH裏面.

Shell 解釋器

命令行

Bourne (/bin/sh)

MANPATH=$MANPATH:/var/qmail/man; export MANPATH

bash, Korn

export MANPATH=$MANPATH:/var/qmail/man

C Shell

setenv MANPATH $MANPATH:/var/qmail/man

(上面表格爲各個不同shell下運行的增加環境變量的命令行格式, 故不予翻譯, 用戶也可以參考man man來查閱直接指定man的指定目錄開關的設定, 在Bourne下, 這個開關一般是 -M.譯者注) (修改環境變量之後) 用型如"man name-of-qmail-man-page"的命令格式即可調出相關的手冊頁面.

也可以訪問man手冊頁面的在線web頁面形式, 地址是:

http://www.qmail.org/man/index.html

注意: qmail的man手冊頁面承載了大量的信息, 它的寫作語言偏重技術術語, 可能相當晦澀難懂, 必須仔細加以研讀. 你可能需要通讀一遍來熟悉它. 因爲很少有重複性的內容, 你必須首先知道裏面都寫了哪些內容,以及你感興趣的那些內容在哪裏, 否則你可能根本找不到你要的東西.

1.10.2. 文檔 qmail發行版包含了一系列文檔, 通常安裝在/var/qmail/doc目錄下. 它們包括以下內容: (本文中默認的兩個位置,一個就是文檔的根位置/var/qmail/doc, 這個位置的文檔也通常被作者描述爲qmail源代碼文件目錄下的doc文檔, 內容是一致的. 還有一個就是qmail 的安裝後的主目錄下的控制文檔, 通常爲/var/qmail/control下面, 在很多情況下, 作者並不明確指出這兩個具體位置. 譯者注)

FAQ: 常見問題以及回答. INSTALL.* 文件集: 安裝文檔. PIC.*文件集: 描述了qmail如何完成核心任務的文檔. 查找更多相關信息, 請參看附錄體系結構. 其他幾個安裝相關文檔. 這些文檔也可以在線查看, 請到web頁面:

http://www.qmail.org/man/index.html1.10.3. 常見問題 FAQs有兩個正式的常見問題(Frequently Asked Questions, FAQ. 附相關回答)文檔:

/var/qmail/doc/FAQ 目錄下, 純文本版本, 以及 web頁面FAQ, 地址: http://cr.yp.to/qmail/faq.html.web頁面的FAQ更完整一些.

1.10.4. 書籍1.10.4.1. qmail 手冊 (英文書名: The qmail Handbook) 作者Dave Sill, 也是本文Life with qmail的作者, 曾經爲Apress(http://www.apress.com/)出版社撰寫了一本qmail書籍. 這本qmail 手冊 (英文書名: The qmail Handbook), 包括了本文所有內容, 某些方面更爲詳細, 同時也介紹了大量的新領域.

更多信息, 請參看 http://www.apress.com/catalog/book/1893115402/. 需要在我的書店定購本書, 請到我和Amazon.com合作書店 http://www.amazon.com/exec/obidos/ASIN/1893115402/davesill.

1.10.4.2. qmail (英文書名: qmail) 據報道, John Levine爲O'Reilly %26amp; Associates (http://www.oreilly.com/)出版社寫作的一本qmail書籍.

1.10.4.3. Running qmail (英文書名: Running qmail) 作者Richard Blum, Sams出版. 這本書被認爲接受了qmail郵件列表裏面的各種觀點.

定購本書, 請參看 http://www.amazon.com/exec/obidos/ASIN/0672319454/davesill.

"1.10.4.4. qmail: Yuksek Performansli E-Posta SunucuIsmail Yenigul, 以及其他人著作的qmail 書籍. 參見 http://www.acikakademi.com/catalog/qmail/.

1.10.5. 郵件列表文檔 qmail的郵件列表, 由Dan Bernstein 維護, 極爲有價值的信息來源. web文檔保存在以下位置:

http://www.ornl.gov/its/archives/mailing-lists/qmail/.這個文檔的一個搜索引擎位置在:

http://www-archive.ornl.gov:8000/.其他web文檔可以在以下地址訪問到:

http://www.egroups.com/list/djb-qmail/?refstop=1 和 http://msgs.securepoint.com/qmail/.大多數關于qmail的問題的答案都可以首先在這個郵件列表的文檔裏面搜索到.

1.10.6. 其他Web站點 http://cr.yp.to/qmail.html : qmail的正式主頁. http://www.qmail.org/. qmail的非正式主頁. 包含了大量關于功能插件和補丁的信息, 以及很多很棒的關于qmail的web頁面的鏈接. http://www.flounder.net/qmail/qmail-howto.html: Adam McKenna 制作的HOWTO. 1.11. 技術支持 1.11.1. 郵件列表 下面的這些列表位于主機 list.cr.yp.to. 爲了防止被發送垃圾郵件者獲取地址, 我沒有使用完整有效的郵件地址, 以及"mailto"格式的URL.(這裏隱去了真實的listname, 具體請參看qmail的正式主頁介紹或者查看1.11.1.節, 也就是本節的幾個小節的帶有下劃線的英文標題名字, 譯者注)

這些郵件列表由ezmlm管理, 使用不同的地址實現不同的功能.

listname@list.cr.yp.to: 訂閱地址. 發送到這個地址的郵件將會被發送給列表的所有用戶. 請不要發送訂閱和退訂要求到這個地址, 這樣作是無效的, 而且還會打擾其他訂閱者. listname-help@list.cr.yp.to: 這是"幫助"地址. 發送郵件到這個地址將會返回使用信息. listname-subscribe: 發送空消息到這個地址訂閱列表. listname-unsubscribe: 發送空消息到這個地址退訂列表. 舉例, 一個訂閱或者退訂地址, 比如 joe@example.com, 發送郵件到這個地址訂閱列表:

listname-subscribe-joe=example.com@list.cr.yp.to.1.11.1.1. qmail這是一個主要的qmail郵件列表.討論和提問/回答很多有關于qmail的問題. 不過不包括有關于他們自己的列表的問題. 在這個列表提問之前請閱讀Charles Cazabon的"12 Steps to qmail List Bliss" web頁面位置http://pyropus.ca/personal/writings/12-steps-to-qmail-list-bliss.html .同時請首先閱讀FAQ或者在這裏搜索列表的過去的文章. 提問的時候, 請盡量包含充分詳盡的細節, 便于其他人回答. 請注意以下這些提問要點:

你做了什麽? 你的配置? 如果你不清楚哪些比較重要, 那就把qmail-showctl 的輸出算上. 你都做了那些舉動? 如果是新安裝的qmail, 講述一下你如何安裝的. 你期待發生什麽? 你想達到一個什麽目的? 不要假設讀者會猜到你的想法. 曾經發生了什麽? 描述一下實際的結果. 包括log文件的部分剪輯, 消息的副本, 包括頭部分. 注意: qmail的郵件列表使用了一個叫做qsecretary的工具來校驗投遞到列表的郵件是否是垃圾郵件. 每封到達列表的郵件都會首先由qsecretary返回一個確認郵件. 用戶閱讀確認郵件並且按照返回郵件上的指令確認你的郵件--通常就是回複qsecretary的確認信息就可以了. 經常在列表投遞的訂戶一般使用類似Charles Cazabon編寫的pymsgauth (在這裏http://pyropus.ca/software/pymsgauth/.) 的自動回複程序來自動完成郵件確認. pymsgauth 校驗發往列表的郵件的確是你發出的, 所以它不會確認那些冒充你的名字發送到列表的郵件.

1.11.1.2. qmailannounceqmail的公告郵件列表. 沒有投稿地址, 這是個只讀的列表.

1.11.1.3. serialmail討論serialmail 軟件的列表.

1.11.1.4. ezmlmezmlm 郵件列表管理器的的討論列表.

1.11.2. 咨詢者 參看 http://www.qmail.org/top.html#paidsup 的商業支持提供者名單.

1.11.3. FAQTS 知識庫 http://qmail.faqts.com/ 一個qmail相關問題的數據庫, 包括問題解答.如果你在FAQ裏面找不到回答, 試試搜索這個知識庫. 它的專長在于回答"如何去作"的問題.

2. 安裝 這一節介紹qmail的安裝. 如果你是個經驗豐富的系統管理員, 你完全可以按照qmail的發布源文件裏面的INSTALL文件的指導完成安裝. INSTALL文件是正式的安裝指導. 這個指導比 Life with qmail, 也就是本文的指導複雜很多. INSTALL文件假定讀者是一個經驗豐富的系統管理員或者郵件管理員. 而且INSTALL這個文件也比較陳舊, 反映不了Bernstein(qmail作者)最近的操作規程建議.

注意: 如果你選擇使用下面的安裝指導, 請你一定要通讀下面整個小節以熟悉全部安裝過程.

2.1. 不同的安裝發布形式以及相互的比較 2.1.1. 二進制安裝對比源代碼安裝 由于qmail對于預先編譯的二進制代碼包的發行有限制性的許可, 通常qmail都是由源代碼安裝的.

如果你不是很熟悉源代碼和二進制的區別, 想像一下你訂了一個pizza餅. "二進制"形式的pizza餅送來了立刻就能吃, 而"源代碼"pizza餅就像全部制作pizza的材料, 面粉, 發酵粉, 幹酪, 沙司還有澆頭調料, 以及烹饪pizza的指導, 你必須自己作pizza. 雖然有點費勁, 不過如果你仔細的按照指導來作, 結果是一樣的, 甚至更好. 自己作的pizza更新鮮, 你也可以按照自己的配置調整澆頭調料, 並且你更多的了解了你的pizza以及它是如何"工作"的.

安全的運行一個因特網服務並不容易. 一個不適當配置的服務可能給你的主機系統帶來被攻擊以及被用來攻擊其他站點的風險--有可能讓管理員承擔法律責任的安全風險. 更多的知道你的網絡服務如何運行的, 就更有可能讓他們正確和安全的工作.

2.1.2. Tarball 對比 特定操作系統安裝包 (Tarball vs. OS-specific package) 一些操作系統提供一種自動源代碼安裝機制. 回到上文我們的pizza制作分析裏面. 這就好像把所有的pizza的成分和制作指導都打包到一起, 這樣你簡單的按一下按鈕pizza就能把自己烤好啦.

覺得這樣作很不錯, 是吧?

實際上, 那可不是一個想當然的好主意. 組裝這些包是個相當困難的工作, 它們有時並不是按照假定的方式工作的. 這是軟件, 而且和其他軟件一樣, 他們會有bugs. 即使不提那些bugs, 那些安裝的方便也是用犧牲你自己烤的pizza餅的很多優點來達到的. 比如你自己調整澆頭調料的的能力, 還有知道怎麽作pizza餅, 以及pizza如何工作等等.

如果qmail僅僅是一個pizza, 哪自安裝方式還是可以接受的. 不過qmail可是個相當複雜的系統. 安裝和維護qmail的人都需要對它相當的了解才能平穩的運行它. 自安裝方式的qmail更容易安裝, 不過用戶手動安裝方式更容易調整配置和查找故障. 你可能就安裝一次qmail, 但是你可能要幾次才能調整好它, 或者當郵件並不是按照你想要的方式運行的時候, 設法找出並解決問題.

由于這些原因, 我建議使用源代碼的tarball方式安裝, 而不是Red Hat RPM或者其他自安裝包方式.

2.2. 准備工作 安裝qmail之前, 尤其如果是你第一次安裝qmail, 有幾個需要注意的地方.

如果可能, 盡量在一個"試驗"系統上安裝qmail. 這樣的話可以有機會犯錯, 不至于在正在工作的服務器上安裝時丟失重要的郵件或者中斷mail服務. 如果你沒有空閑的計算機系統, 而你要安裝的系統上面已經運行sendamil, smail或者其他的MTA, 這些MTA還在進行郵件投遞, 你可以在這種系統上完成大部分的qmail 安裝而不中斷現有的郵件服務. 如果從其他MTA移植到qmail--即使你在qmail上已經很有經驗--首先制訂一個安裝計劃, 也是非常必要的. 2.3. 系統要求 qmail 必須安裝在UNIX或者類UNIX系統上, 一些系統要求:

安裝需要大約10兆空間. 安裝之後可以刪除目標文件釋放出大約4兆空間. 一個完整的C開發環境, 包括編譯器, 系統頭文件, 以及函數庫. 構建指導將告訴你如何顯示你是否擁有這些必要的部分. 二進制代碼, 文檔, 和配置文件需要幾兆空間. 郵件隊列需要一個安全的文件系統. qmail 的可靠性要求文件系統兼容傳統的BSD FFS語義. 大多數現代的本地文件系統都符合這個要求除了一個很重要的例外: link()系統調用常常是異步的--這意味著link()操作返回時不會將數據寫入磁盤. Bruce Guenter 的syncdir 庫可以用來解決這個問題. 更多信息請參見附錄裏面相關軟件包 syncdir. 郵件隊列需要的足夠的磁盤空間. 小型單用戶系統僅僅需要2兆. 大型系統可能需要2吉(2G). 兼容的操作系統. 多數變種UNIX都可以. 參考qmail源代碼裏面的README文件, 裏面有已知的兼容系統版本列表. 最好有權使用域名服務器. 沒有這個條件, qmail就只能按照smtproutes配置文件裏面配置的遠程主機發送郵件. 足夠的網絡帶寬. qmail是爲良好接入網絡的系統設計的, 所以你不可能在一個28.8k的撥號線路上運行一個郵件列表. serialmail軟件包是爲在低速連接上的系統運行qmail而設計的. 更多信息請參見附錄內serialmail相關的節. 注意: 郵件隊列所在的文件系統必須允許使用可執行文件和設置setuid()文件. 一些操作系統自動挂載(mount) /var 目錄選項爲非suid 和非可執行.這種情況下, 必須在 /var/qmail/bin 內禁止這些選項, 或者, 將這個文件夾放置在其他沒有這兩項限制的文件系統上. 稍後我將在建立目錄小節提到如何使用符號鏈接來解決這個問題. 如果/var 挂載爲非suid, 你可能在qmail-send 日志內看到如下的錯誤消息:

delivery : deferral: Sorry,_message_has_wrong_owner._(#4.3.5) 注意: 本文或者INSTALL 文件的說明, 是不能作爲qmail 在蘋果X 操作系統上的安裝指導的, Eben Pratt 存檔了如何在蘋果X 系統上安裝qmail 的文檔, 參考這裏 http://netdevice.com/qmail/#osx.

2.4. 下載源代碼 好了, 你已經准備好安裝qmail的系統了. 第一步就是下載qmail和插件的源代碼. 當然了, 你需要qmail, 還有ucspi-tcp和daemontools.

qmail, http://www.qmail.org/netqmail-1.05.tar.gz ucspi-tcp, http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz daemontools, http://cr.yp.to/daemontools/daemontools-0.76.tar.gz 用你的web浏覽器, 或者web客戶端(比如wget), FTP客戶端下載這些源代碼.

注意: 如果這些鏈接的其中任何一個失效, 都有可能由于他們已經升級了, 如果是這種情況, 你需要到http://cr.yp.to/software.html 查找相應軟件包的鏈接下載最新版本. 有可能升級版本不兼容下面的指導內容, 所以請一定閱讀這些發行版本的"Upgrading from previous version..."小節中的注意事項. 注意: 本文安裝指導使用netqmail 發行版, netqmail 包含了qmail 1.03 tarball版和一個補丁, 這個補丁修正了一些漏洞, 不足和兼容性問題. 在這裏訪問netqmail http://www.qmail.org/netqmail/ netqmail 的CHANGES 文件內有更多的相關信息.

2.5. 編譯源代碼 2.5.1. 檢驗編譯(源代碼)環境 首先你要確定的是你有編譯程序的必要的工具. 如何確定取決于你使用的UNIX變種. 雖然不能保證可靠, 但最簡單的斷定方式就是去試.

注意: 下面任何一個測試通過了, 你都可以停下來直接跳到下一節.

在計算機的命令提示行下, 敲入 cc 然後回車. $ cc cc: No input files specified $

如果你得到類似上面的反應, 表明你的缺省搜索訪問路徑上有一個可用的C編譯器. 如果沒有類似反應, 也不意味著你必然沒安裝任何C編譯器. 也有可能那個編譯器不在你的缺省搜索訪問路徑上, 當然, 也有可能你根本沒有編譯器. 接著來試這幾個命令: /usr/bin/cc /usr/bin/gcc /usr/local/bin/cc /usr/local/bin/gcc /usr/ccs/bin/cc 如果他們中間沒有一個命令起作用, 你可能要多試點和平台有關的命令啦. 在命令提示符下, 區別于你使用的平台不同, 分別敲入以下命令: 對于 Red Hat Linux, 使用: rpm -qa | grep gcc 或者 rpm -qa | grep egcs 對于 FreeBSD: 默認安裝已經包括了GCC編譯器. 如果你找不到編譯器, 你必須確定它的位置或者安裝一個. 請聯絡你的操作系統銷售商或者操作系統技術支持. 這節我們將要實現編譯qmail的步驟. 剪切/粘貼(意思是複制或者粘貼腳本和命令行. 譯者注) 會很方便, 不過也不是必須的.

2.5.2. 解壓發行包 如果你一直按照這個指導來作, 那麽現在你已經有了一個C編譯器, 以及源代碼的tarball副本. 下一步, 拷貝或者移動tarball包到工作目錄. 目錄/usr/local/src 對于qmail 和ucspi-tcp安裝是個不錯的位置. 而daemontools 應該建立在/package下.

現在你需要成爲root用戶, 如果你還沒有, 那就成爲root吧.

su

umask 022

mkdir -p /usr/local/src

mv netqmail-1.05.tar.gz ucspi-tcp-0.88.tar.gz /usr/local/src

mkdir -p /package

mv daemontools-0.76.tar.gz /package

chmod 1755 /package

現在你可以解開軟件包了.

cd /usr/local/src

gunzip netqmail-1.05.tar.gz

tar xpf netqmail-1.05.tar

cd netqmail-1.05

./collate.sh # 在這兒要注意錯誤信息

cd ..

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/netqmail-1.05, /usr/local/src/ucspi-tcp-0.88, and /package/admin/daemontools-0.76.

2.5.3. 建立目錄 qmail安裝程序會自行創建需要的子目錄, 你只需要創建qmail的"home"目錄.

mkdir /var/qmail

然後直達下一節.

注意: 如果你想把qmail的全部或者部分文件安裝到除了/var的其他地方, 可以在/var/qmail下建立軟鏈接到其他位置.

舉個例子, qmail配置文件可以存放在/etc/qmail下面, 如下操作:

mkdir /etc/qmail ln -s /etc/qmail /var/qmail/control

2.5.4. 創建用戶和組 最容易的創建用戶和組的方式是創建一個小腳本文件然後執行它. 在源代碼目錄下你可以找到一個名字是INSTALL.ids的文件, 它包括了在你的系統平台下創建用戶和組的命令行. 複制這個文件並命名另外一個名字, 編輯它來運行命令既快捷又簡單.

cd /usr/local/src/netqmail-1.05/netqmail-1.05

cp INSTALL.ids IDS

接下來, 用你最順手的編輯器, 刪除文件其余部分, 除了保留你的平台需要的命令部分. 舉個例子, 下面是爲FreeBSD平台編輯之後留下的部分:

pw groupadd nofiles

pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent

pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent

pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent

pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent

pw groupadd qmail

pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent

pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent

pw useradd qmails -g qmail -d /var/qmail -s /nonexistent

然後運行這個腳本, 用chmod將腳本設置爲可執行或者用sh來運行它.

第一種方法:

chmod 700 IDS ./IDS

第二種方法:

/bin/sh IDS

這個腳本運行完畢, 你的所有的用戶和組就已經添加完畢, 你可以繼續下一節的安裝了.

可是如果你的系統在INSTALL.ids 上沒有提到怎麽辦? 那你就必須手動創建用戶和組了. 使用你比較順手的編輯器編輯這個文件/etc/group, 增加下面兩行:

qmail:*:2107: nofiles:*:2108:

注意: 首先確定2107和2108沒有被使用, 如果已經被占用, 選擇2個文件中未用的數字.

下一步, 使用vipw(大多數系統都有這個命令, 如果沒有你就必須用編輯器手動編輯, 不過這次可是/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. 如果任意一個用戶ID(UID)被占用, 必須選用其他未被占用的用戶id. 你不必一定把這些行加到文件尾部, 這樣作只是最容易說明問題的方式. 你現在已經可以進入下一節了.

2.5.5. 編譯現在你可以開始編譯qmail了. 進入/usr/local/src/netqmail-1.05/netqmail-1.05 目錄, 我們開始吧!

cd /usr/local/src/netqmail-1.05/netqmail-1.05

在檢驗編譯環境小節, 你定位了你的C編譯器. 如果它的名字不是cc或者不在你訪問的環境變量PATH定義的任何目錄下, 你必須修改conf-cc和conf-ld. 假設你的編譯器名字是gcc, 並且gcc在你的環境變量PATH內可見, 那麽簡單來說, 編輯conf-cc和conf-ld然後置換所有"cc"爲"gcc"就可以了.

現在敲入下面的命令:

make setup check

這個編譯完成之後, 你需要作一些安裝後配置工作. 運用下面兩個腳本用來讓工作更簡單. 如果你的DNS配置恰當, 運行這個腳本:

./config

如果由于某些原因config 腳本不能在DNS找到你的主機名, 你就必須運行config-fast腳本: (這個原因一般來說是由于config在dns反查主機IP對應的規範的主機名時候沒有記錄或者出錯造成的. 現代商業dns一般都不提供IP反查. 所以安裝過程可能更多機會是直接使用config-fast 腳本, 而不是config 腳本. 譯者注)

./config-fast the.full.hostname

舉個例子, 如果你的域名是example.com, 你的計算機的主機名是dlphin, 你的config-fast 命令行應該這樣寫:

./config-fast dolphin.example.com

注意: 你可能計劃在小型本地局域網使用僞域名比如".local", 舉例來說, 如果你的主機名是"mash", 你可能要用 ./config-fast mash.local , 如果你這樣作了, 要確定配置qmail在返回地址上使用了合乎邏輯的因特網域名. (參見第3節, 配置.)

qmail現在已經安裝到你的系統內, 並且准備運行了! 下一節將要介紹運行和測試qmail.

2.6. 安裝 ucspi-tcp 剛才你解壓了qmail, ucspi-tcp, 和daemontools 的tarball包, 現在進入ucspi-tcp目錄.

cd /usr/local/src/ucspi-tcp-0.88

剛才在編譯一節, 如果你修改了conf-cc和conf-ld文件, 你必須在這個目錄作同樣的修改.

然後, 運行:

patch

make

make setup check

ucspi-tcp安裝完畢.

2.7. 安裝 daemontools 進入daemontools安裝目錄

cd /package/admin/daemontools-0.76

再說一次, 如果你在編譯qmail和ucspi-tcp的時候修改了conf-cc和conf-ld文件, 你必須在在src目錄作同樣的修改.

然後, 運行:

cd src

patch

cd ..

package/install

在BSD系統上(沒有 /etc/inittab), 你必須重新啓動計算機再運行svscan, 這是後台服務器的管理服務程序.

使用 "ps -ef | grep svscan" 或者"ps waux | grep svscan" 檢查svscan是否在運行.

注意: 在Solaris下, 你必須修改/etc/inittab中關于svscan的啓動條目, 將

SV:123456:respawn:/command/svscanboot

改爲:

SV:123456:respawn:/command/svscanboot /var/log/svscan 2%26amp;1

或者改爲:

SV:123456:respawn:/command/svscanboot /dev/msglog 2%26amp;1

選擇那種方式, 這取決于你是想把啓動svscan的出錯消息記錄到log文件裏面還是顯示到控制台上. 這樣作的必要性請參考下面的文章:

http://marc.theaimsgroup.com/?l=log%26amp;m=100327801309834%26amp;w=2

注意: 一個Slackware的用戶報告x1之前的SV /etc/inittab條目必須被移動, 否則啓動後無法運行svscan.

2.8. 運行 qmail 2.8.1. /var/qmail/rc/var/qmail/boot 目錄包含了不同配置的qmail啓動腳本示例: /var/spool/mail 方式和$HOME/Mailbox 方式, 使用procmail或者.forward 控制文件, 以及這些方式的不同組合配置. 你可以隨意考查這些方式, 不過這裏我們選用下面的腳本:

#!/bin/sh# Using stdout for logging# Using control/defaultdelivery from qmail-local to deliver messages by defaultexec env - PATH="/var/qmail/bin:$PATH" \qmail-start "`cat /var/qmail/control/defaultdelivery`"

注意: 這個腳本使用了反引號(`), 而不是單引號('). 最好拷貝和粘貼上文的腳本而不是自己鍵盤輸入, 後者容易出錯. (反引號非常小,請仔細看. 譯者注)

用你的編輯器將上面的腳本保存爲 /var/qmail/rc, 然後執行下面這些命令:

chmod 755 /var/qmail/rc mkdir /var/log/qmail

現在你需要決定一下, 除了由.qmail 文件指示傳送的郵件外, 其他郵件將采用何種默認傳輸方式, (.qmail 文件是指示文件傳送路徑的重要文件, 後面還會討論. 譯者注)下面的列表大致闡述了幾種一般性的選擇:

郵箱格式

名稱

保存位置

缺省的傳輸方式

注釋

mbox

Mailbox

$HOME

./Mailbox

最常見的格式, 大多數MUA都可以正確識別

maildir

Maildir

$HOME

./Maildir/

更可靠, 少數MUA支持的格式

mbox

username

/var/spool/mail

參見 INSTALL.vsm文件

傳統的UNIX郵箱

更多信息請參考 INSTALL.mbox, INSTALL.maildir 和 INSTALL.vsm 文件.

選擇缺省的郵箱格式, 只要選擇上表裏面的"缺省傳輸方式"的值, 填寫到/var/qmail/control/defaultdelivery裏面就可以了. 例如, 如果選擇標准的qmail /Mailbox 傳送格式, 這樣作就行了:

echo ./Mailbox /var/qmail/control/defaultdelivery

注意: defaultdelivery並不是標准的qmail控制文件. 而是上文/var/qmail/rc 文件的要素. 對于qmail-start來說, defaultdelivery 變量只是在沒有實際的 .qmail 文件指定傳送指令的情況下作爲 .qmail 文件的內容出現的. 把這個指令加入到單獨的控制文件內, 就不必再在指令內重複引用shell元字符, 避免了出現多行雜亂的命令參數.

2.8.2. 系統啓動文件 2.8.2.1. qmailctl 腳本 如果你手動執行/varqmail/rc 腳本, qmail只會部分被運行起來. 可是我們希望希望每次系統啓動後, qmail都能自動被啓動; 每次系統停止時候qmail自動被關閉.

創建一個如下的 /var/qmail/bin/qmailctl 文件可以完成這個願望:

#!/bin/sh# description: the qmail MTAPATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbinexport PATHQMAILDUID=`id -u qmaild`NOFILESGID=`id -g qmaild`case "$1" in start) echo "Starting qmail" if svok /service/qmail-send ; then svc -u /service/qmail-send /service/qmail-send/log else echo "qmail-send supervise not running" fi if svok /service/qmail-smtpd ; then svc -u /service/qmail-smtpd /service/qmail-smtpd/log else echo "qmail-smtpd supervise not running" fi if [ -d /var/lock/subsys ]; then touch /var/lock/subsys/qmail fi ;; stop) echo "Stopping qmail..." echo " qmail-smtpd" svc -d /service/qmail-smtpd /service/qmail-smtpd/log echo " qmail-send" svc -d /service/qmail-send /service/qmail-send/log if [ -f /var/lock/subsys/qmail ]; then rm /var/lock/subsys/qmail fi ;; stat) svstat /service/qmail-send svstat /service/qmail-send/log svstat /service/qmail-smtpd svstat /service/qmail-smtpd/log qmail-qstat ;; doqueue|alrm|flush) echo "Flushing timeout table and sending ALRM signal to qmail-send." /var/qmail/bin/qmail-tcpok svc -a /service/qmail-send ;; queue) qmail-qstat qmail-qread ;; reload|hup) echo "Sending HUP signal to qmail-send." svc -h /service/qmail-send ;; pause) echo "Pausing qmail-send" svc -p /service/qmail-send echo "Pausing qmail-smtpd" svc -p /service/qmail-smtpd ;; cont) echo "Continuing qmail-send" svc -c /service/qmail-send echo "Continuing qmail-smtpd" svc -c /service/qmail-smtpd ;; restart) echo "Restarting qmail:" echo "* Stopping qmail-smtpd." svc -d /service/qmail-smtpd /service/qmail-smtpd/log echo "* Sending qmail-send SIGTERM and restarting." svc -t /service/qmail-send /service/qmail-send/log echo "* Restarting qmail-smtpd." svc -u /service/qmail-smtpd /service/qmail-smtpd/log ;; cdb) tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp

這個腳本可以在線下載, 地址是http://www.lifewithqmail.org/qmailctl-script-dt70.

(建議所有直接使用, 或者拷貝-粘貼web頁面指令和文件格式腳本指令的讀者, 都要注意腳本編碼轉換的問題. 本文講到的qmail 是在Unix/Linux 類型服務器上運行的, 而UNIX 的回行和DOS/Windows的回車在腳本內表示的ACSII碼是完全不同的, 如果遇到這個問題, 在之後的腳本執行中, 可能出現非常奇怪的錯誤信息. 有興趣的讀者可以在搜索引擎上查找深入介紹內容. 細心的讀者還會注意到, 英文原文和翻譯版本, 在代碼前後都加上了

格式符, 其目的就是爲了保證指令代碼不會被web頁面的格式代碼"汙染". 譯者注) 你可以自己輸入這個腳本, 不過我推薦你用浏覽器下載上面鏈接的文件. 將上面這個qmailctl 腳本設置爲可執行腳本, 然後鏈接到你的用戶執行程序目錄:

chmod 755 /var/qmail/bin/qmailctl ln -s /var/qmail/bin/qmailctl /usr/bin

2.8.2.2. supervise 腳本 爲 qmail 的服務創建 supervise 目錄

mkdir -p /var/qmail/supervise/qmail-send/log mkdir -p /var/qmail/supervise/qmail-smtpd/log

建立 /, var/qmail/supervise/qmail-send/run 文件

#!/bin/shexec /var/qmail/rc

建立 /var/qmail/supervise/qmail-send/log/run 文件:

#!/bin/shexec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

建立 /var/qmail/supervise/qmail-smtpd/run 文件:

#!/bin/shQMAILDUID=`id -u qmaild`NOFILESGID=`id -g qmaild`MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`LOCAL=`head -1 /var/qmail/control/me`if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in echo /var/qmail/supervise/qmail-smtpd/run exit 1fiif [ ! -f /var/qmail/control/rcpthosts ]; then echo "No /var/qmail/control/rcpthosts!" echo "Refusing to start SMTP listener because it'll create an open relay" exit 1fiexec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2%26amp;1

注意: concurrencyincoming並不是標准的qmail控制文件. 它是上面腳本的一個要素. 並且, 第一個LOCAL 行上面的是"破折號 + 數字1", 下面的tcpserver行上的參數是"破折號 + 小寫字母l" . (由于英文小寫字母l和數字1容易混淆, 原作者特意補充的注意事項. 由譯者將被提到兩行修改成爲紅色. 這也是爲什麽作者希望讀者直接拷貝腳本而不是自行輸入避免腳本出錯的主要原因之一. 另外注意這個腳本中很多字體很小的引號和反引號. 譯者注)

注意: Solaris系統下一般位置的id程序不能正常工作, 請使用這個位置的 /usr/xpg4/bin/id:

QMAILDUID=`/usr/xpg4/bin/id -u qmaild` NOFILESGID=`/usr/xpg4/bin/id -g qmaild`

注意: 根據你的操作系統和硬件平台的不同, 可能需要調整softlimit命令的的內存限制參數. 如果你的系統出現連接25端口失敗和無法接收遠程系統發送的郵件, 或者看到了類似下面這樣的錯誤消息: /usr/local/bin/tcpserver: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory

試一下把這個參數調整到3000000到4000000.

建立concurrencyincoming 控制文件.

echo 20 /var/qmail/control/concurrencyincoming chmod 644 /var/qmail/control/concurrencyincoming

建立 /var/qmail/supervise/qmail-smtpd/log/run 文件

#!/bin/shexec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd

將各個run文件設置爲可執行文件:

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

最後, 建立 supervise 目錄到 /service 目錄的鏈接:

ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service

/service 目錄是 daemontools 安裝時建立的目錄.

注意: 建立這個鏈接之後 qmail 系統會很快自動被啓動起來, 如果你還不想立刻運行qmail, 運行下面這個,命令來停止qmail:

qmailctl stop

2.8.2.3. SMTP 訪問控制 允許本地主機通過SMTP方式發送郵件:

echo '127.:allow,RELAYCLIENT=""' /etc/tcp.smtp qmailctl cdb

2.8.3. 停止並且禁用(其他)已經安裝的MTA 雖然有可能同時運行qmail 和現存的MTA, 比如Sendmail, 不過我建議你除非你知道自己到底在幹什麽, 否則可不要這麽幹. 說實話, 如果你正在讀我這段話, 你可能也不知道自己在幹嘛. :-)

如果現存的MTA是Sendmail, 你應該能利用運行Sendmail的init.d腳本的"stop"參數來停止它的運行. 例如下面命令中的一個可能是有效的:

/etc/init.d/sendmail stop /sbin/init.d/sendmail stop /etc/rc.d/init.d/sendmail stop

如果你找不到任何一個init.d/sendmail 下的腳本, 你可以用 "ps -ef|grep sendmail" 或者 "ps waux|grep sendmail" 命令找出 sendmail 的PID, 然後用下面的命令來停止Sendmail: (kill 命令加上Sendmail的PID作參數, 譯者注)

kill PID-of-sendmail

如果你的MTA不是Sendmail, 檢查相關文檔找出正確的停止MTA的方法.

你應該考慮一下把舊的MTA徹底的從你的系統裏面刪除. 至少禁用它的 init.d 腳本, 防止下一次系統重啓動的時候舊的MTA也被試圖重啓.

對于使用rpm方式安裝Sendmail的 Red Hat Linux, 執行下面的命令來刪除Sendmail:

rpm -e --nodeps sendmail

注意: 如果你使用基于RPM方式的Linux, 比如 Red Hat, 刪除MTA可能帶來進一步的問題. 系統的某些應用程序將會試圖重新安裝Sendmail, 一些MUA程序將無法安裝, 因爲他們找不到安裝好的MTA. Mate Wierdl 提供了一個占位程序, 稱作 "fake_mta", 安裝這個程序之後可以防止出現以上的問題. 簡單的RPM安裝包可以在下面的地址取得 http://www.csi.hu/mw/fake_mta-1-1memphis.noarch.rpm.

檢查一下沒有其他程序在監聽SMTP服務端口(25). 舊的MTA, inetd, 或者 xinetd 等程序都有可能造成問題. (按照以上步驟執行後, 再) 運行下面的命令應該是沒有輸出結果的(除非這個時候 qmail-smtpd 服務也在運行).

netstat -a | grep smtp

如果有什麽程序在運行, 首先確定不是qmail, 那麽先運行下面的命令:

qmailctl stop

然後重複 netstat 檢查:

netstat -a | grep smtp

如果你還是能看到這個命令有一些輸出, 你就必須在qmail 的SMTP服務運行起來之前把肇事程序找出來.

最後, 將現存的 /usr/lib/sendmail 替代爲 qmail 版本.

mv /usr/lib/sendmail /usr/lib/sendmail.old # 忽略錯誤提示 ignore errors mv /usr/sbin/sendmail /usr/sbin/sendmail.old # 忽略錯誤提示 ignore errors chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old # 忽略錯誤提示 ignore errors ln -s /var/qmail/bin/sendmail /usr/lib ln -s /var/qmail/bin/sendmail /usr/sbin

注意: 創建 sendmail 的鏈接是很重要的, 即使不管以前的MTA, sendmail 命令也是一個會被很多程序調用來發送郵件的重要命令.

最後步驟是建立兩個系統別名.

2.8.4. 建立系統別名 在所有 qmail 安裝上面都要建立四個系統別名:

別名

目的

postmaster

RFC 2821 標准要求, 指向郵件系統管理員(也就是你)

mailer-daemon

反彈郵件事實上的標准接收者

root

轉發特權用戶, 根(root)用戶的郵件給系統管理者

abuse

事實上的郵件濫用(垃圾郵件)舉報地址

建立這些系統別名, 取決于你想讓這些郵件發送到哪裏(一個本地用戶或者一個遠程地址)並且適當的創建一個.qmail 文件集合. 舉個例子, 加入你想讓本地用戶 dave 接收發給系統管理員和郵件管理員的郵件, 就這麽作:

echo dave /var/qmail/alias/.qmail-root echo dave /var/qmail/alias/.qmail-postmaster ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster

在 INSTALL.alias 文件裏面有更詳細的細節.

2.8.5. 運行 qmail 如果依照上文, 你創建 /service 之後就停止了qmail, 你現在應該重新啓動 qmail:

qmailctl start

2.9. 測試安裝 qmail 現在應該是正在運行的狀態. 首先運行 qmailctl stat 來檢驗那些服務啓動並運行中:(下面命令後部分爲演示結果, 並不是必然如此的系統輸出. 譯者注)

# qmailctl stat /service/qmail-send: up (pid 30303) 187 seconds /service/qmail-send/log: up (pid 30304) 187 seconds /service/qmail-smtpd: up (pid 30305) 187 seconds /service/qmail-smtpd/log: up (pid 30308) 187 seconds messages in queue: 0 messages in queue but not yet preprocessed: 0

所有的四個服務都應該是"up"(啓動了)1秒鍾以上. 如果不是這樣, 你可能就是在寫腳本的時候寫錯了一些東西或者你漏過了創建一個甚至多個必要的文件, 目錄或者鏈接. 返回上面的安裝指導, 一步一步的再檢查一下你的工作. 你也可以下載並運行 inst_check 腳本, 在這裏下載 http://lifewithqmail.org/inst_check. 舉個例子:

# sh inst_check ! /var/log/qmail has wrong owner, should be qmaill ...try: chown qmaill /var/log/qmail #

如果 inst_check 發現了問題, 解決問題後重新運行這個檢查腳本. 當所有情況被判斷爲正確的時候, inst_check 將會報告:

Congratulations, your LWQ installation looks good!

readproctitle 程序維持著由svscan 管理的各個服務的錯誤消息的日志. 使用 ps 或者其他進程列表命令. 舉個例子, 你可以看到類似下面這樣的輸出:

# ps -efl | grep "service errors" | grep -v grep 000 S root 1006 1001 0 76 0 - 334 pipe_w Mar31 ? 00:00:00 readproctitle service errors: ...unable to start qmail-smtpd/run: exec format error #

這個例子裏面, 問題出在 /service/qmail-smtpd/run 這個腳本的第一行--很有可能由于腳本文件是 DOS 格式 (DOS使用回車符-換行符結束一行的方式和Unix的僅僅用換行符方式不同).

有時候爲了檢驗配置錯誤, 手動運行一下服務也會很有幫助的. 舉個例子, 如果你的 qmail-smtpd/log 服務沒有運行, 那麽執行下面的命令:

cd /service/qmail-smtpd/log svc -d . ./run 如果沒有錯誤, 輸入一行字符然後按回車鍵 如果還是沒有錯誤, 輸入CTRL-D (文件結束符)

這個時候, 你應該能夠識別問題所在並且解決它了. 這個做完之後, 返回服務目錄, 如果有必要, 運行命令:

svc -u .

一旦那些服務的啓動時間都大于1秒鍾後, 依照 TEST.deliver 和 TEST.receive 文件裏面的指令去校驗服務是否正確的工作. 注意, 應用這些指令, 日志將由multilog 程序記錄到 /var/log/qmail 下, 而不是 splogger 記錄到類似 /var/log/maillog 的文件裏面.

注意: 如果你選擇了 maildir 郵箱格式作爲默認的傳送方式, 在運行這些指令之前, 你必須在你的主目錄和別名的主目錄創建 Maildir 目錄. 參見 maildir 小節查找如何恰當的創建這個目錄.

3. 配置 你已經從源代碼tarball方式, 或者自編譯包方式, 或者var-qmail包方式安裝了 qmail. 這一節的內容就是按照你的需要配置qmail.

3.1. 配置文件 所有的qmail系統配置文件, 除了在~alias下的 .qmail 文件, 都位于 /var/qmail/control 目錄下. qmail-control 的man手冊頁包括了一個像下面這樣的表:

控制文件

默認值

被用于

使用目的

badmailfrom

none

qmail-smtpd

From 地址黑名單

bouncefrom

MAILER-DAEMON

qmail-send

反彈郵件的發送者

bouncehost

me

qmail-send

反彈郵件的發送者主機名

concurrencyincoming

none

/service/qmail-smtpd/run

最大並行 SMTP 連接數

concurrencylocal

10

qmail-send

最大並行本地傳送數

concurrencyremote

20

qmail-send

最大並行遠程傳送數

defaultdelivery

none

/var/qmail/rc

默認的 .qmail 文件

defaultdomain

me

qmail-inject

默認的域名

defaulthost

me

qmail-inject

默認的主機名

databytes

0

qmail-smtpd

郵件最大字節數 (0 等于無限)

doublebouncehost

me

qmail-send

雙重反彈的發送者的主機名

doublebounceto

postmaster

qmail-send

接收雙重反彈郵件的用戶

envnoathost

me

qmail-send

對缺少"@"符號的地址配置的缺省域名

helohost

me

qmail-remote

在SMTP HELLO命令裏面使用的主機名

idhost

me

qmail-inject

在Message-ID 裏面使用的主機名

localiphost

me

qmail-smtpd

替代本地 IP 地址的名字

locals

me

qmail-send

進行本地傳送的域

me

系統的正式域名 FQDN

various

許多控制文件的默認要求

morercpthosts

none

qmail-smtpd

二級rcphosts(接收主機)數據庫

percenthack

none

qmail-send

可以使用"%"模式轉信的域

plusdomain

me

qmail-inject

"+"加號拖尾地址替代的域

qmqpservers

none

qmail-qmqpc

QMQP 服務器IP地址

queuelifetime

604800

qmail-send

郵件在隊列內可保留秒數

rcpthosts

none

qmail-smtpd

我們的主機接收郵件的域

smtpgreeting

me

qmail-smtpd

SMTP 問候信息

smtproutes

none

qmail-remote

人爲指定的SMTP路由

timeoutconnect

60

qmail-remote

SMTP連接超時秒數

timeoutremote

1200

qmail-remote

遠程服務器連接超時秒數

timeoutsmtpd

1200

qmail-smtpd

SMTP客戶端超時秒數

virtualdomains

none

qmail-send

虛擬域和用戶

查找這些特殊控制文件的更多信息, 請參考上面表格 "被用于" 列下的各個模塊的 man 手冊頁.

3.2. 中繼轉信 3.2.1. 介紹 什麽是轉信? 轉信是 MTA 通過SMTP接收到一封既不是發給本地地址也不是從本地發送者發來的郵件之後, MTA轉發這個郵件的動作就是轉信.

在垃圾郵件時代之前, MTA被配置爲開放轉信是很常見的: 各種各樣的服務器接受來自任何人的郵件, 轉發給任何人.

現代的絕大多數 MTA 都被配置爲或者完全禁止轉信, 或者只允許某些被信任的用戶或者系統使用中繼轉信功能.

Chris Johnson 爲qmail 的用戶寫了一個非常好的文檔. 我鼓勵你去看一看: http://www.palomine.net/qmail/relaying.html.

3.2.2. 禁止轉信如果你是按照 qmail 的正式安裝指導安裝的話, 那麽轉信在默認情況下已經被關閉了. 這個功能是通過把local和virtualdomains(指本地主機)文件裏面列出的有充分資格的域名寫入 /var/qmail/control/rcpthosts 文件來完成的. rcpthosts 這個文件名是來源于SMTP對話中的的RCPT(接收者)命令. 在SMTP對話裏面, RCPT是用來確認郵件接收者地址的, 然後, rcpthosts 列出可以出現在RCPT地址裏面的有效的主機名.

3.2.3. 允許有選擇的轉信 大多數單用戶和小型工作組服務器可以完全禁止轉信, 可是如果你維護的是一個分布式的用戶社區, 你就必須有一個方式能夠允許你的用戶, 而且只能是你的用戶通過的你的系統轉信. 本文是通過使用 tcpserver 來設置RELAYCLIENT 環境變量, 使 qmail-smtpd 重載 rcpthosts 文件完成這個功能的.

如果你是按照這個文檔的指導安裝的話, 有選擇的轉信已經在默認情況下安裝好了. 如果需要給客戶端轉信權利, 首先在 /etc/tcp.smtp 文件裏面增加類似下面的行:

IP address of client:allow,RELAYCLIENT=""

(斜體IP address of client代表客戶端的IP地址. 譯者注) 然後重建SMTP的訪問許可數據庫:

qmailctl cdb

或者運行下面的命令(重建數據庫):

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp

如果你是按照正式安裝指導安裝的, Chris Johnson寫了另外一個非常好的如何配置qmail允許選擇主機轉發郵件的文檔, 參見: http://www.palomine.net/qmail/selectiverelay.html.

3.2.4. 使用smart host中繼轉信如果在一個典型的家庭寬帶上網條件下建立郵件服務器, 那麽將有非常大的可能, 這個服務器的IP地址會被列入黑名單, 比如SORBS(http://www.dnsbl.sorbs.net/lookup.shtml)的黑名單, 這樣作是爲了防止垃圾郵件. 絕大多數ISP都給他們的用戶提供SMTP服務器用來轉信, 這些服務器通常不在黑名單內. 舉個例子, Road Runner(美國某ISP. 譯者注)在辛辛那提(美國地名. 譯者注)使用smtp-server.cinci.rr.com 這個服務器來爲她的用戶提供SMTP轉信服務. 你可以讓qmail 將所有向外傳送的SMTP 訪問都通過這個服務器, 你可以這樣作:

echo ":smtp-server.cinci.rr.com" /var/qmail/control/smtproutes

smtproutes 文件可以提供更多的路徑選擇功能, 請參考qmail-remote 的man 幫助文檔.

3.3. 多主機名 如果你的主機名已知配置了多個名字, 例如, 所有的來自user@host1.example.com 的地址也可以被寫成 user@example.com 或者 user@mail.example.com, 那麽你就必須告訴 qmail 哪一個地址是它應該本地傳送的地址, 哪一個地址是它應該接受的遠程主機發送的地址.

如果要這樣作, 只要把所有的名字加入下面兩個控制文件就行了:

rcpthosts, 這個文件通知 qmail-smtpd 接收這個主機可以接受的地址. 還有 locals, 這個文件通知 qmail-send 哪些地址是本地傳送地址. 給 qmail-send 發送一個HUP(挂起)信號來通知它重新讀取 locals文件. 如果你使用的是本文的 qmailctl 腳本, 那麽運行下面的命令就可以了:

qmailctl reload

3.4. 虛擬域 虛擬域和上節提到的多主機名類似, 不過這裏面有一些很重要的不同之處. 首先如果 example.net 是 virtual.example.net 虛擬域的宿主主機, 那麽一個發送給 joe@virtual.example.net 的郵件將不會被發送給即使是同一個郵箱的 joe@example.net, 這裏虛擬域的名字空間是沖突的.

使用 qmail, 虛擬域將在 virtualdomains 文件裏面配置, 文件內由型如下面這行的條目構成:

user@domain:prepend

qmail 轉換 user@domain 爲 prepend-user@domain 並且將這個轉換後的名字作爲本地域一樣對待. user@ 這個部分是可選的, 如果缺少這個部分, 這個名字將匹配所有 @domain 域下面的地址.

回到上文的 example 劇情裏面, 如果 example.net 郵件管理員希望創建 virtual.example.com 虛擬域, 並且將這個域置于用戶 john 的管理之下, virtualdomains 文件下面的虛擬域條目應該這樣寫:

virtual.example.com:john

這樣, 發往 joe@virtual.example.com 的郵件將會被修改爲發往 john-joe@virtual.example.com , 然後進行本地傳送. 更多信息, 請參見 .qmail 小節, 以及 擴展地址 細目. 那裏將介紹 john 如何管理他的虛擬域.

使用多主機名的時候, 所有的虛擬域都必須在rcphosts列出, 這樣 qmail-smtpd 才會知道那些地址的郵件才應該被接受. 但是不像多主機名方式, 虛擬域不可以在locals裏面設置相應條目.

修改 virtualdomains文件之後, 發送給 qmail-send 一個 HUP (挂起) 信號, 通知它重新讀取配置文件. 如果你使用本文的 qmailctl 腳本, 你可以運行如下命令:

qmailctl reload

同時, 不要忘了在 rcpthosts 裏面增加虛擬域條目.

注意: 必須設置域名服務器(DNS)的郵件交換器(MX)記錄, 以使虛擬域指向正確的郵件服務器. 這是名字服務器管理員的工作, 超出了本文討論的範圍.

3.5. 別名qmail的標准別名機制是由qmail的本地傳送機制自然派生出來的.qmail-local 試圖傳送地址爲 localpart@host 的郵件給本地叫做 localpart 名字的用戶. 如果沒有匹配這個名字的用戶存在, 郵件將會被發送給別名 alias 用戶, 別名用戶是qmail系統裏面通常主目錄位于 /var/qmail/alias 的僞用戶.

舉例, 如果你想要創建一個叫做 info@example.com 的別名, 這個別名用戶將把上文收到的所有無主郵件轉發給用戶 tom, 在我們舉例的 example.com 上, 這樣作的方式是: 作爲 root 用戶, 運行下面的命令:

echo \%26amp;tom /var/qmail/alias/.qmail-info

.qmail 小節, 以及 擴展地址 細目介紹了如何創建 .qmail文件, 這些文件確定了那些別名存在, 以及如何處理哪些發給他們的郵件的.

附錄 新手常見問題 介紹了兩個關于別名應用的複雜案例. 那些別名使用了大寫字母和小數點("."), 以及 .qmail 文件的 man 手冊頁面, 其中包含了完整的關于 .qmail 文件用法的文檔.

注意由于別名在 qmail 裏面的實現方式, 別名是不能夠優先與一個已知用戶的傳送的. 例如, 如果 rachel 是一個普通用戶, 那麽~alias/.qmail-rachel 別名是無效的.

fastforward 軟件包另外提供了一個可行的別名機制, 它將多個別名放入單獨一個和Sendmail別名數據庫兼容的文件裏面.

下一節, qmail-users, 描述了其他實現別名的機制.

3.6. 關于 qmail-users qmail-users 是一個分發地址給用戶的系統. 由 /var/qmail/users 下的一系列文件構成. assign 文件是一個分配表. 有兩種分配表的格式: 單體方式和通配符方式.

注意: assign 文件包含了一系列分配表, 每行一個, 後面接一個包含了一個單獨的小數點(.)的行. 如果你手動創建assign文件, 不要忘記小數點那一行.

3.6.1. 單體分配表 一個單體分配表看起來是這個樣子的:

=address:user:uid:gid:directory:dash:extension:

這個表的含義是: 作爲 address 地址接收的郵件將會被使用用戶 user 來傳送, 使用指定的 uid 和 gid, 並且由 directory/.qmaildashextension 這個文件決定郵件如何被傳送.

3.6.2. 通配符分配表 通配符分配表看起來是這個樣子的:

+prefix:user:uid:gid:directory:dash:prepend:

這個表的含義是: 作爲 prefixrest 地址裏面匹配的郵件地址接收的郵件, 將會被使用用戶 user 來傳送, 使用指定的 uid 和 gid, 並且由 directory/.qmaildashextension 這個文件決定郵件如何被傳送.

3.6.3. qmail-user 程序 qmail-user 有兩個輔助程序: qmail-newu 和 qmail-pw2u.

qmail-newu 程序處理 assign 文件並且在 /var/qmail/users 下生成一個名爲 cdb 的靜態數據庫(CDB)文件. CDB是二進制格式, 所以在內含數千條分配表的情況下, 仍然可以被 qmail-lspawn 快速訪問.

qmail-pw2u 把系統用戶數據庫 /etc/passwd 轉換爲一系列適于assign 使用的分配表. qmail-pw2u 使用一組文件來修改翻譯規則.

include: 要包括的用戶 exclude: 不要包括的用戶 mailnames: 用戶的可替換的"郵件帳戶名字" subusers: 用戶控制的額外的地址, 使用可選的 .qmail 擴展方式 append: 其他分配表 注意: 如果你使用qmail-pw2u, 不要忘記在增加和刪除用戶, 或者改變UID和GID之後, 重新運行一下qmail-pw2u和qmail-newu. 標准的運行次序如下所示:

qmail-pw2u /var/qmail/users/assign qmail-newu

3.7. 反垃圾郵件 Chris Hardie 寫了一個極好的的qmail反垃圾郵件 HOWTO. 可以在這個地址訪問到它: http://www.summersault.com/chris/techno/qmail/qmail-antispam.html.

3.8. 病毒掃描 Jason Haar編寫了 Qmail-Scanner, 一個爲qmail設計的內容掃描裝置. 更多信息請參見 http://qmail-scanner.sourceforge.net/.

Qmail-Scanner 包括了一個簡單策略阻止組件(例如, 阻止*.scr文件, 或阻止"Yellow!"這樣的標題), 同時也直接支持許多不同的防病毒"插件", 包括ClamAV Antivirus掃描器 http://www.clamav.net/.

4. 使用方法 這一節介紹了qmail 針對普通用戶的使用方法. 如果你在 qmail 系統上讀信和發信, 那麽你閱讀本節就可以找到如何用qmail 達成你的目的了.

4.1. .qmail 文件 傳送用戶郵件通常是由一個或者幾個 ".qmail"(發音 dot kyoo mail) 文件控制的. 這些文件位于用戶的主目錄, 文件名由 .qmail 開頭. .qmail 的man 手冊頁面描述了 .qmail 文件使用方法.

.qmail 文件包括了一個傳送指令清單, 每行一個指令. 每行的第一個字符決定了選擇那種傳送方式.

字符

傳送類型

#

無 (注釋)

忽略

|

程序

由shell 執行的命令

/ 或者 .

mbox郵箱格式 (如果路徑最後一個字符不是一個斜杠)

mbox 的路徑名 (包括斜杠"/"或者 點".")

/ 或者 .

maildir郵箱格式 (如果路徑最後一個字符是一個反斜杠)

maildir 的路徑名 (包括斜杠"/"或者 點".")

%26amp;

轉發

轉發郵件的地址

字母或者數字

轉發

轉發郵件的地址 (包括第一個字符)

4.1.1. 程序傳送 如果.qmail 文件內指令由程序傳送, qmail 將啓動一個 shell (/bin/sh) 來執行這個命令, 然後使用標准把郵件的一個副本傳送給這個命令. qmail-command 的man 幫助文檔對這個過程有詳細描述.

程序傳送是非常強大的, 被用來實現的功能範圍非常廣闊, 例如郵件過濾, 自動回複, 以及通過第三方傳送代理比如procmail來傳送郵件.

例如:

|preline /usr/ucb/vacation djb

這個指令操作qmail 啓動preline, 將 /usr/ucb/vacation 和 djb 作爲參數傳送給 preline, 並且使用標准輸入將郵件的副本傳送給這個命令.

4.1.2. mbox 格式郵箱的郵件投遞 mbox 是標准的UNIX郵箱格式, 在一個獨立文件內存放多個郵件, 每個郵件由一個"From" 的開頭的行開始. 這一行看起來像一個郵件頭字段, 不過那不是郵件頭, 那僅僅是傳送代理添加的, 作爲一個標記,便于找到每個郵件的開始部分.

例如:

./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手冊頁詳細描述了maildir格式的細節.

maildir 格式的優點之一就是保證郵件傳輸的安全, 即使在不鎖定情況下, 不同郵件代理同時更新郵件, 也能保證傳輸的可靠. 這意味著maildir 郵箱可以安全的建立在以NFS性質挂接的文件系統上.

例如:

./Maildir/

這個設置表示將把郵件存儲在 $HOME/Maildir 下面的 maildir 格式的郵箱.

注意: qmail-local 可以將郵件傳送到 maildir 格式郵箱, 但是不能創建這種郵箱. 你需要使用qmail 附帶的maildirmake 程序來創建 maildir 格式郵箱. 例如: "maildirmake ~/Maildir". 不過要確定你使用maildir的擁有者運行maildirmake, 而不是 root 用戶. 另外的方式, 你的 useradd 和 adduser 命令可能支持"skeleton"骨架目錄, 例如: /etc/skel, 然後可以直接複制這個目錄給所有新用戶.

4.1.4. 轉發郵件轉發郵件就是將郵件重發到指定地址. 這些寫入.qmail文件內的地址不能包含注釋部分和多余的空格.

下面的寫法是錯的:

%26amp; %26amp; user@example.com %26amp;Joe User

下面的是正確的寫法:

%26amp;user@example.com user@example.com %26amp;user

前兩個將郵件副本轉發給 user@example.com, 最後一個將郵件副本轉發給本地用戶 user.

4.1.5. 擴展地址 qmail 支持用戶控制擴展地址. 在基本地址 username@hostname.domain 上擴展的擴展地址爲: username-extension@hostname.domain ,用戶同樣可以接收發往擴展地址的郵件. 在本節其余部分, 我們討論的範圍都是在本地系統上, 所以我們將不再使用"@hostname.domain" 部分.

給用戶 username 的郵件傳送指令由 ~username/.qmail 文件指定. 對于型如username-extension 的擴展地址的傳送指令由用戶目錄下的~username/.qmail-extension 文件指定.

舉一個例子, dave-lwq@sparge.example.com 這個擴展地址的傳送將由文件 ~dave/.qmail-lwq 來控制.

擴展地址可以擁有多個字段, 例如 dave-list-qmail 這個擴展地址, 由 ~dave/.qmail-list-qmail 來控制. 在這個例子裏面, dave-list-qmai 這個地址被用來訂閱 qmail 的郵件列表, ~dave/.qmail-list-qmail 則負責歸檔這個列表的郵件到單獨的郵箱裏面.

.qmail 文件可以用-default 後綴進行匹配。 所以 dave-list-qmail 可以由 ~dave/.qmail-list-default 操作. 這個文件可以一對多方式用一個.qmail文件控制所有型如 dave-list-加上任何後綴的地址. 注意 dave-list 不能由 ~dave/.qmail-list-default 控制, 因爲在"list"後面沒有"-".

qmail 會使用最接近的匹配方式. 例如, qmail在傳送一個標志著送給dave-list-qmail這個地址的郵件時, 會按照下面順序查找.qmail控制文件, 並按照最先匹配的.qmail文件傳送這個郵件.

.qmail-list-qmail .qmail-list-default .qmail-default

如果沒有找到相匹配的.qmail文件, 傳送失敗, 並且將郵件反彈給發送者.

4.2. 發送郵件 郵件用戶通常並不直接發送郵件. 典型的方式是利用郵件用戶代理(Mail User Agent, MUA)程序, 例如 pine 或者 mutt 編寫並發送郵件. MUA程序調用MTA傳送郵件. 這個處理郵件到MTA的調用過程稱爲注入(injection).

有兩種方式完成注入, 一種利用SMTP協議(Simple Mail Transfer Protocol, SMTP), 或者利用MTA提供的的特定程序.

4.2.1. SMTP 方式 MUA程序可以使用TCP協議連接到標准的SMTP協議端口25, 可以是本地主機或者指定的郵件服務器. MUA和MTA後續進行的回話導致兩個結果:

郵件被傳送給MTA, 或者 返回一份錯誤報告給MUA SMTP沒有身份認證的機制, 所以發送郵件的過程是不要求用戶名和密碼的. 但是, 大多數MTA拒絕接收既不是來自本地用戶也不是發送給本地用戶的郵件的. 如果一個恰當的格式的郵件被MTA拒絕, 最大的可能就是轉信限制造成. 參見轉信小節查看更多的如何配置轉信的信息.

4.2.2. /var/qmail/bin/sendmail 文件 很多年以來, UNIX MTA一直都是Sendmail. 由于Sendmail的應用十分普遍, 許多程序員假定它是默認的MTA. 結果, Sendmail的本地注入機制成爲標准的本地郵件注入的應用編程接口(Application Programmer's Interface, API). qmail 以及其他非Sendmail的MTA因此也提供一個sendmail程序應用于本地注入方式上, 它的工作方式和真正的Sendmail 的 sendmail程序一樣.

qmail 的用于替換Sendmail相應部分的 sendmail 程序, 通常位于 /var/qmail/bin/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

4.2.3. qmail-inject 除了模仿 sendmail 的 API之外, qmail 也擁有自己的注入程序: qmail-inject. 實際上, qmail提供的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程序設定和使用環境變量, 下面的表格列出了這些變量並且描述了他們的用法.

名字

Man 幫助頁

設置/使用

使用目的

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

使用

重載ontrol/defaultdomain 文件

QMAILDEFAULTHOST

qmail-inject

使用

重載control/defaulthost 文件

QMAILHOST

qmail-inject

使用

在郵件頭From中的主機名(1)

QMAILIDHOST

qmail-inject

使用

重載control/idhost 文件

QMAILINJECT

qmail-inject

使用

指定幾個選項(參見下面的表格)

QMAILMFTFILE

qmail-inject

使用

包含下一級跟蹤的郵件地址列表的文件

QMAILNAME

qmail-inject

使用

在郵件頭From中的個人姓名(1)

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)

QMAILINJECT 標志位 QMAILINJECT Flags 字母

使用目的

c

爲From部分使用地址注釋風格

s

不考慮任何傳入郵件的返回路徑部分

f

刪除所有傳入郵件的From部分

i

刪除所有傳入郵件的Message-ID部分

r

使用每接收者VERP

m

使用每郵件VERP

5. 高級話題5.1. 關于 procmailprocmail 是一個流行的郵件傳送代理( Message Delivery Agent , MDA). MDA的功能是從MTA爲特定用戶或者郵箱接收郵件, 然後按照用戶的要求傳送郵件的程序. procmail 可以用來針對郵件主體或者不同的郵件頭內容過濾郵件. 舉一個例子, 從某個特定的人發來的郵件可以被定向傳送到某個專門爲這個人准備的郵箱.

在qmail上應用procmail有兩個技巧. 第一個, procmail 通常被配置成傳送郵件到/var/spool/mail 下的mbox 格式的郵箱. 你可以重新設置安裝procmail到缺省的$HOME 路徑下, 或者指導用戶不要依賴procmail 將郵件投遞到默認的mbox位置. 除非你爲$HOME 郵件投遞方式打補丁, 否則, procmail依然會使用/var/spool/mail 作爲臨時文件.

另外一個問題是qmail-command和procmail使用的退出碼是不同的. procmail使用的是標准UNIX退出碼: 零代表成功, 非零代表失敗, 失敗的原因由/usr/include/sys/errno.h 定義. qmail-command 使用某個非零碼指示永久錯誤, 其余作爲臨時碼. 解決方式可以應用一個小的shell腳本爲 qmail-command 翻譯退出碼. 這樣的一個shell腳本曾經在qmail 郵件列表刊登, 現在被存檔在這個位置http://www.ornl.gov/lists/mailing-lists/qmail/1998/04/msg00487.html.

同樣的情況, 舊版本的procmail(3.14之前)不能直接傳送郵件給maildir格式的郵箱. 最好的辦法是升級你的procmail到最新版本. 另外一個解決辦法是使用safecat, 這個程序將標准輸入的郵件寫入指定的maildir格式的郵箱. 用戶可以使用 procmail 處方(傳送指令)來使用safecat 保存郵件. 也可以完全跳過procmail, 使用maildrop.

最後, procmail 認爲郵件將被接收到mbox格式的郵箱, 常規的qmail傳送程序僅僅包括實際的郵件, 而不包括"From"起始行. 這裏可以使用preline 命令來格式化郵件, 以保證procmail的要求. 上面鏈接提到的腳本就包括了 preline.

舉一個例子, 假設用戶"dave"希望用procmail來處理他的郵件. 他的系統管理員設置procmail來傳送郵件到默認的$HOME, 並且已經配置好了上面的退出碼翻譯腳本程序, 假設名字是 /usr/local/bin/qmail-procmail, 那麽他的.qmail文件應該是這個樣子的:

|/usr/local/bin/qmail-procmail

5.2. POP 和 IMAP 服務器 qmail包括一個POP服務器, qmail-pop3d, 不過並沒有作爲qmail 安裝過程的一部分. 你可以選用其他POP或者IMAP服務器, 盡管他們大多數都是爲Sendmail編寫的, 在qmail下運行這些服務器時, 需要作一些額外的修改工作.

5.2.1. qmail-pop3dqmail-pop3d 是qmail自帶的很不錯的POP服務器. 很多qmail站點都使用它作爲POP服務器. 它是模塊化的, 可以通過不同的認證模塊支持多種認證方案.

注意: 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端口監聽, 一旦有連接, 它將提示輸入用戶名和密碼, 然後它調用checkpassword來校驗用戶名/密碼, 通過校驗後調用qmail-pop3d.

5.2.1.2. 安裝 qmail-pop3d 1. 完整安裝並測試qmail. 如果你希望所有用戶都可以用 POP 方式訪問郵箱, 那麽首先確定 defaultdelivery 文件內容已經設置爲 ./Maildir/. 如果你是按照本文的安裝小節安裝的qmail, /var/qmail/rc腳本已經被安裝到恰當位置, 那麽在文件 control/defaultdelivery 中已經配置了這個參數. 如果不是這樣安裝的, 則這個參數可能是在/var/qmail/rc 的 qmail-start 命令行上實現的.

2. 從http://www.qmail.org/top.html#checkpassword下載checkpassword 程序. 如果你不需要其他特別的東西, 也可以在http://cr.yp.to/checkpwd.html 下載標准的checkpassword程序.

3. 按照安裝指導編譯並安裝checkpassword程序. 確定你安裝程序到 /bin/checkpassword 下.

注意: 如果你安裝的是標准checkpassword, 解開源代碼之後別忘記打修補錯誤返回碼的補丁: patch

4. mkdir /var/qmail/supervise/qmail-pop3d

5. 創建一個/var/qmail/supervise/qmail-pop3d/run 腳本, 包括如下內容:

#!/bin/shexec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -H -l 0 0 110 /var/qmail/bin/qmail-popup \ FQDN /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2%26amp;1

這裏 FQDN 是你建立的POP服務器的完整的有資格的正式域名, 例如, pop.example.net.

注意: 由softlimit命令 指定的內存使用限度是可以依賴于你是用的的硬件平台和操作系統作適當提高的. 當連接到110端口失敗或者POP3連接以難以理解的方式失敗情況下, 或者你查看到如下錯誤信息:

/usr/local/bin/tcpserver: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory

試著將這個參數提高到3000000或者5000000.

6. mkdir /var/qmail/supervise/qmail-pop3d/log

7. 創建包括以下內容的/var/qmail/supervise/qmail-pop3d/log/run 文件.

#!/bin/shexec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \ /var/log/qmail/pop3d

8. 建立log日志文件夾並且設置相應的run腳本, 將腳本鏈接到 /service 目錄:

chmod +t /var/qmail/supervise/qmail-pop3d # if daemontools 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

9. 將下面內容加入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

10. 將下面內容加入qmailctl腳本的"stop"部分

echo " qmail-pop3d" svc -d /service/qmail-pop3d /service/qmail-pop3d/log

11. 將下面內容加入qmailctl腳本的"stat"部分

svstat /service/qmail-pop3d svstat /service/qmail-pop3d/log

12. 將下面內容加入qmailctl腳本的"pause"部分

echo "Pausing qmail-pop3d" svc -p /service/qmail-pop3d

13. 將下面內容加入qmailctl腳本的"cont"部分

echo "Continuing qmail-pop3d" svc -c /service/qmail-pop3d

14. 將下面內容加入qmailctl腳本的"restart"部分

echo "* Restarting qmail-pop3d." svc -t /service/qmail-pop3d /service/qmail-pop3d/log

5.2.2. Qpopper如果你需要一個在mbox格式郵箱下工作的的POP後台服務程序, 你可以選用 Qualcomm的 Qpoper. 可以在這裏找到 http://www.eudora.com/products/unsupported/qpopper/.

5.2.3. Binc IMAPAndreas Hanssen 編寫了 Binc IMAP服務器, Binc IMAP被設計爲和qmail-pop3d使用相同的認證機制(checkpassword), 所以它很適合于qmail 郵件服務器. 和qmail-pop3d一樣, 它只支持maildir格式的郵箱. 參見http://www.bincimap.org/.

5.2.4. DovecotTimo Sirainen 編寫了Dovecot, 這是一個mbox 和 maildir 格式郵箱都予以支持的 IMAP 和 POP 服務器. 以安全爲設計目標. 可以在這裏訪問到它 http://dovecot.procontrol.fi/.

5.2.5. imap-maildirDavid R. Harris 整理了有關 University of Washington IMAP 服務器的關于 maildir 格式支持的補丁, 並且存檔了安裝過程. 參見http://www.davideous.com/imap-maildir/ .

5.2.6. Courier-IMAPSam Varshavchik 編寫了一個只支持maildir郵箱的IMAP 服務器. 可以在這裏 http://www.courier-mta.org/imap/ 訪問.

5.2.7. CyrusCarnegi Mellon 大學的Cyrus 項目包含了一個IMAP 服務器, 可以在這裏找到它 http://asg.web.cmu.edu/cyrus/imapd/. Rick Updegrove 寫了一個qmail到cyrus的腳本用來將郵件傳送給Cyrus 存儲, 這個http://msgs.securepoint.com/cgi-bin/get/qmail0308/41/1/1.html.

5.3. POP 和 IMAP 客戶端 5.3.1. fetchmailfetchmail 是一個從POP或者IMAP服務器接收郵件並且再次本地注入的程序. fetchmail從qmail服務器接收郵件是沒有問題的, 不過作爲qmail的客戶端, 要讓它良好的工作, 有兩個技巧.

這裏是一個在qmail系統上爲某個用戶配置的.fetchmailrc例子:

poll mail.example.net proto pop3 nodns user dsill with password flubgart is dave here fetchall forcecr

這個文件指示fetchmail 通過POP3協議連接mail.example.net服務器, 使用賬戶dsill , 密碼flubgart, 登錄並接收所有郵件, 然後傳送這些郵件到 dave@localhost. forcecr 標志使fetchmail將每個郵件通過SMTP方式注入本地系統前對郵件的每行以回車符結束. qmail要求如此.

5.3.2. getmailgetmail 從POP服務器接收郵件然後傳送到maildir格式的郵箱. 實際上它是個Python 腳本, 所以你在使用getmail之前需要安裝Python解釋器.

getmail 由 Charles Cazabon 編寫, 他在這個位置 http://pyropus.ca/software/getmail/ 爲getmail維護了一個網頁.

5.4. Multi-RCPT 與 Single RCPT 傳送方式的比較 假如你是一個MTA, 你的一個用戶發送一封郵件給 hostx.example.com上的三個人. 那麽你有以下幾種方式可以達成目標.

你可以建立一個連接到hostx主機, 發送郵件的一個拷貝給第一個用戶, 發送一個拷貝給第二個用戶, 發送一個拷貝給第三個用戶, 然後關閉連接. 你可以開始三個進程, 每一個都建立一個和hostx的SMTP連接, 給每個用戶發送一份郵件的副本, 然後關閉連接. 你可以建立一個SMTP連接, 然後發送一個標志著傳送給所有三個用戶的副本, 然後關閉連接. 第一個方法明顯劣于第三個. 甚至郵件很小的情況下, 整個郵件傳送也需要最長的時間. 如果郵件很大, 那麽將會使用很長時間並且浪費大量網絡帶寬.

所以, 劃掉第一個.

第二個和第三個方法有點意思.

第三個方法僅僅建立一個連接到hostx, 而且只發送一個郵件的副本, 這個方式取得了最有效的帶寬利用率.

第二種方式建立多個連接, 並且傳送了郵件的多個副本, 這是非常浪費帶寬的, 不過由于SMTP協議的現狀, 這個方式可以得到更少的來回往返延遲, 從而比第三中方式更快. 而且比第三種方式更簡單, 進而MTA可以被編寫使用一個更直接了當的方式來傳送郵件. 最後, 由于每個接收者接收到屬于他自己的哪一份郵件副本, 這樣才有可能讓MTA實現VERPs(參見下一節)

qmail 總是使用第二種方式(single RCPT). 而且沒有補丁讓qmail實現第三種方式(multiple RCPT)的傳送-- 因爲那將是一個非常大的修補工作.

雖然有些病態的案例表明第二種方式比第三種方式更慢, 整體上, 系統的簡單性和VERP取得的優勢比這個更爲重要.

Single RCPT 傳送方式比multiple RCPT方式的確使用了更多的帶寬, 不過差別常常是被誇大了的. 絕大多數郵件至多只有兩個接收者, 而他們通常是本別兩個主機上的用戶, 對于這樣的情形, multi-RCPT沒有任何優勢. 甚至情況特殊些, 在一個郵件列表服務器上, 相對來說, multi-RCPT看起來會有很大幫助可是潛在的增益是非常微小的, 因爲SMTP利用的往往只是帶寬的很細碎的份額, 在絕大多數連接上, HTTP通常占用了最大的部分.

舉一個例子, 如果你的上行帶寬的10%用于SMTP, 假設你的SMTP帶寬由于使用multiple RCPT被降低了25%, 那麽實際上應用multiple RCPT僅僅讓你的SMTP需求的總帶寬需求降低到了7.5%.

5.5. 關于 VERP一旦一個郵件未能被傳送, MTA的反應應該是按照信封上的返回路徑(envelope return path, ERP)發送一個反彈郵件. 反彈郵件應該包括接收者的地址, 未能發送的原因, 以及故障是暫時的還是永久的信息. 盡管某些MTA做的不是正確的事情, 他們發送反彈郵件給郵件頭的From區域標志的地址, 或者反彈郵件幹脆不能識別接收者.

對于大多數用戶到用戶的郵件, 這種問題沒什麽大不了. 人們可以按照反彈定時和郵件內容來處理. 可是對于郵件列表, 糟糕的反彈將會嚴重的多. 訂閱者移動, 轉發郵件到他們的新地址, 如果新地址發生傳送問題, 並且反彈郵件只包含了新地址, 那就無法知道到底是哪個訂戶的郵件被反彈了.

Dan Bernstein 爲這個問題提出一個解決方案稱爲VERP(Variable Envelope Return Path). 使用VERP, 發送給每個郵件列表訂戶的郵件都擁有唯一的返回路徑. 這讓反彈控制可以控制查找有問題的訂閱者.

舉一個例子, 一個典型的非VERP郵件列表擁有的返回地址型如listname-owner@domain. 而對于VERP類型的郵件列表, 返回地址型如listname-owner-subscriber=sdomain@ldomain, 這裏訂戶的地址 subscriber@sdomain被嵌入到列表擁有者"owner"和符號"@"之間了. (訂閱者郵件地址的"@"符號被置換成等號"=".)

ezmlm郵件列表管理器使用VERP來自動控制反彈. 對于列表暫時的傳送問題造成的某些郵件丟失, 這個管理器也提供讓訂閱者從列表存檔文件中單獨接收的功能. T

Russell Nelson 爲qmail下的Majordomo寫了一個反彈控制器, 不過他沒有再繼續維護這個軟件. 可以在這裏http://www.qmail.org/bounceman-0.4.shar 訪問到它.

5.6. 故障處理 5.6.1. 進程一個恰當運行著的, 完整的, 最小化安裝的qmail 應該擁有下面的四個進程.

由用戶qmails 運行的 qmail-send 由用戶qmailq運行的qmail-clean 由用戶qmailr運行的qmail-rspawn 由用戶root運行的qmail-lspawn 取決于你使用的何種UNIX, 下面兩個命令的一個可能列出這些進程, 而且可能還要多一點:

ps -ef | grep qmail ps waux | grep qmail

舉個例子:

[dave@sparge dave]$ ps waux|grep qmaildave 2222 0.0 0.8 836 348 p4 S 10:25 0:00 grep qmailqmaild 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 qmailqmailq 368 0.0 0.7 736 292 ? S N 12:43 0:00 qmail-cleanqmailr 367 0.0 0.6 732 272 ? S N 12:43 0:00 qmail-rspawnqmails 350 0.0 0.8 776 336 ? S N 12:43 0:00 qmail-sendroot 340 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/qmail-send /var/qmail/rcroot 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.smtproot 366 0.0 0.7 736 276 ? S N 12:43 0:00 qmail-lspawn ./Mailbox[dave@sparge dave]$

如果你在supervise下運行qmail或qmail-smtpd, 像上面的例子那樣, 你應該能看到上面那些進程. 如果你在tcpserver下運行qmail-smtpd, 你將看到一個父tcpserver進程加上每個活動的SMTP訪問建立的連接的tcpserver進程.

如果你使用splogger (或者 multilog 或者 cyclog) 來控制日志, 你應該還有一個 splogger(或者 multilog 或者 cyclog) 進程由用戶qmaill運行著.

同時, 如果qmail忙于傳送本地和遠程郵件, 你將會看到最高上限爲 concurrencylocal 個數的qmail-local進程, 或者最高上限爲 concurrencyremote 個數的qmail-remote 進程.

5.6.2. 日志 5.6.2.1. multilogmultilog, 是daemontools 軟件包內的一部分, 功能是將日志記錄到指定文件夾內一系列文件上.

日志文件夾將在multilog命令行上指定, 所以你可以檢查你的qmail運行腳本來確定文件夾的位置.

log文件夾內文件數量以及每個log文件的最大長度, 是由multilog的選項決定的. log日志文件名是以文件開始記錄時刻的TAI (Temps Atomique International) 時間戳命名的. daemontools裏面的另外一個命令 tai64nlocal , 可以轉換TAI時間戳爲易讀的本地時間戳.

一個標准的multilog日志條目看起來是下面這樣的:

@4000000038c3eeb104a6ecf4 delivery 153: success: did_1+0+0/

"@4000000038c3eeb104a6ecf4"是TAI時間戳, 爲可選部分, 不過推薦在日志條目裏面加上這個段, "delivery 153: success: did_1+0+0/" 是日志消息本身.

5.6.2.2. sploggersplogger 使用syslog 日志記錄系統給消息打時間戳, 然後將消息送往syslog後台服務程序. Syslog的配置文件爲 /etc/syslog.conf. 發送給syslog的消息擁有功能和優先級屬性. syslog按照定義在/etc/syslog.conf裏面的條目過濾消息, 並依據功能和優先級將消息發往以下目標: log日志文件, 遠程日志主機, 或者控制台. splogger 默認情況下將記錄到mail 功能下面, 所以用grep命令在syslog.conf文件裏面查找"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.3. 日志消息下面是一段從本地系統發送一個郵件到遠程系統的日志片斷:

1 @4000000038c3eeb027f41c7c new msg 938692 @4000000038c3eeb027f6b0a4 info msg 93869: bytes 2343 from qp 18695 uid 494913 @4000000038c3eeb02877ee94 starting delivery 2392: msg 93869 to remote lwq@w3.to4 @4000000038c3eeb0287b55ac status: local 0/10 remote 1/205 @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/207 @4000000038c3eeb104a6ecf4 end msg 93869

第 1 行指出qmail接收到一條新郵件, 郵件的隊列ID是93869. 隊列ID是 /var/qmail/queue/mess/NN/ 包含這個郵件的隊列文件的 i-node 節點值. 隊列ID將在這個消息存在于隊列的過程中保持全局唯一.

第 2 行表明郵件來自 dave@sill.org, 並且大小爲2343字節.

第 3 行表明qmail-remote開始傳送這個郵件到lwq@w3.to, 並且爲這個傳送指定了ID 2392.

第 4 行指出 0 個本地傳送和 1 個遠程傳送處于等待狀態.,

第 5 行顯示出 ID 2392 這個傳送已經成功完成, 並且返回遠程主機的回應, 這個回應裏面常常包含了遠程郵件管理員對于跟蹤這個傳送的有用信息. 在我們這個例子裏面, "CAA01516"是遠程系統的傳送ID.

第 6 行指出 0 個本地傳送和 0個遠程傳送處于等待狀態. 也就是傳送已經完成了.

第 7 行指出這個消息已經被傳送完畢並且被移出隊列. 這個時候, 隊列ID 93869, 已經可以重用于其他傳送ID了.

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)是幫助郵件列表所有者運行郵件列表的的程序. 它的功能由兩部分組成: 管理訂閱者列表, 還有就是控制對訂閱者的郵件再發.

大多數(全部?)UNIX郵件列表管理器都可以和qmail 合作運行.

5.9.1. ezmlmezmlm 是qmail的作者Dan Bernstein爲qmail編寫的郵件列表管理器. 它依賴于qmail服務器的幾個特點工作, 最顯著的, 就是它使用VERPs 來可靠的處理反彈郵件. ezmlm 在衆多郵件列表管理器(MLM)中顯得有點獨特, 它不是處理傳送到中央MLM地址的命令, 而是將命令附加在列表名字後面. 例如, 發送郵件到"foo-subscribe@list.example.net" 來訂閱 "foo@list.example.net" 的郵件列表, .

關于ezmlm的更多信息, 參見 http://www.ezmlm.org/, 這是ezmlm的非正式web站點. ezmlm-idx的正式站點, 介紹了這個非常棒的add-on插件ezmlm-idx, 它包括了很多有用的特色.

5.9.2. MajordomoMajordomo 是最受歡迎的UNIX MLM之一. 只要作很少的簡單修改就可以使它和qmail很好的合作了. Russ Allbery曾經寫了一個關于qmail和Majordomo的FAQ, 可以在這個位置訪問http://web.archive.org/web/20050308091420/http://www.eyrie.org/~eagle/faqs/mjqmail.html.

5.10. 補丁 Patchesqmail擁有各種各樣的源代碼補丁. 爲了安裝補丁, 下載補丁並且進入qmail源代碼目錄樹, 使用patch 命令施加補丁.

cd /usr/local/src/qmail/qmail-1.03 patch -p0

注意: 參考 patch 的 man 幫助頁取得更多信息. 這僅僅是個例子. 你可能需要使用最新版本的GNU patch 來施加補丁, 參見http://www.gnu.org/software/patch/patch.html.

終止 qmail-send 來停止qmail, 或者如果你安裝了 qmailctl 腳本, 那麽這樣:

qmailctl stop

然後重新編譯和安裝新的二進制代碼:

make setup check

然後重新啓動:

qmailctl start

最後測試qmail, 尤其是你打補丁的部分.

注意: 雖然http://www.qmail.org/列出了qmail的大量補丁, 但是他們中的任何一個都沒有得到qmail作者的認可. 這些補丁可能引入qmail原本沒有的安全, 可靠性, 效率以及功能性問題. 絕大多數qmail安裝只是要求某些推薦的補丁. 請不要安裝任何你不是明確需要的補丁.

5.10.1. 推薦的補丁 qmail.org 有一個"Recommended Patches"小節 http://qmail.org/top.html#patches . 這些補丁用于幾個已知的qmail的bug.

注意: 所有推薦補丁都已經包括在 netqmail發行版中. 請參考http://www.qmail.org/netqmail/. 5.10.1.1. errno.h 補丁這個補丁修複 errno.h 頭文件缺失問題. 參考http://article.gmane.org/gmane.mail.qmail.general/13960 查看這個補丁, 以及的詳細的解釋.

Mate Wierdl 爲所有 Dan Bernstein 的軟件, 其中包括 qmail, daemontools 和 ucspi-tcp 編寫了關于 errno.h 的補丁. 可以在這裏找到這些補丁文件: http://www.thedjbway.org/patches/djb_errno_patches.tgz.

5.10.1.2. qmail-local TAB 補丁這個補丁修補處理.qmail文件內對TAB 字符開頭命令解析的小bug. 參見http://www.ornl.gov/lists/mailing-lists/qmail/2000/10/msg00696.html

5.10.1.3. IP 0.0.0.0 補丁這個補丁將使qmail把 0.0.0.0 這個IP地址作爲本地主機處理. http://www.suspectclass.com/~sgifford/qmail/qmail-0.0.0.0.patch .

5.10.2. DNS在曆史上, DNS 的回答被限制在512字節以內. 一些大型站點返回的 MX 記錄要長于這個限度. 這樣qmail和其他很多程序都會遇到這個DNS返回查詢記錄過長的問題. 有兩種種方式來修補qmail, 其中任何一個都夠用了.

5.10.2.1. Christopher K. Davis 的補丁程序, http://www.ckdhr.com/ckd/qmail-103.patchChuck Foster 寫了一個補丁修正, 可以配合任何一種DNS 解析庫工作, 無論多老的庫, 這個補丁使用一個保護字節來避免"置于緩沖區中的字節數"這個庫bug. 通過一次性重分配緩沖區爲65536大小, 而不是申請分配恰好合適的緩沖區大小來解決問題, 所以它可能要比Chuck 的補丁內存使用效率低. (盡管如此, 這個補丁也只是當返回大小大于PACKETSZ 情況下才進行緩沖區重分配, PACKETSZ 的默認大小爲512字節). 緩沖區重分配後, 將強制一次TCP查詢, 而不是要求DNS 解析庫去作解析(這樣避免了qmail 和名字服務器之間的額外來回交互過程, 盡管qmail 和名字服務器可能都在一個服務器上, 或者都在本地網絡內, 這些來回交互過程並不是什麽問題).

5.10.2.2. 提高包緩存長度到65536 如果DNS反饋設置有切斷位, 在近來的BIND解析庫下工作時, 解析器編碼爲自動進行TCP查詢. 雖然取決于你的系統如何管理系統內存頁的情況下, 內存的最大浪費成爲潛在存在的可能性, 不過這卻是最簡單的修補. 作這個修補, 只需要替換 dns.c 文件內的PACKETSZ爲 65536, 然後重新編譯安裝qmail就行了.

5.10.2.3. 從djbdns 運行 dnscachednscache 顧名思義, 是一個DNS的緩存服務器. 它知道如何掌握很長的DNS 返回記錄, 去掉不必要的查詢信息, 所以通過它返回的結果通常比直接查詢更小, 並且通常可以爲所有服務提高DNS查詢性能. 由于它不用給qmail打補丁, 這是一個可以接受的方式, 遺憾的是, 它並不能完全解決問題, 通過它返回可能對qmail 還是過大. 參見 相關軟件包 下的 djbdns 節取得更多信息.

5.10.3. qmail-ldap這個補丁, 由 Andre Oppermann等人編寫, 實現了qmail的Lightweight Directory Access Protocol (LDAP)支持. LDAP像一個網絡電話簿. 使用 qmail-ldap, 它可以使一個POP服務器支持數千計的衆多用戶. 參見http://www.nrg4u.com/.

5.11. QMTPQMTP 是 Quick Mail Transfer Protocol 的縮寫, 由Dan Bernstein設計的用來替代SMTP的協議. 這個協議定義在 http://cr.yp.to/proto/qmtp.txt . QMTP比SMTP更簡單, 更快速以及兼容SMTP. qmail包含一個QMTP服務器, qmail-qmtpd, 它運行起來非常類似于 qmail-smtpd. QMTP通常使用端口209.

qmail並不包括QMTP的客戶端, 不過 serialmail 軟件包包括一個客戶端. maildirqmtp 命令接收maildir格式郵箱並以QMTP協議傳送郵箱內的郵件到指定的QMTP服務器.

QMTP不是一個drop-in方式的SMTP的替代品, 在因特網上的使用也不是很普遍.

Russ Nelson 爲qmail-remote寫了一個支持QMTP的補丁. 可以在 這裏 http://www.qmail.org/qmail-1.03-qmtpc.patch 取得這個補丁. 他也編寫了一個tarball安裝方式的程序, 可以展開到 /service 目錄下進行QMTP服務. 可以在這裏http://www.qmail.org/qmtpd-service.tar.gz 取得這個tarball包.

5.12. 在SMTP對話過程中拒絕無效接收者當一個遠端服務器連接到 qmail-smtpd服務並提交了一個郵件時, qmail-smtpd服務會依據 control或 rcpthosts的內容來檢查收件人的地址. 如果接受者的服務器名或域名(就是郵件地址在@符號後面的部分)在這兩個列表內存在,qmail-smtpd 會接受這封郵件, 並將郵件放置于發送隊列內, qmail-send 將開始嘗試傳送郵件. 如果通過名字在本地接收者內查找不到接收用戶或者別名, 即本地接收者無效, qmail-send 會生成一個反彈郵件並將郵件傳送到回複地址, 這個回複地址在SMTP對話過程中確定.

在一個秩序並禮貌的世界, 任何策略或計謀都是有好的結果的. 但很不幸, 除此之外, 還有很多行爲惡劣的垃圾郵件制造者. 一些垃圾制造者試圖把郵件發送到你服務器上"可能"存在的用戶郵箱, 他們使用常用名字字典或數據庫, 甚至他們窮舉所有可能的字母組合來構成一本名字字典, 向整個字典或數據庫內所有"可能"存在的人發送垃圾郵件.

在qmail 系統內, 這種垃圾郵件行爲會造成巨大的系統負擔, 郵件隊列內充斥垃圾, 並且耽擱了合理合法郵件的傳送.

一些MTA 在SMTP 對話過程中對本地郵件接收者進行確認並對不匹配的郵件予以拒絕, 這免去了郵件服務器大量的不必要工作, 但也帶來了負面影響, 使用這種校驗方式, 垃圾郵件制造者可以迅速確定那些郵件地址在你的服務器上是存在的.

有幾種方式可以在qmail 上實現在SMTP 對話過程中校驗用戶名是否存在. Eben Pratt 建立了一個列表, 在這裏http://netdevice.com/qmail/rcptck/ . 絕大多數這種解決方案都要求提供一個有效或無效接收者的數據庫或者相應模式. 其中一個不使用數據庫的解決方式是Paul Jarc 的qmail-realrcptto, 可以在這裏找到它http://code.dogmap.org./qmail/.

5.13. TLS and STARTTLS關于在qmail 上使用傳輸層加密(TLS), Scott Gifford 寫了一個非常詳細徹底的一步一步介紹文檔, 包括在SMTP 上使用STARTTLS 和在POP3D 上使用STLS, 專門用于netqmail , 可以在這裏訪問這個文檔: http://www.suspectclass.com/~sgifford/ucspi-tls/ucspi-tls-qmail-howto.html.

附錄 A. 致謝 首先, 感謝Dan Bernstein 編寫了這樣一個強大而優雅的系統. 經過近十年的使用, qmail依然給我深刻的印象.

我也感謝那些qmail 郵件列表的成員. 作爲最有幫助的, 最有耐心的, 以及最知識淵博和有趣的撰稿人之一, Russell Nelson 應該被特別提及, 他對于qmail 社區的貢獻僅次于DJB. 其次是Charles Cazabon, 他緊接著Russ 之後, Charles 是最近郵件列表的主要撰稿者, 比其他人更多的給出正確答案. Charles 還寫了兩個非常有用的實用程序--getmail 和pymsgauth, 同時還是The qmail Handbook 的技術編輯, 他的文章被認爲是此書成功的重要原因, 因此他也得到了不少獎賞和贊譽.

感謝每一個評論或者對這個文檔作出貢獻的人, 他們包括:

Vince Vielhaber Chris Green Christopher K. Davis Scott Schwartz Fred Lindberg Russell P. Sutherland Alex Miller Tim Hunter Frank D. Cringle Mahlon Smith Rogerio Brito Tony Hansmann Matthias Andree Tillman Hodgson Stefan Witzel Scott Gifford 有太多可被提及的其他的人了.... 特殊感謝Henning Brauer捐贈了lifewithqmail.org 域名, 並維護服務器!

Life with qmail 使用Simple Document Format (SDF) 編寫, SDF是一個非常酷的基于Perl 的標記語言, 可以産生HTML, 純文本, PostScript, POD以及其他格式. 這個工具使工作變得特別容易, 參見http://search.cpan.org/author/IANC/sdf-2.001/ 查找關于這個工具的更多信息.

附錄 B. 相關軟件包介紹 B.1. dot-forwardSendmail 使用.forward(發音 dot forward)文件來允許用戶控制傳輸他們收到的郵件. qmail使用一種類似的機制: .qmail文件. dot-forward軟件包給予qmail使用.forward文件的能力. 那些使用Sendmail和其他使用.forward控制文件的系統可以利用dot-forward程序來避免使用.forward文件的等效物.qmail文件, 在轉移到qmail 品太過程中不用將.forward 文件轉換爲.qmail 文件, 或者簡單地對于用戶來說, 在使用qmail平台時盡量少的改變用戶原來使用Sendmail時看得到的東西., 比如直接使用. forward文件的習慣.

dot-forward程序是一個小軟件包, 很容易安裝配置. 源代碼可以在http://cr.yp.to/software/dot-forward-0.71.tar.gz.這裏取得.

dot-forward 由Dan Bernstein編寫, 他爲這個軟件維護了一個web頁面http://cr.yp.to/dot-forward.html.

B.2. fastforwardfastforward是另一個Sendmail兼容插件. Sendmail使用保存在一個單一文件內的中心別名數據庫, 通常是 /etc/aliases. qmail使用/var/qmail/alias下的一系列文件, 一個別名一個文件. 如果你要從Sendmail遷移到qmail, dot-qmail文件還不想轉換Sendmail格式的的別名文件, 那麽fastforward賦予qmail按照原樣使用Sendmail別名文件的能力.

源代碼可以在 ftp://cr.yp.to/software/fastforward-0.51.tar.gz 這裏取得.

fastforward 由Dan Bernstein 編寫, 他在 http://cr.yp.to/fastforward.html 這裏維護了一個web頁面.

B.3. ucspi-tcpqmail的SMTP服務器並不是按照一個獨立的後台服務程序運行的, 必須依靠例如 inetd, xinetd 或者 tcpserver 這些助手程序運行. 當這些助手程序接受一個到達25端口, SMTP端口, 的TCP連接之後, 將執行一個qmail-smtpd的副本.

inetd 是標准網絡服務器"super-server". 可以通過配置/etc/inetd.conf 來運行qmail-smtpd, 不過推薦的工具是tcpserver, 它是ucspi-tcp軟件包的一部分. ucspi-tcp是UNIX Client-Server Program Interface for TCP的縮寫, 發音是 ooks-pie tee see pee.

tcpserver 優于 inetd的幾條原因:

tcpserver 允許限制並行訪問服務的數量. inetd使用連接率限制機制在"太忙"情況下阻斷服務. tcpserver 可以被配置爲拒絕某些主機連接或者認可並標志本地主機, 使qmail-smtpd 可以分別對待. tcpserver 是唯一的qmail 作者認可的服務器. 源代碼可以在這裏ftp://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz取得.

Gerrit Pape 爲ucspi-tcp作爲 man 幫助頁分發的文檔可以在這裏http://smarden.org/pape/djb/ 訪問到.

ucspi-tcp由Dan Bernstein編寫, 他在這裏http://cr.yp.to/ucspi-tcp.html維護了一個web頁.

B.4. daemontoolsdaemontools軟件包包含了一系列控制和監視服務的實用工具. 不強制使用, 但高度推薦, 特別是對于比較繁忙的系統. 它包括:

superivse, 監視服務並在服務停止後重新啓動之. svc, 用來要求supervise 停止, 暫停, 或者重啓動服務器. multilog, 維護服務的日志, 可以自動回轉記錄以保持低于配置大小. seruidgid, 使用普通用戶的UID和GID爲超級用戶運行程序. daemontools的源碼可以在這裏http://cr.yp.to/daemontools/daemontools-0.76.tar.gz取得.

Gerrit Pape 爲daemontools作爲 man 幫助頁制作的發行文檔可以在這裏http://smarden.org/pape/djb/訪問到.

daemontools 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/daemontools.html 維護了一個web頁面.

B.5. qmailanalogqmailanalog處理qmail的日志文件並且生成一系列的報告. 報告指示出系統正在工作的類型和工作量. 如果你需要有多少郵件被發送和接收的統計, 以及他們有多大, 他們被處理的有多快, qmailanalog都能顯示出來.

作爲一個意外收獲, matchup 程序合並qmail 的每個郵件投遞的多個日志行爲一行 -- 有點類似于Sendmail的日志.

qmailanalog的源代碼可以在這裏http://cr.yp.to/software/qmailanalog-0.70.tar.gz取得.

qmailanalog 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/qmailanalog.html維護了一個web頁面.

注意: qmailanalog 依賴于由accustamp 使用的小數秒格式的日志條目時間戳. 爲了使用它和multilog生成的TAI64N格式的日志, 你必須將他們轉換成舊格式. 一個完成這個轉換工作的程序可以在這裏http://www.qmail.org/tai64nfrac取得.

B.6. rblsmtpd如果你從未被垃圾郵件騷擾, 可以說你太幸運了. 絕大多數的電子郵件用戶都太熟悉Unsolicited Bulk E-mail (UBE)了, UBE也被稱爲"spam". 絕大多數垃圾郵件都是色情站點的廣告, 郵件鎖鏈或其他詭計. 回到過去的的舊時光, 直到1998年左右, 絕大多數因特網上的MTA都是開放轉信的, 也就是說, 他們將會接收任何人給人和人的郵件, 甚至沒有發信人也沒有本地收信人的郵件. 垃圾郵件發送者利用這些開放轉信服務, 盡可能找到他們能找的服務器傳送他們的垃圾郵件. 這樣就隱藏了他們的蹤迹, 栽贓給那些"無罪的"開放轉信站點, (通過浪費開放轉信站點的資源) 爲垃圾郵件制造者節省了大量的CPU和帶寬.

從那個時期開始, 這樣的開放轉信的站點被認爲是非常糟糕的, 幾個反垃圾郵件義務組織創造了一個機制來識別開放轉信和其他垃圾郵件的通常來源, 這樣他們就能夠避免來自垃圾郵件商的SMTP連接.

rblsmtpd 是一個 RBL SMTP後台服務程序. 它位于tcpserver和qmail-smtpd之間, 並且拒絕系統認定的那些列表裏面系統的連接.

舉一個例子, 在tcpserver下運行rblsmtpd, 試試下面這樣的寫法:

#!/bin/shQMAILDUID=`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 -R -H -l 0 -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /usr/local/bin/rblsmtpd\ -r relays.ordb.org /var/qmail/bin/qmail-smtpd 2%26amp;1

rblsmtpd 以前是作爲一個分立的軟件包, 現在被捆綁在ucspi-tcp 裏面.

rblsmtpd 由Dan Bernstein 編寫, 他在這裏http://cr.yp.to/ucspi-tcp/rblsmtpd.html 維護了一個web頁面.

RBL 硬編碼不再free 之後, Charles Cazabon 制作了一個補丁用來移去默認的RBL 硬編碼, 替換爲爲rblsmtpd 程序, 這個程序可以在這裏訪問到 http://pyropus.ca/software/misc/rblsmtpd-nodefaultrbl.patch.

B.7. serialmailqmail 是爲高速連接, 不間斷運行設計的. serialmail 這個工具集讓qmail更好的適用于斷斷續續的, 低速的連接. 在這樣的系統上使用serialmail, qmail被配置爲傳送所有遠程郵件到一個單獨的maildir文件夾. 一旦網絡連通, serialmail的maildirsmtp 命令將用來上傳這個maildir到ISP的郵件中心. 如果ISP支持QMTP(參看 高級話題 下的 QMTP), maildirqmtp也能用得上.

serialmail 可以被用于ISP方面, 用來實現 AutoTURN, 這是一個 由客戶端發起的SMTP 連接, 導致服務器開始反向連接到客戶端 , 然後發送服務器端的郵件隊列給客戶端的過程. 這個和ETRN SMTP機制很相似.

serialmail的源代碼可以在這裏http://cr.yp.to/software/serialmail-0.75.tar.gz 得到.

serialmail 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/serialmail.html維護了一個web頁面.

B.8. mess822mess822 是一個處理 RFC822兼容郵件的庫和一系列應用程序. 這些程序包括:

ofmipd: 一個後台服務程序,從客戶端接收郵件並基于數據庫記錄改寫From郵件頭部分. new-inject: 一個qmail-inject的替代程序, 支持用戶控制的主機名改寫. iftocc: 一個.qmail應用程序, 用來檢查是否郵件被發送到指定地址. 822header, 822field, 822date, 和 822received: 從郵件中摘錄信息. 822print: 用來打印郵件. mess822的源代碼可以在這裏 http://cr.yp.to/software/mess822-0.58.tar.gz取得.

mess822 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/mess822.html維護了一個web頁面.

B.9. ezmlmezmlm 是一個爲qmail設計的高效, 易用的郵件列表管理器(MLM). 如果你熟悉 LISTSERV 或者 Majordomo, 你會知道郵件列表管理器能作什麽. 更多在qmail下的關于郵件列表的信息可以在高級話題 下面的 郵件列表管理器 找到.

ezmlm的源代碼可以在http://cr.yp.to/software/ezmlm-0.53.tar.gz這裏取得.

ezmlm 由 Dan Bernstein編寫, 他在這裏http://cr.yp.to/ezmlm.html維護著一個web頁面.

Fred Lindberg 和 Fred B. Ringel 爲ezmlm開發了一個擴展, 叫做ezmlm-idx, 後者增加了大量的有用特色, 我特別推薦使用它. 可以在 http://www.ezmlm.org/ 這裏訪問 ezmlm-idx, 這個頁面現在有Bruce Guenter 維護.

B.10. safecatsafecat 將文件可靠的寫入maildir 郵箱中. 在使用procmail 處方時候有個特別的用處, 用來將郵件填入 procmail. 舉一個例子, 下面的處方將所有Maildir中的郵件存檔.

:0w|safecat Maildir/tmp Maildir/new

safecat 由 Len Budney 編寫, 他在這裏http://jeenyus.net/~budney/linux/software/safecat.html.爲safecat 維護了一個web頁面.

B.11. djbdnsdjbdns 是qmail作者編寫的DNS服務器. 它包括 tinydns, 一個DNS內容服務器, 和 dnscache, 這是一個 DNS 緩沖服務器.

djbdns的正式頁面在 http://cr.yp.to/djbdns.html.

B.12. maildropmaildrop是一個和procmail類似的郵件過濾器.

maildrop 由 Sam Varshavchik 編寫, 他在這裏http://www.courier-mta.org/maildrop/.爲maildrop維護了一個web頁面.

B.13. syncdirsyncdir 是一個小型庫, 可使 link() 系統調用同步. 在一個不能同步執行 link() 的文件系統上運行qmail隊列時, syncdir是必要的. 例如 Linus的 ext2fs, Reiserfs, SGI的 XFS以及BSD的使用softupdates的FFS系統.

syncdir 由 Bruce Guenter編寫, 可以在這個web頁面http://untroubled.org/syncdir/訪問. 安裝指導在這個位置http://www.ornl.gov/lists/mailing-lists/qmail/2001/12/msg00949.html.

附錄 C. 因特網郵件工作原理 C.1. 郵件如何從A點到達B點 當一個主機上的用戶想要發送一個郵件給另一個主機上的用戶時, 許多事情發生了, 這個場景後面的東西很多是不必要知道的那麽確切的.

假設一個用戶 Alice, alice@alpha.example.com 想要發送一個郵件給 Bob, bob@beta.example.com, 下面是發送接收過程:

1. Alice 用她的郵件用戶代理(MUA)編寫郵件, 比如使用 mutt 或者 pine. 她在 To 這一欄指定接收者, Subject 這一欄填寫郵件主題, 加上郵件本身的文本部分. 整個郵件看起來是下面這樣的:

To: bob@beta Subject: lunch How about pizza?

2. 當她覺得這封郵件已經滿意之後, 她指示 MUA 發送郵件.

3. 這時候, MUA 會加上附加的郵件頭部分, 比如日期 Date 和郵件ID(Message-Id) 並且修改Alice輸入的值(例如, 將 bob@beta 替換爲"Bob ") 下一步, MUA 將郵件注入郵件系統. 有兩種方式進行注入: MUA 運行一個由郵件系統提供的爲注入郵件爲目的的程序; 或者使用SMTP協議和本地或者遠程郵件服務器建立連接, 在本例內, 我們假定 MUA 使用本地注入程序將郵件傳送給 MTA, 對于不同的MTA, 注入細節都是不同的, 不過對于UNIX系統, 使用sendmail 程序注入已經成了事實上的標准. 使用這種方式, MUA 可以將郵件頭和郵件主體放置在一個文件內, 由空行分隔, 然後傳遞這個文件到 sendmail 程序.

4. 如果注入成功--郵件句法正確, 並且 sendmail 調用適當--那麽現在郵件由 MTA 負責. 不同的 MTA 細節是完全不同的, 通常MTA首先檢查郵件頭決定郵件將發往何處. 然後建立一個到主機beta的SMTP連接, 轉發郵件給 beta 系統上的MTA. SMTP對話要求郵件被分成兩部分發送: 第一部分是信封, 這個部分確定了接收者的地址(bob@beta.example.com)和返回地址(alice@alpha.example.com), 以及第二部分郵件本身, 包括郵件頭和郵件主體.

5. 如果beta主機的MTA拒絕這個郵件, 可能原因是在beta系統上沒有這個bob用戶, 在alpha 上的MTA發送一個反彈郵件給返回地址, 也就是 alice@alpha, 通知她郵件發送出現了問題.

6. 如果 beta主機上的 MTA接收了郵件, 它查看接收者地址, 決定是發送給本地local 還是遠程 remote系統的郵件. 這個例子裏面, 接收者是本地用戶, 然後MTA或者傳送郵件給 mail delivery agent (MDA), 比如 /bin/mail或者傳送給 procmail.

7. 如果傳輸失敗了, 可能是Bob的郵箱超過了使用限額, beta 主機上的 MTA 將發送一個反彈信息給信封上的返回地址, 即 alice@alpha.

8. 如果傳輸成功, 郵件將在Bob的郵箱中等待, 直到他使用MUA來閱讀和顯示郵件.

C.2. 其他資料 C.2. More information關于因特網郵件工作方式的更多信息, 請查看下面的信息:

Internet mail, 由qmail作者撰寫 http://cr.yp.to/im.html . SMTP, 由qmail作者撰寫 http://cr.yp.to/smtp.html Internet mail message header format, 由qmail作者撰寫 http://cr.yp.to/immhf.html C.2.1. 因特網的RFC文檔 Internet Requests for Comment, 縮寫爲Internet RFC是關于因特網標准的正式文檔. 大部分Internet RFC 文檔已經度過了評論階段, 進入穩定狀態, 他們定義了包括諸如 TCP, FTP, Telnet和各種各樣得郵件標准和協議.

RFC 821, Simple Mail Transfer Protocol (obsoleted by RFC 2821) http://www.ietf.org/rfc/rfc0821.txt RFC 822, Standard for the Format of ARPA Internet Text Messages (obsoleted by RFC 2822) http://www.ietf.org/rfc/rfc0822.txt RFC 931, Authentication Server. http://www.ietf.org/rfc/rfc0931.txt RFC 974, Mail Routing and the Domain System. http://www.ietf.org/rfc/rfc0974.txt RFC 1123, Requirements for Internet Hosts -- Application and Support. http://www.ietf.org/rfc/rfc1123.txt RFC 1413, Identification Protocol. http://www.ietf.org/rfc/rfc1413.txt RFC 1423, Privacy Enhancement for Internet Electronic Mail: Part III: Algorithms, Modes, and Identifiers. http://www.ietf.org/rfc/rfc1423.txt RFC 1651, SMTP Service Extensions. http://www.ietf.org/rfc/rfc1651.txt RFC 1652, SMTP Service Extension for 8bit-MIMEtransport. http://www.ietf.org/rfc/rfc1652.txt RFC 1806, Content disposition. header. http://www.ietf.org/rfc/rfc1806.txt RFC 1854, SMTP Service Extension for Command Pipelining. http://www.ietf.org/rfc/rfc1854.txt RFC 1891, SMTP Service Extension for Delivery Status Notifications. http://www.ietf.org/rfc/rfc1891.txt RFC 1892, The Multipart/Report Content Type for the Reporting of Mail System Administrative Messages. http://www.ietf.org/rfc/rfc1892.txt RFC 1893, Enhanced mail system status codes. http://www.ietf.org/rfc/rfc1893.txt RFC 1894, An Extensible Message Format for Delivery Status Notifications. http://www.ietf.org/rfc/rfc1894.txt RFC 1939, Post Office Protocol - Version 3. http://www.ietf.org/rfc/rfc1939.txt RFC 1985, SMTP Service Extension for Remote Message Queue Starting (ETRN). http://www.ietf.org/rfc/rfc1985.txt RFC 1991, PGP Message Exchange Formats. http://www.ietf.org/rfc/rfc1991.txt RFC 2015, MIME Security with Pretty Good Privacy. (PGP). http://www.ietf.org/rfc/rfc2015.txt RFC 2045, MIME Internet message bodies. http://www.ietf.org/rfc/rfc2045.txt RFC 2046, MIME Media Types. http://www.ietf.org/rfc/rfc2046.txt RFC 2047, MIME Headers. http://www.ietf.org/rfc/rfc2047.txt RFC 2048, MIME Registration Procedures. http://www.ietf.org/rfc/rfc2048.txt RFC 2049, MIME Conformance Criteria. http://www.ietf.org/rfc/rfc2049.txt RFC 2142, Mailbox names for common services. http://www.ietf.org/rfc/rfc2142.txt RFC 2183, Content Disposition header. http://www.ietf.org/rfc/rfc2183.txt RFC 2821, Simple Mail Transfer Protocol. http://www.ietf.org/rfc/rfc2821.txt RFC 2822, Internet Message Format http://www.ietf.org/rfc/rfc2822.txt 一個綜合性的郵件相關RFC列表可以在Internet Mail Consortium的web網站上找到 http://www.imc.org/mail-standards.html.

附錄 D. 體系結構 D.1. 模塊化系統結構 因特網MTA可以完成多種任務. 早期如 Sendmail和 smail的設計是整體式的, 換句話說就是他們是一個大而複雜的程序, 其中一部分是SMTP服務器, 另一部分是SMTP客戶端, 另外的是本地郵件注入, 還有管理郵件隊列的部分,等等.

qmail是模塊化的, 每個功能都是由單獨的程序執行的, 結果程序更小, 更簡單, 而且更不容易出現功能和安全方面的問題. 爲了進一步增強qmail的安全性, qmail模塊以不同的權限模式運行, 模塊之間互不"信任", 他們並不以爲其他模塊總是按照他們假定的方式去運行.

這些是qmail的核心模塊:

模塊

功能

qmail-smtpd

接收/拒收通過SMTP傳遞的郵件

qmail-inject

本地郵件注入

qmail-rspawn/qmail-remote

控制遠程傳輸

qmail-lspawn/qmail-local

控制本地傳輸

qmail-send

處理隊列

qmail-clean

清除隊列

模塊化也有一些不利因素, 整體式的MTA, 模塊之間的相互作用定義良好, 而且模塊之間只是交換最小的必要信息. 這是個大好事, 但模塊化方式使處理某些事情變的困難起來. 舉個例子, 爲了debug目的, 運行sendmail 並使用"-v"選項, 使 Sendmail 打印它的活動跟蹤消息到標准輸出, 由于所有的包括郵件注入, 隊列控制, 別名處理, .forward文件處理, 以及遠程SMTP轉發郵件等等都是由一個 sendmail 二進制程序控制, 那麽可以很容易的跟蹤整個郵件傳送過程直到郵件被送抵目的地. 這樣的等價物在qmail裏面是不存在的, 如果在qmail上執行這樣的"debug"過程, 需要實質性的改變源碼以及在模塊到模塊之間的過程調試, 這增加了的很大複雜性.

D.2. 文件結構 /var/qmail 是qmail的文件結構的根. 在qmail 編譯安裝的時候可以選擇改變這個目錄的位置, 不過最好還是不作改動的安裝到默認位置, 這樣其他的管理員就知道到哪裏能找到需要的東西. 如果你真的想重新定位部分或者全部的qmail 目錄樹, 最好的辦法是使用符號連接方式. 詳細信息請參看創建目錄 小節中的細目.

qmail 根目錄下面的一級子目錄:

目錄

內容

alias

系統級別名定義的.qmail文件

bin

二進制程序和可執行腳本

boot

啓動腳本

control

配置文件

doc

文檔(不包括man 手冊頁)

man

man 手冊頁

queue

未送出的郵件

users

qmail-users 的數據庫文件

D.3. 隊列結構 在qmail的安裝目錄下的 INTERNALS文件更充分的討論了有關的細節信息. 下面是一些更寬泛的隊列結構的概述.

子目錄

內容

bounce

永久傳送錯誤

info*

信封發送者地址

intd

由qmail-queue構建的信封

local*

本地信封接收者地址

lock

文件鎖文件

mess*

郵件文件

pid

由qmail-queue使用用來獲得 i 節點編號

remote*

遠程信封接收者地址

todo

完整的信封

注意: 由"*"標志的目錄包含了一系列分開的由"0", "1",..., (最大數字直到conf-split 減去 1)這些數字命名的子目錄. 這裏conf-split 是由源代碼目錄下的conf-split 文件設定的一個參數, 在編譯源碼時確定, 默認是23. 分離出多個子目錄是爲了在繁忙的服務器上降低單個目錄裏面的文件數量. conf-split 必須是個質數.

在mess組目錄下的文件由它們的 i 節點編號命名. 這就意味著你不能使用標准的UNIX工具, 比如mv, dump/restore還有 tar來手動地移動這些文件. 這裏有兩個用戶提供的實用工具, 可以使用它們來正確地重命名隊列文件. 可以在這裏http://www.qmail.org/ 找到這些工具.

注意: 當qmail正在運行地時候, 修改隊列文件是不安全的. 如果你想更改隊列, 首先停止 qmail, 然後仔細的處理隊列, 然後重啓qmail.

D.4. 圖片 在 /var/qmail/doc 下面有一系列的以 PIC 名字開頭的文件. 這些是qmail處理不同情況的文本"圖片". 它們顯示了qmail 在各個模塊之間處理的控制流, 在處理問題和建立複雜系統配置的時候這些圖片將大有裨益.

文件名

處理場景

PIC.local2alias

傳遞給本地別名的本地注入郵件

PIC.local2ext

傳遞給擴展地址的本地注入郵件

PIC.local2local

傳遞給本地用戶的本地注入郵件

PIC.local2rem

傳遞給遠程地址的本地注入郵件

PIC.local2virt

傳遞給本地虛擬域上的一個地址的本地注入郵件

PIC.nullclient

注入到空用戶的郵件

PIC.relaybad

使用本地主機轉信失敗的嘗試

PIC.relaygood

使用本地主機轉信成功的嘗試

PIC.rem2local

通過SMTP爲本地用戶接收郵件

這些圖片也可以在線觀看, 地址如下:

http://www.qmail.org/man/index.html如果你想看qmail的"真實"圖片, 那麽請查看Andre Opperman 的 "big qmail picture", 地址在http://www.nrg4u.com/ .

附錄 E. 一些不常見的問題 Infrequently Asked Questions一些沒有資格稱爲常見問題的問題, 可是還是很重要也不容易回答的.

E.1. qmail如何處理延期發送的郵件? 每個郵件都有自己的重試時間表, 越長時間不能發送的郵件, 得到qmail重發的機會就越少. 重試時間表是不可更改的. 下面的表格顯示了一個發往遠程接收者的郵件, 如果這封郵件每次都無法發送, 直到這封郵件被反彈, 整個重試時間表如下. 本地傳送郵件使用一個相似的不過頻率更高的時間表.

重試次數

天-小時-分鍾-秒

1

0

0-00:00:00

2

400

0-00:06:40

3

1600

0-00:26:40

4

3600

0-01:00:00

5

6400

0-01:46:40

6

10000

0-02:46:40

7

14400

0-04:00:00

8

19600

0-05:26:40

9

25600

0-07:06:40

10

32400

0-09:00:00

11

40000

0-11:06:40

12

48400

0-13:26:40

13

57600

0-16:00:00

14

67600

0-18:46:40

15

78400

0-21:46:40

16

90000

1-01:00:00

17

102400

1-04:26:40

18

115600

1-08:06:40

19

129600

1-12:00:00

20

144400

1-16:06:40

21

160000

1-20:26:40

22

176400

2-01:00:00

23

193600

2-05:46:40

24

211600

2-10:46:40

25

230400

2-16:00:00

26

250000

2-21:26:40

27

270400

3-03:06:40

28

291600

3-09:00:00

29

313600

3-15:06:40

30

336400

3-21:26:40

31

360000

4-04:00:00

32

384400

4-10:46:40

33

409600

4-17:46:40

34

435600

5-01:00:00

35

462400

5-08:26:40

36

490000

5-16:06:40

37

518400

6-00:00:00

38

547600

6-08:06:40

39

577600

6-16:26:40

40

608400

7-01:00:00

E.2. 爲什麽我無法給一個有很多MX記錄的大站點發送郵件? 如果你得到下面的錯誤提示:

deferral: CNAME_lookup_failed_temporarily._(#4.4.3)/

出問題的原因是qmail不能處理名字服務器返回的大尺寸查詢返回. 安裝 djbdns 來解決這個問題. 參考高級話題下面的 補丁 小節.

不過也有一些人使用這樣的系統但是卻沒有遇到這樣的問題. 本質上說, 這取決于對你本地名字服務器查詢的定時和排序, 名字服務器對于"aol.com"的ANY查詢返回的可能是大于512 字節 的 UDP 數據包, 或者可能不是.

"可能不是" 這種情況可能是碰巧查詢的A記錄和MX記錄超時, 而NS記錄沒有超時. 由于 .COM的服務器設置的TTL記錄生命期爲2天, 而AOL的TTL只有1個小時, 這種超時現象會經常在較少的某些比較忙的名字服務器上發生. 比較忙碌的名字服務器更大的可能在所有開放時間把這些記錄放在他們的高速緩存中. 查詢超時而又沒有打補丁的qmail將會試著去查詢CNAME記錄.

一個更好的測試方式是發送郵件到nosuchuser@large-mx.ckdhr.com這裏; 如果郵件被清除出了你的郵件隊列, 並且從ckdhr.com反彈信息給你, 就表明你的MTA可以發送郵件給擁有超過512字節MX列表記錄的主機. (如果使用單一查詢項目, 在一個TTL生命期中, 盡管查詢結果超過了512字節, 可是由于單一查詢不依賴于定時和排序, 這個問題將不會被表現出來)

E.3. QUEUE_EXTRA 是什麽? QUEUE_EXTRA是一個編譯時的配置參數, 用它來確定每個郵件傳送的一個附加的接收者. 這個參數首先用于日志記錄. 例如, FAQ裏面描述的如何使用QUEUE_EXTRA來保存所有的進出郵件.

要使用QUEUE_EXTRA, 編輯 extra.h 使用"Trecipient\0"這個格式確定附加的接收者, QUEUE_EXTRA的長度由QUEUE_EXTRALEN確定("\0"算成一個字符). 舉一個例子:

#define QUEUE_EXTRA "Tlog\0" #define QUEUE_EXTRALEN 5

關掉正在運行的qmail. 如果你按照本文安裝順序, 運行下面的命令:

qmailctl stop

如果你沒有qmailctl腳本, 你可以使用你的啓動/關閉 腳本, 或者給qmail-send發送一個TERM信號.

然後重編譯qmail, 使用命令:

make setup check

設置 ~alias/.qmail-log 來定義你想要記錄的內容. 比如, 需要記錄郵件 ID(Message-ID), 那麽就這樣編寫這個文件內容:

| awk '/^$/ { exit } /^[mM][eE][sS][sS][aA][gG][eE]-/ { print }'

最後, 重新啓動qmail.

附錄 F. 錯誤訊息 qmail的錯誤訊息以及他們的含義.

參見 RFC 1893 標准文檔內括號內每個錯誤信息的說明部分.

這個附錄是不完整的.

附錄 G. 新手常見問題(Gotchas) 這個"gotchas" 是qmail 新手經常遇到的問題.

G.1. qmail 不能給超級用戶發郵件. 爲了防止qmail-local以特權用戶運行命令的可能性, qmail忽略所有UID是0的用戶. 這個文檔請看 qmail-getpw 的 man 手冊頁.

不過這並不意味著qmail不能給root用戶傳送郵件, 只是郵件傳送必須由一個非特權用戶來執行. 典型情況, 爲root用戶創建一個系統別名文件 ~alias/.qmail-root.

G.2. qmail不能給沒有主目錄的用戶發郵件. 這是另外一個安全特色, 也是一個新手的很好的練習機會. 看看 qmail-getpw的man 手冊頁面找答案吧.

G.3. qmail 不能給名字裏面含有大寫字符的用戶投遞郵件. qmail 將整個"本地部分" -- 郵件地址中"@" 符號左面的所有部分轉換爲小寫. man 手冊頁面裏面沒有提到和表示, 不過代碼裏面有相關表示. 實際上在qmail-getpw 的 man 手冊頁面裏面有關于qmail忽略使用大寫字符名字用戶的文檔.

G.4. qmail處理擴展地址的時候, 用冒號(:)替換掉了點(.). 這是qmail另一個安全特色. 是爲了防止擴展地址裏面".."和文件樹沖突, 點(.)置換爲冒號(:)之後, qmail就可以確定使用的每個用戶的所有 .qmail 文件都位于他們的主目錄下面. 這個問題存檔于 dot-qmail 的 man 手冊頁裏面.

G.5. qmail 處理擴展地址的時候把大寫字符轉換成了小寫字符. qmail轉換本地地址的整個部分爲小寫字符. 文檔參見 dot-qmail 的 man 手冊頁.

G.6. qmail 不使用 /etc/hosts 文件 qmail 從不使用 /etc/hosts 來確定一個主機名關聯的IP地址. 如果你在控制文件內使用主機名而不是IP地址, qmail必須能夠訪問名字服務器.

即使在沒有名字服務器的情況下, 也可以運行qmail, 在control 文件內的主機由 IP 地址確定, IP地址兩邊必須加上方括號([ ]). 例如:

[10.1.2.219]

實際上, 方括號不總是必要的--不過用上它們無論如何是恰當的.

G.7. qmail 不在日志記錄 SMTP 的活動. 由于很多原因, qmail 對于 SMTP 的連接, 拒信, 非法命令或者有效命令都不記錄, tcpserver可以用來記錄連接, recordio 可以用來記錄整個 SMTP 對話. recordio 是 ucspi-tcp 的一部分. 這個過程存檔在FAQ裏面. 可以在這個地址 http://cr.yp.to/qmail/faq/servers.html#recordio 訪問到它.

G.8. qmail 不生成郵件延遲通知. 如果在幾個小時內 Sendmail 無法傳遞郵件, 代表性的是4個小時, 它就會發送一個郵件延遲通知給郵件原始發送者. 這個通知有點像反彈郵件, 不過還不表示郵件傳送永久失敗了.

qmail 並不發送這樣的警告. 未發送郵件在隊列內等待發送直到超過 queuelifetime 規定的時間後還未能發送, 才會被反彈給郵件原始發送者.

G.9. qmail 由于/var/qmail/queue/lock/trigger 文件丟失、權限設置錯誤或者錯誤的文件屬性設置等原因變的很慢 qmail-queue 和 qmail-send 使用一個稱作 /var/qmail/queue/lock/trigger 的命名管道進行通訊. 如果這個管道陷入混亂, qmail-send 將在大約半個小時內無法注意到新郵件.

最好的方式是正確設置qmail, 在源代碼目錄下使用"make check"命令檢查. 如果不能這樣作, 那麽像下面這樣確定一下:

# ls -l /var/qmail/queue/lock/triggerprw--w--w- 1 qmails qmail 0 Jul 5 21:25 /var/qmail/queue/lock/trigger

特別注意那一行開頭的"p"(表明這是一個命名管道), 狀態(特別是任意用戶可寫標志位), 以及用戶和用戶組的歸屬.

G.10. DNS 或者 IDENT 查詢使 SMTP 變慢 如果 qmail-smtpd 對連接的反應變慢, 原因可能使由于DNS反相查詢或者 IDENT 查詢. 如果你 使用 tcpserver 運行 qmail-smtpd, 刪除 "-h", "-p", 和 "-r" 選項, 並增加 "-H", "-P", "-R", 和 "-l hostname" 選項.

參看 http://cr.yp.to/ucspi-tcp/tcpserver.html 這裏的 tcpserver 的文檔查看這些選項的說明.

G.11. 回車(Carriage Return)和換行(CRLF)不同 qmail-inject 和其他本地注入機制比如 sendmail 不能正確接受DOS風格的回車/換行符. 不像 Sendmail, qmail 要求本地注入郵件使用 Unix 換行(只有 LF). 這和PHP 腳本遇到的問題一樣.

G.12. 日志回滾造成qmail-send 和 tcpserver 停止 如果你使用第二節描述的受到監控的日志服務, 日志服務將會因爲以下任何原因停止: 磁盤滿, run 腳本打字錯誤, 日志目錄配置錯誤, 等等. 而管道將被填滿, 導致服務被阻塞, 或者被挂起. 解決這個問題(參看 故障處理)之後, 所有部分都會恢複正常.

G.13. qmail-smtpd 不能使地址的本地部分生效 假如 example.com 被列入control/rcpthosts 文件, 發給 anything@example.com 的郵件在SMTP會話期間將會被接受. 如果 anything 不是一個合法用戶或者別名, qmail 將發送一個反彈郵件給信封上的發送者地址.

一些單純的轉信測試假設如果郵件被接受, 那麽一定會被傳送, 這是錯的. 如果某人宣稱你的系統使開放轉信的, 你要查看通過轉信的郵件的副本--包括完整的郵件頭, 特別是 Received 部分--比較一下這些部分和你的日志記錄.

要在qmail 中增加接收者認證, 請參考這小節: 在SMTP對話過程中拒絕無效接收者.

G.14. 設置防火牆導致遠程無法連接 SMTP/POP3/IMAP 服務器 如果安裝了 SMTP, POP3 和 IMAP 服務器, 你可以在本機或者本地網絡的主機連接到這些服務器, 但是無法從遠程服務器連接, 很有可能是防火牆的問題.

第一個查看的地方是服務器本身. 舉例, Red Hat Linux, 使用 iptables 在默認配置下是阻塞 SMTP 服務的. 其他包過濾機制比如 ipchains 也會和這個問題有關系.

也有可能是你的因特網服務提供商 (ISP) 阻塞了某些端口來防止垃圾郵件騷擾或者強制執行他們的服務條款(Terms of Service, TOS). 確認不是包過濾的原因以及你沒有違反ISP的服務條款(TOS)之後, 可以聯系你的ISP的技術支持解決問題.

G.15. 如果USER 和 LOGNAME 沒有設置的話, qmail-inject 將設置郵件發送方字段(From)爲匿名(anonymous) 如果通過 qmail-inject 發送郵件, 並且郵件不包括 From 字段, qmail-inject 將查找環境變量來得知是那個用戶發送的郵件. 查找變量的順序爲: QMAILUSER, MAILUSER, USER, 然後 LOGNAME.

普通用戶登錄期間通常要設置USER和LOGNAME變量, 不過某些批處理任務, 比如以 cron 執行的任務, 將不會設置這兩個環境變量.

爲了使你的 cron 任務發送的郵件有一個合法的 From 字段, 請在發信之前設置一個環境變量就可以了.

G.16. 停止qmail-send進程的時候, 它不總是立即退出. 在還有郵件傳送的情況下, 向qmail-send發送 KILL 信號是不能使qmail-send立刻退出的. qmail-send退出前將等待所有的qmail-local和qmail-remote進程完成任務, 這樣qmail-send才能記錄下傳送結果. 由于這個原因, "qmailctl restart" 或者 "qmailctl stop" 這樣的命令可能在qmail-send依然在運行的情況下, 報告qmail-send進程已經被停止了. 所以, 請使用"qmailctl stat"來檢查"stop"和"restart"命令的實際執行結果.

還要注意, qmail-send 退出前將遍曆郵件隊列, 所以當存在非常大的郵件隊列情況下停止qmail-send 會有一個非常明顯的時間延遲.

G.17. 不能通過把郵件傳送到/dev/null 將郵件丟棄.假設這樣寫一個傳送指令:

/dev/null

因爲qmail 認爲/dev/null 是一個mbox 格式的郵箱, 而/dev/null 是個特殊文件, 所以這樣作將導致qmail 無法傳送郵件.

最好的丟棄郵件的方式是建立一個.qmail 文件, 這個文件內可以包含無效的指令, 但一定要非空(.qmail 的空文件將被作爲按照defaultdelivery 內缺省指令或者qmail-start 命令行指令進行傳送) , 在這個文件裏面只放上注釋語句就可以作到了.

舉例如下, 一個僅包含注釋的.qmail 文件:

#

或者:

# throw messages away undelivered

(注釋語句可以隨便些上點什麽. 譯者注)

這樣的.qmail 文件可以丟棄郵件, 而不予傳送.

G.18. qmail-send 正在運行過程中修改郵件隊列是危險的在qmail-send 運行過程中, 如果你不是非常確切的知道你正在作什麽, 修改/var/qmail/queue 下面的文件或目錄是非常危險的, 可能會導致郵件隊列崩潰, 舉例來說, 郵件將處于未定義的狀態, 日志文件中出現奇異錯誤信息, 重複傳送郵件, 出現假的反彈郵件等等錯誤都可能發生. 一旦發生這些情況, 你必須找到並運行一個隊列檢查程序(有兩個可以在 qmail.org 找到)或者創建一個新的空郵件隊列.

如果你要修改郵件隊列, 首先停止qmail, 仔細處理隊列, 然後重啓qmail. 注意, qmail-send 停止也會造成這樣的隊列崩潰, 所以你應該知道如果你遇到這樣的情況應該怎麽作.

附錄 H. 關于本文 Life with qmail 的常見話題 H.1. 這個 Life with qmail 的版本是多少? 這是LWQ 2006年01月02日的英文版本(翻譯).

H.2. 誰擁有 Life with qmail? 版權所有1999-2006, David E. Sill

個人主頁:http://Web.InfoAve.Net/~dsill/dave/

H.3. Life with qmail 的版權信息? How is Life with qmail licensed?Life with qmail 使用OpenContent 1.0 版本許可證, 參見 http://www.opencontent.org/opl.shtml查看完整的版權許可證. 基本上, 你可以拷貝, 再發布, 或者對于修改版本可以對Life with qmail 進行修改, 如果重發布, 也需要在 OpenContent 的版權許可證規定範圍內.

H.4. 我怎麽取得新版 LWQ 的發布通知? 發送郵件到 lwq-announce-subscribe@sws1.ctd.ornl.gov 加入 lwq-announce 郵件列表.

H.5. 在哪裏可以爲 LWQ 投稿, 捐助以及討論它? 發送郵件到 lwq-subscribe@sws1.ctd.ornl.gov 加入lwq郵件列表.

H.6. Life with qmail 被翻譯成其他語言了嗎? 大概LWQ已經被翻譯成了幾種語言. 參見 http://lifewithqmail.org/trans.html 查看更多關于LWQ的翻譯消息.

H.7. Life with qmail 有沒有 PostScript, PDF, plain text, 或者其他任何除了HTML的格式? 有的, 其他格式的可以在這裏 http://lifewithqmail.org/ 取得.

H.8. 我按照 Life with qmail 說的作了, 可是我的系統崩潰了, 或者弄壞了我的硬盤, 或者毀了我的愛情, 或者弄死了我的狗, 等等問題, 我該怎麽辦? (這屬于老外的幽默啦. ^_^, 譯者注) 我很抱歉, 真的很抱歉. 可是使用 Life with qmail 是沒有任何擔保的. 請參考上面提到的 OpenContent 版權許可證. 我不是爲了賺錢才寫Life with qmail 的, 我只是想爲 qmail 社區作出一些有益的貢獻.

其實, Life with qmail 並不是一個FAQ, 反而我希望這是個 NAQ (Never Asked Question).

H.9. 我怎麽爲 LWQ捐贈和投稿? 請把對 LWQ 的修正意見, 建議以及抱怨等等發送到 lwq@sill.org.

如果你想要作更大的投稿, 比如, 比如文章的新的小部分或者附錄, 那太棒了! 首先請和我協商以便確認哪些我想要在LWQ裏面添加的內容還有就是核實是否已經有人在作同樣的工作了.

另外一個支持LWQ 的方式是去我的書店買東西, 這是Amazon.com 的聯盟書店, 使用這個地址訪問: http://www.amazon.com/exec/obidos/redirect-home/davesill.

感謝你的衷心支持! Thanks for your support!

H.10. 這個版本的LWQ有那些變化呢?修正了許多的小錯誤, 無效鏈接等等. 增加了 /dev/null/ 部分. 感謝Payal Rathod. 擴展了nosuid 注意事項部分. 感謝Tony Hansmann. 增加了到Cazabon 的nodefaultrbl 的補丁的鏈接. 感謝Jeremy Kister. 在qmail-pop3d 指令中添加了mkdirs. 感謝Larry Weldon. 增加了checkpasswd 的關于errno 補丁的注意事項. 感謝tlad. 增加了smarthost relay 子章節. 感謝Silver Dirk. 改善了Qmail-Scanner 的措辭. 感謝Jason Haar. 增加了Yenigul 的書的章節. 感謝Ismail Yenigul. 增加了abuse@ 別名. 感謝Charles Cazabon. 增加了ucspi-tls 章節. 感謝Scott Gifford. 增加了修改郵件隊列可能發生問題的提示. H.10.1. 2004-06-30版本的LWQ有什麽更改?加入了新的qmail 的logo, 感謝Michael Kadrie. 修正了一些打字輸入錯誤. 更新了Macintosh OS X 的注意事項. 更新了ClamAV 鏈接. 在高級話題內增加了接收者驗證章節. 修改了"setuid/exe required for queue filesystem" 的措辭. H.10.2. 2004-03-28版本的LWQ有什麽更改?更新了關于Levine 的書的信息. 修改了"What changed in the 2004-03-01 version of LWQ?"章節的輸入錯誤. 在G16內增加了關于qmail-send 在退出前掃描郵件隊列的注釋. H.10.3. 2004-03-01版本的LWQ有什麽更改?G.16 內"kill"的表達被替換爲更好的詞"term". 增加了softlimit-too-low 示例錯誤信息. 修正了E.2, CNAME查詢錯誤. H.10.4. 2004-01-26版本的LWQ有什麽更改?更新了netqmail 1.05部分. 更新了一些小輸入錯誤. H.10.5. 2003-11-10版本的LWQ有什麽更改?更新了一些小輸入錯誤. H.10.6. 2003-10-30版本的LWQ有什麽更改?爲netqmail 調整了安裝部分. 更新了Binc IMAP 入口. H.10.7. 2003-08-16版本的LWQ有什麽更改?增加了這個變更記錄節. 感謝 Jerry Asher 提出的這個要求. 增加了關于 noexec 和 nosuid 系統需求節. 在測試節增加了 inst_check 腳本和例子的鏈接. 增加了Mate Wierdl 的errno 補丁的鏈接. 在系統要求節增加了OS X 的注意事項. IMAP 服務器節增加了Cyrus 條目. 感謝 Rick Updegrove. 在IMAP 服務器節增加了Dovecot 條目. 重新表述了地址擴展節. 感謝 Adrian Ho. 重新定制了 POP 的 run 腳本格式, 更容易複制和粘貼. 感謝 Woody Preston. 在Chunck Foster 的DNS 補丁部分修正了一處拼寫錯誤. 感謝 Josh Parreco. 在QMTP 節修正了兩個拼寫錯誤. 感謝 Marek Gutkowski.

原(英)文作者: Dave Sill 本中文版發布時間:14 Apr, 2006原文web地址:http://www.lifewithqmail.org/翻譯:Jerry Zhou (Jerry underline ZhiJun(@)21cn.com) 原始版權由作者Dave Sill擁有 中文翻譯版使用權由原作者和翻譯者共同所有, 請不要用于商業用途. 轉載, 刊登, 摘錄請首先取得原作者和譯者的同意 中文版上一版爲2003年8月16日, 這個舊版本的討論和取得請訪問這裏:lwq2003.justso.cn, 這個版本的討論主頁設在linuxforum 的郵件和DNS服務器版面,可以訪問這裏到達 lwq2006.justso.cn. 本文爲完整的中文版本. 這個版本由Dave Sill收藏于http://www.lifewithqmail.org/. 謹以此翻譯的勞動致謝我的父母, 姐姐一家以及很多朋友和同事. 也可以通過我的blog地址找到我: www.justso.cn 紫色小字號爲譯者注, 包括英文原文考量和一些基礎知識. 文中將統一應用英文逗號(,) 和句號(.) 以及引號(")等英文標點符號. 如果哪位港台同胞樂意制作Big5碼的版本, 請和我聯系.Jerry underline ZhiJun(@)21cn.com. 如果你對裏面翻譯的文字有任何意見和商榷, 請e-mail譯者, 我們一起來把LWQ翻譯的更好! 給譯者信箱發送郵件, 請指定標題爲"For Translations of LWQ". 否則將被作爲垃圾郵件處理, 不情之請, 希望見諒. 中文翻譯 版本: 2006-4-14 下面是這個版本和2003-8-16版本相比的更新修正: 本版本安裝部分完全遷移到netqmail, 相應有比較大的修改; 和2003-8-16相比, 目錄和內容中增加了5.12, 5.13 兩節; 附錄G17, G18 兩節; 其他增加的小節和內容不一一贅述; 修改了附錄H9的部分贊助連接和文字; 修改了附錄H10所有文字, 增加修改了H.10.1 - H.10.7 的內容; 修改了很多翻譯BUGs和筆誤, 潤色了一些語句, 糾正了矛盾的語句; 核對了所有增加的和修改的鏈接和文字, 重新核對了全文; 核對了所有代碼, 是否是 結構, 便于直接複制; 以下爲Life with qmail 中文版正文 目錄1. 介紹 1.1. 適合閱讀本文的讀者 1.2. 什麽是qmail? 1.3. 爲什麽用qmail? 1.4. 發展曆史 1.5. 特點 1.6. 相關的軟件包 1.7. 體系結構 1.8. 版權許可信息 1.9. 和其他MTA相比較 1.10. 文檔 1.11. 技術支持 2. 安裝 2.1. 不同的安裝形式以及相互的比較 2.2. 准備工作 2.3. 系統要求 2.4. 下載源代碼 2.5. 編譯源代碼 2.6. 安裝 ucspi-tcp 2.7. 安裝daemontools 2.8. 運行 qmail 2.9. 測試 3. 配置 3.1. 配置文件 3.2. 中繼轉信 3.3. 多主機名 3.4. 虛擬域 3.5. 別名 3.6. 關于 qmail-users 3.7. 反垃圾郵件 3.8. 病毒掃描 4. 使用方法 4.1. .qmail 文件 4.2. 發送郵件 4.3. 環境變量 5. 高級話題 5.1. 關于 procmail 5.2. POP 和 IMAP 服務器 5.3. POP 和 IMAP 客戶端 5.4. Multi-RCPT 與 Single RCPT 傳送方式的比較 5.5. 關于 VERP 5.6. 故障處理 5.7. 大型服務器 5.8. 從 Sendmail 轉移到 qmail 5.9. 郵件列表管理器 5.10. 補丁 5.11. QMTP 5.12. 在SMTP對話過程中拒絕非法接收者 5.13. TLS 和 STARTTLS 附錄 A. 致謝 附錄 B. 相關軟件包介紹 B.1. dot-forward B.2. fastforward B.3. ucspi-tcp B.4. daemontools B.5. qmailanalog B.6. rblsmtpd B.7. serialmail B.8. mess822 B.9. ezmlm B.10. safecat B.11. djbdns B.12. maildrop B.13. syncdir 附錄 C. 因特網郵件工作原理 C.1. 郵件如何從A點到達B點 C.2. 其他資料 附錄 D. 體系結構 D.1. 模塊化系統結構 D.2. 文件結構 D.3. 隊列結構 D.4. 圖片 附錄 E. 一些不常見的問題 E.1. qmail如何處理延期發送的郵件? E.2. 爲什麽我無法給一個有很多MX記錄的大站點發送郵件? E.3. QUEUE_EXTRA是什麽? 附錄 F. 錯誤訊息 附錄 G. 新手常見問題 G.1. qmail 不能給超級用戶發郵件 G.2. qmail 不能給沒有主目錄的用戶發郵件 G.3. qmail 不能給名字含有大寫字符的用戶發郵件 G.4. qmail 處理擴展地址的時候用冒號(:)替換掉了點(.) G.5. qmail 處理擴展地址的時候把大寫字符轉換成了小寫字符 G.6. qmail 不使用/etc/hosts 文件. G.7. qmail 不在日志記錄 SMTP 的活動 G.8. qmail 不生成郵件延遲通知 G.9. qmail 由于/var/qmail/queue/lock/trigger 文件丟失、權限設置錯誤或者錯誤的文件屬性設置等原因變的很慢 G.10. DNS 或者 IDENT 查詢使 SMTP變慢 G.11. 回車(Return)和換行(CRLF) 不同 G.12. 日志回滾造成qmail-send 和 tcpserver 停止 G.13. qmail-smtpd 不能使地址的本地部分生效 G.14. 設置防火牆導致遠程無法連接 SMTP/POP3/IMAP 服務器 G.15. 如果USER 和 LOGNAME 沒有設置的話, qmail-inject 將設置郵件發送方字段(From)爲匿名(anonymous) G.16. 停止qmail-send進程的時候, 它不總是立即退出. G.17. 不能通過把郵件傳送到/dev/null 將郵件丟棄. G.18. qmail-send 正在運行過程中修改郵件隊列是危險的. 附錄 H. 關于本文Life with qmail 的常見話題 H.1. 這個Life with qmail 的版本是多少? H.2. 誰擁有Life with qmail? H.3. Life with qmail 的版權信息? H.4. 我怎麽取得新版 LWQ 的發布通知? H.5. 在哪裏可以爲 LWQ 投稿, 捐助以及討論它? H.6. Life with qmail 被翻譯成其他語言了嗎? H.7. Life with qmail 有沒有 PostScript, PDF, plain text, 或者其他任何除了HTML的格式? H.8. 我按照 Life with qmail 說的作了, 可是我的系統崩潰了, 或者弄壞了我的硬盤, 或者毀了我的愛情, 或者弄死了我的狗, 等等問題, 我該怎麽辦? (這屬于老外的幽默啦. ^_^, 譯者注) H.9. 我怎麽爲 LWQ捐贈和投稿? H.10. 這個版本的LWQ有那些變化呢? 1. 介紹1.1. 適合閱讀本文的讀者Life with qmail 的目標讀者是那些對qmail有興趣, 卻被歸類于業余愛好者, 新手的人, 那些在一台空閑(原文爲: a spare PC 譯者注)PC機上操作Linux, 希望日後成爲經驗豐富的系統管理員或郵件系統管理員的人寫作的. 如果你發現文章中有缺陷或者不清楚的地方, 請用電子郵件告訴我. (英文) lwq at sill dot org. (譯者的電子郵件: Jerry underline ZhiJun(@)21cn.com 譯者注). 各種不同的來源存在著豐富的 qmail相關信息. 其中一些是以新手爲目標, 另外一些假定讀者具有比較多的經驗, Life with qmail 就是一篇試圖成爲"膠水"性質的文章, 集合這些信息爲一體, 不過讀者必須首先掌握下面這些基礎知識: 在UNIX環境下熟練的操作文件和目錄的能力 會使用web浏覽器和FTP客戶端軟件 能夠讀懂下面的使用方法 1.2. 什麽是 qmail?qmail是一個因特網郵件傳送代理, (英文: Mail Transfer Agent, 簡寫爲MTA, 譯者注) 它運行在UNIX兼容系統下, 是一個直接代替UNIX下 Sendmail軟件的郵件傳送程序. qmail 使用簡單報文傳送代理協議 SMTP 傳輸郵件(Simple Mail Transfer Protocol). 注意: 它的名字是 "qmail" , 而不是 "Qmail". 1.3. 爲什麽用 qmail?你的操作系統如果包含一個MTA, 那很有可能是Sendmail, 而你閱讀了下面的文檔之後, 你可能想(抛棄Sendmail, 另外)找一個更好的MTA了. 1.3.1. 安全qmail 是面向安全而設計的. Sendmail 的曆史上出現過很多嚴重的安全問題. 在編寫Sendmail的時代, 網絡是非常友好的地方, 每個在網上交流的人都能夠很容易的了解對方, 幾乎沒有必要爲了安全而設計軟件, 編寫代碼. 而現在的因特網對于網絡服務器卻是險象叢生. Eric Allman, Sendmail的作者, 和目前的維護者Claus Assman 爲了加強Sendmail的安全做了很多工作, 但是無論如何, 除了重新設計, 怎樣的修正也不能讓Sendmail達到真正的安全. 1.3.2. 性能qmail 並行處理郵件傳送, 缺省配置情況下, 能夠達到20個並行郵件同時傳送. 1.3.3. 可靠性qmail保證已經接收的新郵件不被丟失, qmail使用一種新的郵箱格式, 其可靠性超過了沒有文件鎖的NFS存儲系統. 1.3.4. 簡單Simplicityqmail 比其他實現同樣功能的MTA都要小. 注意: qmail 的正式主頁, http://cr.yp.to/qmail.html 有更多的 qmail 特色介紹. 1.4. 發展曆史qmail由 Dan Bernstein (DJB)編寫, 關于他可以參考這裏http://en.wikipedia.org/wiki/Daniel_J._Bernstein. 他現在任職于 Illinois 大學 Chicago 分校數學教授. 它在密碼術研究方面的工作, 以及他關于密碼術源代碼的出版問題對美國政府的訴訟也是很有名的, 關于這次訴訟的情況詳見 http://en.wikipedia.org/wiki/Bernstein_v._United_States 或 http://cr.yp.to/export.html 查看關于訴訟的信息. (可能wikipedia在中國大陸無法訪問, 請參考使用代理或其他方式. 譯者注) 第一個公開發行的 qmail 版本是1996年1月24日發表的 0.70 beta 版. 第一個 gamma 發行版是在1996年8月1日的0.90版. 第一個常規發行版本是1.0, 時間是1997年2月20日. 現在使用的1.03版本, 發行于1998年6月15日. 預期下一個版本將是2.0評估版, 即將在2.0版裏面出現的一些新功能可以在http://cr.yp.to/qmail/future.html 找到. 1.5. 特點 qmail 的web頁 http://cr.yp.to/qmail.html 列出了非常全面的qmail的特點. 本節即針對這個頁面列出的特點予以著重介紹. 1.5.1. 安裝自動適應于UNIX的各種版本 自動適應于單主機配置 快速安裝--不必作大量的配置工作 1.5.2. 安全 地址, 文件以及程序之間分隔清晰 最少限度的應用setuid編碼 最少限度的應用root編碼 五個不同權限信任級別區隔運行(指利用五個分隔的uid運行qmail的不同功能模塊. 譯者注) --深入的安全保障 可選的郵件單向散列計算功能, 包括整個郵件內容的hash計算等功能. (參考 附錄 E 的什麽是 QUEUE EXTRA?) 1.5.3. 郵件結構 符合RFC 822 和RFC 1123 標准. 郵件地址組的完整支持. 自動轉換舊格式地址爲RFC 822 格式. 支持sendmail命令, 與目前的郵件用戶代理兼容. 僅受限于內存大小的長郵件頭支持. 主機僞裝(參見 defaulthost) 用戶僞裝(參見 MAILUSER和 MAILHOST) 自動生成郵件跟蹤列表(參見 QMAILMFTFILE ) 1.5.4. SMTP 服務 兼容 RFC 821, RFC 1123, RFC 1651, RFC 1652, 和 RFC 1854 標准 全 8-bit 操作(qmail直接對郵件進行8bit操作. 譯者注) 支持 RFC 931/1413/ident/TAP 回查--用來跟蹤垃圾郵件和僞造郵件 轉信控制--阻止未授權的外來轉信請求. 自動識別本地IP地址. 每緩沖超時 躍點計算 並行訪問限制(通過 ucspi-tcp) 對已知的垃圾郵件發送者, 拒絕連接(通過 ucspi-tcp) 支持授權用戶轉信和消息重寫 可選的黑洞名單(Realtime Blackhole List, RBL)和開放轉信系統修正(Open Relay Behavior-modification System, ORBS) 支持(通過 rblsmtpd) 1.5.5. 隊列管理對加入隊列的郵件即時處理 並行處理限定 分割隊列目錄--隊列很大時不降低處理速度 二次冪重試時間表排定算法--隊列內越陳舊的消息得到的發送機會相對新消息越小 (參考 附錄 E) 每個郵件獨立的重試時間表 自動安全隊列--系統崩潰情況下不丟失郵件. 自動每郵件接收者檢查 自動隊列清除 隊列觀察(參看 qmail-qread) 詳細的傳送過程分析 (通過 qmailanalog)1.5.6. 郵件反彈 QSBMF反彈郵件--包括機器易讀和人類易讀兩種格式 HCMSSC 支持--不受語言約束的 RFC 1893 錯誤代碼 發送兩次反彈郵件給系統管理員(postmaster) 1.5.7. 基于域名的郵件路由 支持任意數量的本地主機名(參看 locals) 支持任意數量的虛擬域 (參看 virtualdomains) 支持域名通配符 (參看 virtualdomains) 可配置的"percent hack"支持 (參看 percenthack) UUCP 鈎 (UUCP hook) 1.5.8. SMTP 傳輸 兼容 RFC 821, RFC 974, 和 RFC 1123 協議 全8-bit字符支持 對關閉的主機自動延遲處理 人工路由--smarthost, localnet, mailertable (參考 smtproutes) 每緩沖超時設定 被動SMTP隊列--對(低速)SLIP/PPP線路的完美支持 (通過 serialmail) Auto TURN支持 (通過 serialmail)1.5.9. 轉發和郵件列表 兼容Sendmail的 .forward控制文件(通過 dot-forward). 散列的轉發數據庫(通過 fastforward) 兼容Sendmail的 /etc/aliases 控制文件(通過 fastforward) 地址通配符 (參見 .qmail-default) 郵件列表所有者--自動轉移反彈郵件和假期郵件 VERPs--自動郵件列表反彈郵件接收者識別 自動防止循環成環郵件傳送, 甚至可以避免對于交叉串聯主機的配置方式成環郵件傳送 1.5.10. 本地(郵件)傳送 支持用戶控制的地址分級--任意FRED(Fast Random Enquiry Display 快速隨 機詢問顯示, 譯者注) mbox傳送 可靠的NFS傳輸(參見 maildir) 支持用戶可控的郵件程序傳送, 比如procmail等, (參見 qmail-command) 可選的新郵件通知(參見 qbiff) 可選的NRUDT返回收條(參見 qreceipt) 條件過濾(參見 condredirect 和 bouncesaying) 1.5.11. POP3 服務 兼容 RFC 1939 支持UIDL 支持TOP APOP鈎 模塊化的密碼檢查(通過 checkpassword) 1.6. 相關的軟件包qmail遵循經典UNIX哲學: 每個軟件工具都要有專一的, 規範良好的功能; 而複雜的功能應該由一系列多個獨立的簡單工具聯合完成, 形成一個"流水線"模式. 另外一種方式是在更爲簡單的工具上不斷的建立和豐富越來越複雜的的功能來完成大量的複雜的功能. qmail並沒有擁有所有人要求的任意功能, 這點並不令人驚訝驚訝. 相反的, qmail擁有的是一些實現那些功能的流行的插件(add-ons). 當然了, 許多標准UNIX實用工具也都可以作爲插件和qmail協同工作. 下面介紹一些插件: dot-forward --一個兼容Sendmail的.forward控制文件的插件 fastforward -- 一個兼容Sendmail別名數據庫的插件 ucspi-tcp -- 一個inetd超級服務器的替換程序 daemontools -- 一個管理後台服務程序以及日志的工具套件 qmailanalog -- 一個qmail日志文件分析工具套件 serialmail -- 用于低速網絡郵件傳送的工具 mess822 -- 一個對因特網郵件的進行分析的工具 ezmlm -- 一個基于qmail的管理郵件列表的工具 1.7. 體系結構 附錄 D 介紹了qmail的功能和結構. 簡單的說, qmail包含了一系列的程序(模塊)來完成不同的任務. 1.8. 版權許可信息qmail的版權由作者Dan Bernstein所有, qmail沒有和用戶權利聲明一同發布. 在web頁面 http://cr.yp.to/softwarelaw.html 上, 作者Dan Bernstein概要陳述了他認爲用戶在美國版權法下擁有的權利和義務. 在web頁 http://cr.yp.to/qmail/dist.html 上描述了作者授權給qmail的源代碼分發用戶的權利和義務. 二進制發行遵循條款在下面這個web頁面上可以找到 http://cr.yp.to/qmail/var-qmail.html, 也可以參考這裏: http://en.wikipedia.org/wiki/License-free_software. 發行權限的最底線: 你可以將qmail用于任何用途, 你可以再次分發未修改的qmail源代碼和有資格的var-qmail二進制發行包, 你也可以發行qmail補丁程序. 但是你不能發行修改過的qmail源代碼和non-var-qmail二進制發行包. 1.9. 和其他MTA相比較 這個題目完全可以寫一本書啦. 不過可能是很單調乏味的一本. 這裏給出一個qmail和其他最常見的UNIX MTA的快速比較表格(中: medium, 高: high, 低: low, 是: yes, 否: no, 插件: addons, 可選的: optional. 譯者注) MTA 成熟度 安全性 特色 性能 是否兼容Sendmail 模塊化 qmail 中 高 高 高 插件 是 Sendmail 高 低 高 低 - 否 Postfix 中 高 高 高 是 是 exim 中 低 高 中 是 否 Courier 低 中 高 中 可選的 是 兼容Sendmail意思是MTA運轉是否類似于Sendmail, 從而可以在某種用戶透明度上從此MTA和Sendmail之間過渡和切換, 比如.forward控制文件, /etc/aliases文件以及是否傳送郵件到目錄 /var/spool/mail等等行爲. Jonathan de Boyne Pollard 曾經回顧了很多UNIX下的MTA, web頁面在http://homepages.tesco.net/~J.deBoynePollard/Reviews/UnixMTSes/ . 另外一個很詳細的的比較文章請參考http://www.geocities.com/mailsoftware42/. (geocities可能在國內無法直接訪問. 譯者注) 1.10. 文檔 1.10.1. man 幫助手冊 qmail發行包包含了完整的man手冊. 安裝qmail之後, 他們通常位于 /var/qmail/man. 你可能需要自己手動增加這個手冊目錄路徑到你的環境變量MANPATH裏面. Shell 解釋器 命令行 Bourne (/bin/sh) MANPATH=$MANPATH:/var/qmail/man; export MANPATH bash, Korn export MANPATH=$MANPATH:/var/qmail/man C Shell setenv MANPATH $MANPATH:/var/qmail/man (上面表格爲各個不同shell下運行的增加環境變量的命令行格式, 故不予翻譯, 用戶也可以參考man man來查閱直接指定man的指定目錄開關的設定, 在Bourne下, 這個開關一般是 -M.譯者注) (修改環境變量之後) 用型如"man name-of-qmail-man-page"的命令格式即可調出相關的手冊頁面. 也可以訪問man手冊頁面的在線web頁面形式, 地址是: http://www.qmail.org/man/index.html 注意: qmail的man手冊頁面承載了大量的信息, 它的寫作語言偏重技術術語, 可能相當晦澀難懂, 必須仔細加以研讀. 你可能需要通讀一遍來熟悉它. 因爲很少有重複性的內容, 你必須首先知道裏面都寫了哪些內容,以及你感興趣的那些內容在哪裏, 否則你可能根本找不到你要的東西. 1.10.2. 文檔 qmail發行版包含了一系列文檔, 通常安裝在/var/qmail/doc目錄下. 它們包括以下內容: (本文中默認的兩個位置,一個就是文檔的根位置/var/qmail/doc, 這個位置的文檔也通常被作者描述爲qmail源代碼文件目錄下的doc文檔, 內容是一致的. 還有一個就是qmail 的安裝後的主目錄下的控制文檔, 通常爲/var/qmail/control下面, 在很多情況下, 作者並不明確指出這兩個具體位置. 譯者注) FAQ: 常見問題以及回答. INSTALL.* 文件集: 安裝文檔. PIC.*文件集: 描述了qmail如何完成核心任務的文檔. 查找更多相關信息, 請參看附錄體系結構. 其他幾個安裝相關文檔. 這些文檔也可以在線查看, 請到web頁面: http://www.qmail.org/man/index.html1.10.3. 常見問題 FAQs有兩個正式的常見問題(Frequently Asked Questions, FAQ. 附相關回答)文檔: /var/qmail/doc/FAQ 目錄下, 純文本版本, 以及 web頁面FAQ, 地址: http://cr.yp.to/qmail/faq.html.web頁面的FAQ更完整一些. 1.10.4. 書籍1.10.4.1. qmail 手冊 (英文書名: The qmail Handbook) 作者Dave Sill, 也是本文Life with qmail的作者, 曾經爲Apress(http://www.apress.com/)出版社撰寫了一本qmail書籍. 這本qmail 手冊 (英文書名: The qmail Handbook), 包括了本文所有內容, 某些方面更爲詳細, 同時也介紹了大量的新領域. 更多信息, 請參看 http://www.apress.com/catalog/book/1893115402/. 需要在我的書店定購本書, 請到我和Amazon.com合作書店 http://www.amazon.com/exec/obidos/ASIN/1893115402/davesill. 1.10.4.2. qmail (英文書名: qmail) 據報道, John Levine爲O'Reilly %26amp; Associates (http://www.oreilly.com/)出版社寫作的一本qmail書籍. 1.10.4.3. Running qmail (英文書名: Running qmail) 作者Richard Blum, Sams出版. 這本書被認爲接受了qmail郵件列表裏面的各種觀點. 定購本書, 請參看 http://www.amazon.com/exec/obidos/ASIN/0672319454/davesill. "1.10.4.4. qmail: Yuksek Performansli E-Posta SunucuIsmail Yenigul, 以及其他人著作的qmail 書籍. 參見 http://www.acikakademi.com/catalog/qmail/. 1.10.5. 郵件列表文檔 qmail的郵件列表, 由Dan Bernstein 維護, 極爲有價值的信息來源. web文檔保存在以下位置: http://www.ornl.gov/its/archives/mailing-lists/qmail/.這個文檔的一個搜索引擎位置在: http://www-archive.ornl.gov:8000/.其他web文檔可以在以下地址訪問到: http://www.egroups.com/list/djb-qmail/?refstop=1 和 http://msgs.securepoint.com/qmail/.大多數關于qmail的問題的答案都可以首先在這個郵件列表的文檔裏面搜索到. 1.10.6. 其他Web站點 http://cr.yp.to/qmail.html : qmail的正式主頁. http://www.qmail.org/. qmail的非正式主頁. 包含了大量關于功能插件和補丁的信息, 以及很多很棒的關于qmail的web頁面的鏈接. http://www.flounder.net/qmail/qmail-howto.html: Adam McKenna 制作的HOWTO. 1.11. 技術支持 1.11.1. 郵件列表 下面的這些列表位于主機 list.cr.yp.to. 爲了防止被發送垃圾郵件者獲取地址, 我沒有使用完整有效的郵件地址, 以及"mailto"格式的URL.(這裏隱去了真實的listname, 具體請參看qmail的正式主頁介紹或者查看1.11.1.節, 也就是本節的幾個小節的帶有下劃線的英文標題名字, 譯者注) 這些郵件列表由ezmlm管理, 使用不同的地址實現不同的功能. listname@list.cr.yp.to: 訂閱地址. 發送到這個地址的郵件將會被發送給列表的所有用戶. 請不要發送訂閱和退訂要求到這個地址, 這樣作是無效的, 而且還會打擾其他訂閱者. listname-help@list.cr.yp.to: 這是"幫助"地址. 發送郵件到這個地址將會返回使用信息. listname-subscribe: 發送空消息到這個地址訂閱列表. listname-unsubscribe: 發送空消息到這個地址退訂列表. 舉例, 一個訂閱或者退訂地址, 比如 joe@example.com, 發送郵件到這個地址訂閱列表: listname-subscribe-joe=example.com@list.cr.yp.to.1.11.1.1. qmail這是一個主要的qmail郵件列表.討論和提問/回答很多有關于qmail的問題. 不過不包括有關于他們自己的列表的問題. 在這個列表提問之前請閱讀Charles Cazabon的"12 Steps to qmail List Bliss" web頁面位置http://pyropus.ca/personal/writings/12-steps-to-qmail-list-bliss.html .同時請首先閱讀FAQ或者在這裏搜索列表的過去的文章. 提問的時候, 請盡量包含充分詳盡的細節, 便于其他人回答. 請注意以下這些提問要點: 你做了什麽? 你的配置? 如果你不清楚哪些比較重要, 那就把qmail-showctl 的輸出算上. 你都做了那些舉動? 如果是新安裝的qmail, 講述一下你如何安裝的. 你期待發生什麽? 你想達到一個什麽目的? 不要假設讀者會猜到你的想法. 曾經發生了什麽? 描述一下實際的結果. 包括log文件的部分剪輯, 消息的副本, 包括頭部分. 注意: qmail的郵件列表使用了一個叫做qsecretary的工具來校驗投遞到列表的郵件是否是垃圾郵件. 每封到達列表的郵件都會首先由qsecretary返回一個確認郵件. 用戶閱讀確認郵件並且按照返回郵件上的指令確認你的郵件--通常就是回複qsecretary的確認信息就可以了. 經常在列表投遞的訂戶一般使用類似Charles Cazabon編寫的pymsgauth (在這裏http://pyropus.ca/software/pymsgauth/.) 的自動回複程序來自動完成郵件確認. pymsgauth 校驗發往列表的郵件的確是你發出的, 所以它不會確認那些冒充你的名字發送到列表的郵件. 1.11.1.2. qmailannounceqmail的公告郵件列表. 沒有投稿地址, 這是個只讀的列表. 1.11.1.3. serialmail討論serialmail 軟件的列表. 1.11.1.4. ezmlmezmlm 郵件列表管理器的的討論列表. 1.11.2. 咨詢者 參看 http://www.qmail.org/top.html#paidsup 的商業支持提供者名單. 1.11.3. FAQTS 知識庫 http://qmail.faqts.com/ 一個qmail相關問題的數據庫, 包括問題解答.如果你在FAQ裏面找不到回答, 試試搜索這個知識庫. 它的專長在于回答"如何去作"的問題. 2. 安裝 這一節介紹qmail的安裝. 如果你是個經驗豐富的系統管理員, 你完全可以按照qmail的發布源文件裏面的INSTALL文件的指導完成安裝. INSTALL文件是正式的安裝指導. 這個指導比 Life with qmail, 也就是本文的指導複雜很多. INSTALL文件假定讀者是一個經驗豐富的系統管理員或者郵件管理員. 而且INSTALL這個文件也比較陳舊, 反映不了Bernstein(qmail作者)最近的操作規程建議. 注意: 如果你選擇使用下面的安裝指導, 請你一定要通讀下面整個小節以熟悉全部安裝過程. 2.1. 不同的安裝發布形式以及相互的比較 2.1.1. 二進制安裝對比源代碼安裝 由于qmail對于預先編譯的二進制代碼包的發行有限制性的許可, 通常qmail都是由源代碼安裝的. 如果你不是很熟悉源代碼和二進制的區別, 想像一下你訂了一個pizza餅. "二進制"形式的pizza餅送來了立刻就能吃, 而"源代碼"pizza餅就像全部制作pizza的材料, 面粉, 發酵粉, 幹酪, 沙司還有澆頭調料, 以及烹饪pizza的指導, 你必須自己作pizza. 雖然有點費勁, 不過如果你仔細的按照指導來作, 結果是一樣的, 甚至更好. 自己作的pizza更新鮮, 你也可以按照自己的配置調整澆頭調料, 並且你更多的了解了你的pizza以及它是如何"工作"的. 安全的運行一個因特網服務並不容易. 一個不適當配置的服務可能給你的主機系統帶來被攻擊以及被用來攻擊其他站點的風險--有可能讓管理員承擔法律責任的安全風險. 更多的知道你的網絡服務如何運行的, 就更有可能讓他們正確和安全的工作. 2.1.2. Tarball 對比 特定操作系統安裝包 (Tarball vs. OS-specific package) 一些操作系統提供一種自動源代碼安裝機制. 回到上文我們的pizza制作分析裏面. 這就好像把所有的pizza的成分和制作指導都打包到一起, 這樣你簡單的按一下按鈕pizza就能把自己烤好啦. 覺得這樣作很不錯, 是吧? 實際上, 那可不是一個想當然的好主意. 組裝這些包是個相當困難的工作, 它們有時並不是按照假定的方式工作的. 這是軟件, 而且和其他軟件一樣, 他們會有bugs. 即使不提那些bugs, 那些安裝的方便也是用犧牲你自己烤的pizza餅的很多優點來達到的. 比如你自己調整澆頭調料的的能力, 還有知道怎麽作pizza餅, 以及pizza如何工作等等. 如果qmail僅僅是一個pizza, 哪自安裝方式還是可以接受的. 不過qmail可是個相當複雜的系統. 安裝和維護qmail的人都需要對它相當的了解才能平穩的運行它. 自安裝方式的qmail更容易安裝, 不過用戶手動安裝方式更容易調整配置和查找故障. 你可能就安裝一次qmail, 但是你可能要幾次才能調整好它, 或者當郵件並不是按照你想要的方式運行的時候, 設法找出並解決問題. 由于這些原因, 我建議使用源代碼的tarball方式安裝, 而不是Red Hat RPM或者其他自安裝包方式. 2.2. 准備工作 安裝qmail之前, 尤其如果是你第一次安裝qmail, 有幾個需要注意的地方. 如果可能, 盡量在一個"試驗"系統上安裝qmail. 這樣的話可以有機會犯錯, 不至于在正在工作的服務器上安裝時丟失重要的郵件或者中斷mail服務. 如果你沒有空閑的計算機系統, 而你要安裝的系統上面已經運行sendamil, smail或者其他的MTA, 這些MTA還在進行郵件投遞, 你可以在這種系統上完成大部分的qmail 安裝而不中斷現有的郵件服務. 如果從其他MTA移植到qmail--即使你在qmail上已經很有經驗--首先制訂一個安裝計劃, 也是非常必要的. 2.3. 系統要求 qmail 必須安裝在UNIX或者類UNIX系統上, 一些系統要求: 安裝需要大約10兆空間. 安裝之後可以刪除目標文件釋放出大約4兆空間. 一個完整的C開發環境, 包括編譯器, 系統頭文件, 以及函數庫. 構建指導將告訴你如何顯示你是否擁有這些必要的部分. 二進制代碼, 文檔, 和配置文件需要幾兆空間. 郵件隊列需要一個安全的文件系統. qmail 的可靠性要求文件系統兼容傳統的BSD FFS語義. 大多數現代的本地文件系統都符合這個要求除了一個很重要的例外: link()系統調用常常是異步的--這意味著link()操作返回時不會將數據寫入磁盤. Bruce Guenter 的syncdir 庫可以用來解決這個問題. 更多信息請參見附錄裏面相關軟件包 syncdir. 郵件隊列需要的足夠的磁盤空間. 小型單用戶系統僅僅需要2兆. 大型系統可能需要2吉(2G). 兼容的操作系統. 多數變種UNIX都可以. 參考qmail源代碼裏面的README文件, 裏面有已知的兼容系統版本列表. 最好有權使用域名服務器. 沒有這個條件, qmail就只能按照smtproutes配置文件裏面配置的遠程主機發送郵件. 足夠的網絡帶寬. qmail是爲良好接入網絡的系統設計的, 所以你不可能在一個28.8k的撥號線路上運行一個郵件列表. serialmail軟件包是爲在低速連接上的系統運行qmail而設計的. 更多信息請參見附錄內serialmail相關的節. 注意: 郵件隊列所在的文件系統必須允許使用可執行文件和設置setuid()文件. 一些操作系統自動挂載(mount) /var 目錄選項爲非suid 和非可執行.這種情況下, 必須在 /var/qmail/bin 內禁止這些選項, 或者, 將這個文件夾放置在其他沒有這兩項限制的文件系統上. 稍後我將在建立目錄小節提到如何使用符號鏈接來解決這個問題. 如果/var 挂載爲非suid, 你可能在qmail-send 日志內看到如下的錯誤消息: delivery : deferral: Sorry,_message_has_wrong_owner._(#4.3.5) 注意: 本文或者INSTALL 文件的說明, 是不能作爲qmail 在蘋果X 操作系統上的安裝指導的, Eben Pratt 存檔了如何在蘋果X 系統上安裝qmail 的文檔, 參考這裏 http://netdevice.com/qmail/#osx. 2.4. 下載源代碼 好了, 你已經准備好安裝qmail的系統了. 第一步就是下載qmail和插件的源代碼. 當然了, 你需要qmail, 還有ucspi-tcp和daemontools. qmail, http://www.qmail.org/netqmail-1.05.tar.gz ucspi-tcp, http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz daemontools, http://cr.yp.to/daemontools/daemontools-0.76.tar.gz 用你的web浏覽器, 或者web客戶端(比如wget), FTP客戶端下載這些源代碼. 注意: 如果這些鏈接的其中任何一個失效, 都有可能由于他們已經升級了, 如果是這種情況, 你需要到http://cr.yp.to/software.html 查找相應軟件包的鏈接下載最新版本. 有可能升級版本不兼容下面的指導內容, 所以請一定閱讀這些發行版本的"Upgrading from previous version..."小節中的注意事項. 注意: 本文安裝指導使用netqmail 發行版, netqmail 包含了qmail 1.03 tarball版和一個補丁, 這個補丁修正了一些漏洞, 不足和兼容性問題. 在這裏訪問netqmail http://www.qmail.org/netqmail/ netqmail 的CHANGES 文件內有更多的相關信息. 2.5. 編譯源代碼 2.5.1. 檢驗編譯(源代碼)環境 首先你要確定的是你有編譯程序的必要的工具. 如何確定取決于你使用的UNIX變種. 雖然不能保證可靠, 但最簡單的斷定方式就是去試. 注意: 下面任何一個測試通過了, 你都可以停下來直接跳到下一節. 在計算機的命令提示行下, 敲入 cc 然後回車. $ cc cc: No input files specified $ 如果你得到類似上面的反應, 表明你的缺省搜索訪問路徑上有一個可用的C編譯器. 如果沒有類似反應, 也不意味著你必然沒安裝任何C編譯器. 也有可能那個編譯器不在你的缺省搜索訪問路徑上, 當然, 也有可能你根本沒有編譯器. 接著來試這幾個命令: /usr/bin/cc /usr/bin/gcc /usr/local/bin/cc /usr/local/bin/gcc /usr/ccs/bin/cc 如果他們中間沒有一個命令起作用, 你可能要多試點和平台有關的命令啦. 在命令提示符下, 區別于你使用的平台不同, 分別敲入以下命令: 對于 Red Hat Linux, 使用: rpm -qa | grep gcc 或者 rpm -qa | grep egcs 對于 FreeBSD: 默認安裝已經包括了GCC編譯器. 如果你找不到編譯器, 你必須確定它的位置或者安裝一個. 請聯絡你的操作系統銷售商或者操作系統技術支持. 這節我們將要實現編譯qmail的步驟. 剪切/粘貼(意思是複制或者粘貼腳本和命令行. 譯者注) 會很方便, 不過也不是必須的. 2.5.2. 解壓發行包 如果你一直按照這個指導來作, 那麽現在你已經有了一個C編譯器, 以及源代碼的tarball副本. 下一步, 拷貝或者移動tarball包到工作目錄. 目錄/usr/local/src 對于qmail 和ucspi-tcp安裝是個不錯的位置. 而daemontools 應該建立在/package下. 現在你需要成爲root用戶, 如果你還沒有, 那就成爲root吧. su umask 022 mkdir -p /usr/local/src mv netqmail-1.05.tar.gz ucspi-tcp-0.88.tar.gz /usr/local/src mkdir -p /package mv daemontools-0.76.tar.gz /package chmod 1755 /package 現在你可以解開軟件包了. cd /usr/local/src gunzip netqmail-1.05.tar.gz tar xpf netqmail-1.05.tar cd netqmail-1.05 ./collate.sh # 在這兒要注意錯誤信息 cd .. 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/netqmail-1.05, /usr/local/src/ucspi-tcp-0.88, and /package/admin/daemontools-0.76. 2.5.3. 建立目錄 qmail安裝程序會自行創建需要的子目錄, 你只需要創建qmail的"home"目錄. mkdir /var/qmail 然後直達下一節. 注意: 如果你想把qmail的全部或者部分文件安裝到除了/var的其他地方, 可以在/var/qmail下建立軟鏈接到其他位置. 舉個例子, qmail配置文件可以存放在/etc/qmail下面, 如下操作: mkdir /etc/qmail ln -s /etc/qmail /var/qmail/control 2.5.4. 創建用戶和組 最容易的創建用戶和組的方式是創建一個小腳本文件然後執行它. 在源代碼目錄下你可以找到一個名字是INSTALL.ids的文件, 它包括了在你的系統平台下創建用戶和組的命令行. 複制這個文件並命名另外一個名字, 編輯它來運行命令既快捷又簡單. cd /usr/local/src/netqmail-1.05/netqmail-1.05 cp INSTALL.ids IDS 接下來, 用你最順手的編輯器, 刪除文件其余部分, 除了保留你的平台需要的命令部分. 舉個例子, 下面是爲FreeBSD平台編輯之後留下的部分: pw groupadd nofiles pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent pw groupadd qmail pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent pw useradd qmails -g qmail -d /var/qmail -s /nonexistent 然後運行這個腳本, 用chmod將腳本設置爲可執行或者用sh來運行它. 第一種方法: chmod 700 IDS ./IDS 第二種方法: /bin/sh IDS 這個腳本運行完畢, 你的所有的用戶和組就已經添加完畢, 你可以繼續下一節的安裝了. 可是如果你的系統在INSTALL.ids 上沒有提到怎麽辦? 那你就必須手動創建用戶和組了. 使用你比較順手的編輯器編輯這個文件/etc/group, 增加下面兩行: qmail:*:2107: nofiles:*:2108: 注意: 首先確定2107和2108沒有被使用, 如果已經被占用, 選擇2個文件中未用的數字. 下一步, 使用vipw(大多數系統都有這個命令, 如果沒有你就必須用編輯器手動編輯, 不過這次可是/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. 如果任意一個用戶ID(UID)被占用, 必須選用其他未被占用的用戶id. 你不必一定把這些行加到文件尾部, 這樣作只是最容易說明問題的方式. 你現在已經可以進入下一節了. 2.5.5. 編譯現在你可以開始編譯qmail了. 進入/usr/local/src/netqmail-1.05/netqmail-1.05 目錄, 我們開始吧! cd /usr/local/src/netqmail-1.05/netqmail-1.05 在檢驗編譯環境小節, 你定位了你的C編譯器. 如果它的名字不是cc或者不在你訪問的環境變量PATH定義的任何目錄下, 你必須修改conf-cc和conf-ld. 假設你的編譯器名字是gcc, 並且gcc在你的環境變量PATH內可見, 那麽簡單來說, 編輯conf-cc和conf-ld然後置換所有"cc"爲"gcc"就可以了. 現在敲入下面的命令: make setup check 這個編譯完成之後, 你需要作一些安裝後配置工作. 運用下面兩個腳本用來讓工作更簡單. 如果你的DNS配置恰當, 運行這個腳本: ./config 如果由于某些原因config 腳本不能在DNS找到你的主機名, 你就必須運行config-fast腳本: (這個原因一般來說是由于config在dns反查主機IP對應的規範的主機名時候沒有記錄或者出錯造成的. 現代商業dns一般都不提供IP反查. 所以安裝過程可能更多機會是直接使用config-fast 腳本, 而不是config 腳本. 譯者注) ./config-fast the.full.hostname 舉個例子, 如果你的域名是example.com, 你的計算機的主機名是dlphin, 你的config-fast 命令行應該這樣寫: ./config-fast dolphin.example.com 注意: 你可能計劃在小型本地局域網使用僞域名比如".local", 舉例來說, 如果你的主機名是"mash", 你可能要用 ./config-fast mash.local , 如果你這樣作了, 要確定配置qmail在返回地址上使用了合乎邏輯的因特網域名. (參見第3節, 配置.) qmail現在已經安裝到你的系統內, 並且准備運行了! 下一節將要介紹運行和測試qmail. 2.6. 安裝 ucspi-tcp 剛才你解壓了qmail, ucspi-tcp, 和daemontools 的tarball包, 現在進入ucspi-tcp目錄. cd /usr/local/src/ucspi-tcp-0.88 剛才在編譯一節, 如果你修改了conf-cc和conf-ld文件, 你必須在這個目錄作同樣的修改. 然後, 運行: patch make make setup check ucspi-tcp安裝完畢. 2.7. 安裝 daemontools 進入daemontools安裝目錄 cd /package/admin/daemontools-0.76 再說一次, 如果你在編譯qmail和ucspi-tcp的時候修改了conf-cc和conf-ld文件, 你必須在在src目錄作同樣的修改. 然後, 運行: cd src patch cd .. package/install 在BSD系統上(沒有 /etc/inittab), 你必須重新啓動計算機再運行svscan, 這是後台服務器的管理服務程序. 使用 "ps -ef | grep svscan" 或者"ps waux | grep svscan" 檢查svscan是否在運行. 注意: 在Solaris下, 你必須修改/etc/inittab中關于svscan的啓動條目, 將 SV:123456:respawn:/command/svscanboot 改爲: SV:123456:respawn:/command/svscanboot /var/log/svscan 2%26amp;1 或者改爲: SV:123456:respawn:/command/svscanboot /dev/msglog 2%26amp;1 選擇那種方式, 這取決于你是想把啓動svscan的出錯消息記錄到log文件裏面還是顯示到控制台上. 這樣作的必要性請參考下面的文章: http://marc.theaimsgroup.com/?l=log%26amp;m=100327801309834%26amp;w=2 注意: 一個Slackware的用戶報告x1之前的SV /etc/inittab條目必須被移動, 否則啓動後無法運行svscan. 2.8. 運行 qmail 2.8.1. /var/qmail/rc/var/qmail/boot 目錄包含了不同配置的qmail啓動腳本示例: /var/spool/mail 方式和$HOME/Mailbox 方式, 使用procmail或者.forward 控制文件, 以及這些方式的不同組合配置. 你可以隨意考查這些方式, 不過這裏我們選用下面的腳本: #!/bin/sh# Using stdout for logging# Using control/defaultdelivery from qmail-local to deliver messages by defaultexec env - PATH="/var/qmail/bin:$PATH" \qmail-start "`cat /var/qmail/control/defaultdelivery`" 注意: 這個腳本使用了反引號(`), 而不是單引號('). 最好拷貝和粘貼上文的腳本而不是自己鍵盤輸入, 後者容易出錯. (反引號非常小,請仔細看. 譯者注) 用你的編輯器將上面的腳本保存爲 /var/qmail/rc, 然後執行下面這些命令: chmod 755 /var/qmail/rc mkdir /var/log/qmail 現在你需要決定一下, 除了由.qmail 文件指示傳送的郵件外, 其他郵件將采用何種默認傳輸方式, (.qmail 文件是指示文件傳送路徑的重要文件, 後面還會討論. 譯者注)下面的列表大致闡述了幾種一般性的選擇: 郵箱格式 名稱 保存位置 缺省的傳輸方式 注釋 mbox Mailbox $HOME ./Mailbox 最常見的格式, 大多數MUA都可以正確識別 maildir Maildir $HOME ./Maildir/ 更可靠, 少數MUA支持的格式 mbox username /var/spool/mail 參見 INSTALL.vsm文件 傳統的UNIX郵箱 更多信息請參考 INSTALL.mbox, INSTALL.maildir 和 INSTALL.vsm 文件. 選擇缺省的郵箱格式, 只要選擇上表裏面的"缺省傳輸方式"的值, 填寫到/var/qmail/control/defaultdelivery裏面就可以了. 例如, 如果選擇標准的qmail /Mailbox 傳送格式, 這樣作就行了: echo ./Mailbox /var/qmail/control/defaultdelivery 注意: defaultdelivery並不是標准的qmail控制文件. 而是上文/var/qmail/rc 文件的要素. 對于qmail-start來說, defaultdelivery 變量只是在沒有實際的 .qmail 文件指定傳送指令的情況下作爲 .qmail 文件的內容出現的. 把這個指令加入到單獨的控制文件內, 就不必再在指令內重複引用shell元字符, 避免了出現多行雜亂的命令參數. 2.8.2. 系統啓動文件 2.8.2.1. qmailctl 腳本 如果你手動執行/varqmail/rc 腳本, qmail只會部分被運行起來. 可是我們希望希望每次系統啓動後, qmail都能自動被啓動; 每次系統停止時候qmail自動被關閉. 創建一個如下的 /var/qmail/bin/qmailctl 文件可以完成這個願望: #!/bin/sh# description: the qmail MTAPATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbinexport PATHQMAILDUID=`id -u qmaild`NOFILESGID=`id -g qmaild`case "$1" in start) echo "Starting qmail" if svok /service/qmail-send ; then svc -u /service/qmail-send /service/qmail-send/log else echo "qmail-send supervise not running" fi if svok /service/qmail-smtpd ; then svc -u /service/qmail-smtpd /service/qmail-smtpd/log else echo "qmail-smtpd supervise not running" fi if [ -d /var/lock/subsys ]; then touch /var/lock/subsys/qmail fi ;; stop) echo "Stopping qmail..." echo " qmail-smtpd" svc -d /service/qmail-smtpd /service/qmail-smtpd/log echo " qmail-send" svc -d /service/qmail-send /service/qmail-send/log if [ -f /var/lock/subsys/qmail ]; then rm /var/lock/subsys/qmail fi ;; stat) svstat /service/qmail-send svstat /service/qmail-send/log svstat /service/qmail-smtpd svstat /service/qmail-smtpd/log qmail-qstat ;; doqueue|alrm|flush) echo "Flushing timeout table and sending ALRM signal to qmail-send." /var/qmail/bin/qmail-tcpok svc -a /service/qmail-send ;; queue) qmail-qstat qmail-qread ;; reload|hup) echo "Sending HUP signal to qmail-send." svc -h /service/qmail-send ;; pause) echo "Pausing qmail-send" svc -p /service/qmail-send echo "Pausing qmail-smtpd" svc -p /service/qmail-smtpd ;; cont) echo "Continuing qmail-send" svc -c /service/qmail-send echo "Continuing qmail-smtpd" svc -c /service/qmail-smtpd ;; restart) echo "Restarting qmail:" echo "* Stopping qmail-smtpd." svc -d /service/qmail-smtpd /service/qmail-smtpd/log echo "* Sending qmail-send SIGTERM and restarting." svc -t /service/qmail-send /service/qmail-send/log echo "* Restarting qmail-smtpd." svc -u /service/qmail-smtpd /service/qmail-smtpd/log ;; cdb) tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp 這個腳本可以在線下載, 地址是http://www.lifewithqmail.org/qmailctl-script-dt70. (建議所有直接使用, 或者拷貝-粘貼web頁面指令和文件格式腳本指令的讀者, 都要注意腳本編碼轉換的問題. 本文講到的qmail 是在Unix/Linux 類型服務器上運行的, 而UNIX 的回行和DOS/Windows的回車在腳本內表示的ACSII碼是完全不同的, 如果遇到這個問題, 在之後的腳本執行中, 可能出現非常奇怪的錯誤信息. 有興趣的讀者可以在搜索引擎上查找深入介紹內容. 細心的讀者還會注意到, 英文原文和翻譯版本, 在代碼前後都加上了 格式符, 其目的就是爲了保證指令代碼不會被web頁面的格式代碼"汙染". 譯者注) 你可以自己輸入這個腳本, 不過我推薦你用浏覽器下載上面鏈接的文件. 將上面這個qmailctl 腳本設置爲可執行腳本, 然後鏈接到你的用戶執行程序目錄: chmod 755 /var/qmail/bin/qmailctl ln -s /var/qmail/bin/qmailctl /usr/bin 2.8.2.2. supervise 腳本 爲 qmail 的服務創建 supervise 目錄 mkdir -p /var/qmail/supervise/qmail-send/log mkdir -p /var/qmail/supervise/qmail-smtpd/log 建立 /, var/qmail/supervise/qmail-send/run 文件 #!/bin/shexec /var/qmail/rc 建立 /var/qmail/supervise/qmail-send/log/run 文件: #!/bin/shexec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail 建立 /var/qmail/supervise/qmail-smtpd/run 文件: #!/bin/shQMAILDUID=`id -u qmaild`NOFILESGID=`id -g qmaild`MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`LOCAL=`head -1 /var/qmail/control/me`if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in echo /var/qmail/supervise/qmail-smtpd/run exit 1fiif [ ! -f /var/qmail/control/rcpthosts ]; then echo "No /var/qmail/control/rcpthosts!" echo "Refusing to start SMTP listener because it'll create an open relay" exit 1fiexec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2%26amp;1 注意: concurrencyincoming並不是標准的qmail控制文件. 它是上面腳本的一個要素. 並且, 第一個LOCAL 行上面的是"破折號 + 數字1", 下面的tcpserver行上的參數是"破折號 + 小寫字母l" . (由于英文小寫字母l和數字1容易混淆, 原作者特意補充的注意事項. 由譯者將被提到兩行修改成爲紅色. 這也是爲什麽作者希望讀者直接拷貝腳本而不是自行輸入避免腳本出錯的主要原因之一. 另外注意這個腳本中很多字體很小的引號和反引號. 譯者注) 注意: Solaris系統下一般位置的id程序不能正常工作, 請使用這個位置的 /usr/xpg4/bin/id: QMAILDUID=`/usr/xpg4/bin/id -u qmaild` NOFILESGID=`/usr/xpg4/bin/id -g qmaild` 注意: 根據你的操作系統和硬件平台的不同, 可能需要調整softlimit命令的的內存限制參數. 如果你的系統出現連接25端口失敗和無法接收遠程系統發送的郵件, 或者看到了類似下面這樣的錯誤消息: /usr/local/bin/tcpserver: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory 試一下把這個參數調整到3000000到4000000. 建立concurrencyincoming 控制文件. echo 20 /var/qmail/control/concurrencyincoming chmod 644 /var/qmail/control/concurrencyincoming 建立 /var/qmail/supervise/qmail-smtpd/log/run 文件 #!/bin/shexec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpd 將各個run文件設置爲可執行文件: 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 最後, 建立 supervise 目錄到 /service 目錄的鏈接: ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service /service 目錄是 daemontools 安裝時建立的目錄. 注意: 建立這個鏈接之後 qmail 系統會很快自動被啓動起來, 如果你還不想立刻運行qmail, 運行下面這個,命令來停止qmail: qmailctl stop 2.8.2.3. SMTP 訪問控制 允許本地主機通過SMTP方式發送郵件: echo '127.:allow,RELAYCLIENT=""' /etc/tcp.smtp qmailctl cdb 2.8.3. 停止並且禁用(其他)已經安裝的MTA 雖然有可能同時運行qmail 和現存的MTA, 比如Sendmail, 不過我建議你除非你知道自己到底在幹什麽, 否則可不要這麽幹. 說實話, 如果你正在讀我這段話, 你可能也不知道自己在幹嘛. :-) 如果現存的MTA是Sendmail, 你應該能利用運行Sendmail的init.d腳本的"stop"參數來停止它的運行. 例如下面命令中的一個可能是有效的: /etc/init.d/sendmail stop /sbin/init.d/sendmail stop /etc/rc.d/init.d/sendmail stop 如果你找不到任何一個init.d/sendmail 下的腳本, 你可以用 "ps -ef|grep sendmail" 或者 "ps waux|grep sendmail" 命令找出 sendmail 的PID, 然後用下面的命令來停止Sendmail: (kill 命令加上Sendmail的PID作參數, 譯者注) kill PID-of-sendmail 如果你的MTA不是Sendmail, 檢查相關文檔找出正確的停止MTA的方法. 你應該考慮一下把舊的MTA徹底的從你的系統裏面刪除. 至少禁用它的 init.d 腳本, 防止下一次系統重啓動的時候舊的MTA也被試圖重啓. 對于使用rpm方式安裝Sendmail的 Red Hat Linux, 執行下面的命令來刪除Sendmail: rpm -e --nodeps sendmail 注意: 如果你使用基于RPM方式的Linux, 比如 Red Hat, 刪除MTA可能帶來進一步的問題. 系統的某些應用程序將會試圖重新安裝Sendmail, 一些MUA程序將無法安裝, 因爲他們找不到安裝好的MTA. Mate Wierdl 提供了一個占位程序, 稱作 "fake_mta", 安裝這個程序之後可以防止出現以上的問題. 簡單的RPM安裝包可以在下面的地址取得 http://www.csi.hu/mw/fake_mta-1-1memphis.noarch.rpm. 檢查一下沒有其他程序在監聽SMTP服務端口(25). 舊的MTA, inetd, 或者 xinetd 等程序都有可能造成問題. (按照以上步驟執行後, 再) 運行下面的命令應該是沒有輸出結果的(除非這個時候 qmail-smtpd 服務也在運行). netstat -a | grep smtp 如果有什麽程序在運行, 首先確定不是qmail, 那麽先運行下面的命令: qmailctl stop 然後重複 netstat 檢查: netstat -a | grep smtp 如果你還是能看到這個命令有一些輸出, 你就必須在qmail 的SMTP服務運行起來之前把肇事程序找出來. 最後, 將現存的 /usr/lib/sendmail 替代爲 qmail 版本. mv /usr/lib/sendmail /usr/lib/sendmail.old # 忽略錯誤提示 ignore errors mv /usr/sbin/sendmail /usr/sbin/sendmail.old # 忽略錯誤提示 ignore errors chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old # 忽略錯誤提示 ignore errors ln -s /var/qmail/bin/sendmail /usr/lib ln -s /var/qmail/bin/sendmail /usr/sbin 注意: 創建 sendmail 的鏈接是很重要的, 即使不管以前的MTA, sendmail 命令也是一個會被很多程序調用來發送郵件的重要命令. 最後步驟是建立兩個系統別名. 2.8.4. 建立系統別名 在所有 qmail 安裝上面都要建立四個系統別名: 別名 目的 postmaster RFC 2821 標准要求, 指向郵件系統管理員(也就是你) mailer-daemon 反彈郵件事實上的標准接收者 root 轉發特權用戶, 根(root)用戶的郵件給系統管理者 abuse 事實上的郵件濫用(垃圾郵件)舉報地址 建立這些系統別名, 取決于你想讓這些郵件發送到哪裏(一個本地用戶或者一個遠程地址)並且適當的創建一個.qmail 文件集合. 舉個例子, 加入你想讓本地用戶 dave 接收發給系統管理員和郵件管理員的郵件, 就這麽作: echo dave /var/qmail/alias/.qmail-root echo dave /var/qmail/alias/.qmail-postmaster ln -s .qmail-postmaster /var/qmail/alias/.qmail-mailer-daemon ln -s .qmail-postmaster /var/qmail/alias/.qmail-abuse chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster 在 INSTALL.alias 文件裏面有更詳細的細節. 2.8.5. 運行 qmail 如果依照上文, 你創建 /service 之後就停止了qmail, 你現在應該重新啓動 qmail: qmailctl start 2.9. 測試安裝 qmail 現在應該是正在運行的狀態. 首先運行 qmailctl stat 來檢驗那些服務啓動並運行中:(下面命令後部分爲演示結果, 並不是必然如此的系統輸出. 譯者注) # qmailctl stat /service/qmail-send: up (pid 30303) 187 seconds /service/qmail-send/log: up (pid 30304) 187 seconds /service/qmail-smtpd: up (pid 30305) 187 seconds /service/qmail-smtpd/log: up (pid 30308) 187 seconds messages in queue: 0 messages in queue but not yet preprocessed: 0 所有的四個服務都應該是"up"(啓動了)1秒鍾以上. 如果不是這樣, 你可能就是在寫腳本的時候寫錯了一些東西或者你漏過了創建一個甚至多個必要的文件, 目錄或者鏈接. 返回上面的安裝指導, 一步一步的再檢查一下你的工作. 你也可以下載並運行 inst_check 腳本, 在這裏下載 http://lifewithqmail.org/inst_check. 舉個例子: # sh inst_check ! /var/log/qmail has wrong owner, should be qmaill ...try: chown qmaill /var/log/qmail # 如果 inst_check 發現了問題, 解決問題後重新運行這個檢查腳本. 當所有情況被判斷爲正確的時候, inst_check 將會報告: Congratulations, your LWQ installation looks good! readproctitle 程序維持著由svscan 管理的各個服務的錯誤消息的日志. 使用 ps 或者其他進程列表命令. 舉個例子, 你可以看到類似下面這樣的輸出: # ps -efl | grep "service errors" | grep -v grep 000 S root 1006 1001 0 76 0 - 334 pipe_w Mar31 ? 00:00:00 readproctitle service errors: ...unable to start qmail-smtpd/run: exec format error # 這個例子裏面, 問題出在 /service/qmail-smtpd/run 這個腳本的第一行--很有可能由于腳本文件是 DOS 格式 (DOS使用回車符-換行符結束一行的方式和Unix的僅僅用換行符方式不同). 有時候爲了檢驗配置錯誤, 手動運行一下服務也會很有幫助的. 舉個例子, 如果你的 qmail-smtpd/log 服務沒有運行, 那麽執行下面的命令: cd /service/qmail-smtpd/log svc -d . ./run 如果沒有錯誤, 輸入一行字符然後按回車鍵 如果還是沒有錯誤, 輸入CTRL-D (文件結束符) 這個時候, 你應該能夠識別問題所在並且解決它了. 這個做完之後, 返回服務目錄, 如果有必要, 運行命令: svc -u . 一旦那些服務的啓動時間都大于1秒鍾後, 依照 TEST.deliver 和 TEST.receive 文件裏面的指令去校驗服務是否正確的工作. 注意, 應用這些指令, 日志將由multilog 程序記錄到 /var/log/qmail 下, 而不是 splogger 記錄到類似 /var/log/maillog 的文件裏面. 注意: 如果你選擇了 maildir 郵箱格式作爲默認的傳送方式, 在運行這些指令之前, 你必須在你的主目錄和別名的主目錄創建 Maildir 目錄. 參見 maildir 小節查找如何恰當的創建這個目錄. 3. 配置 你已經從源代碼tarball方式, 或者自編譯包方式, 或者var-qmail包方式安裝了 qmail. 這一節的內容就是按照你的需要配置qmail. 3.1. 配置文件 所有的qmail系統配置文件, 除了在~alias下的 .qmail 文件, 都位于 /var/qmail/control 目錄下. qmail-control 的man手冊頁包括了一個像下面這樣的表: 控制文件 默認值 被用于 使用目的 badmailfrom none qmail-smtpd From 地址黑名單 bouncefrom MAILER-DAEMON qmail-send 反彈郵件的發送者 bouncehost me qmail-send 反彈郵件的發送者主機名 concurrencyincoming none /service/qmail-smtpd/run 最大並行 SMTP 連接數 concurrencylocal 10 qmail-send 最大並行本地傳送數 concurrencyremote 20 qmail-send 最大並行遠程傳送數 defaultdelivery none /var/qmail/rc 默認的 .qmail 文件 defaultdomain me qmail-inject 默認的域名 defaulthost me qmail-inject 默認的主機名 databytes 0 qmail-smtpd 郵件最大字節數 (0 等于無限) doublebouncehost me qmail-send 雙重反彈的發送者的主機名 doublebounceto postmaster qmail-send 接收雙重反彈郵件的用戶 envnoathost me qmail-send 對缺少"@"符號的地址配置的缺省域名 helohost me qmail-remote 在SMTP HELLO命令裏面使用的主機名 idhost me qmail-inject 在Message-ID 裏面使用的主機名 localiphost me qmail-smtpd 替代本地 IP 地址的名字 locals me qmail-send 進行本地傳送的域 me 系統的正式域名 FQDN various 許多控制文件的默認要求 morercpthosts none qmail-smtpd 二級rcphosts(接收主機)數據庫 percenthack none qmail-send 可以使用"%"模式轉信的域 plusdomain me qmail-inject "+"加號拖尾地址替代的域 qmqpservers none qmail-qmqpc QMQP 服務器IP地址 queuelifetime 604800 qmail-send 郵件在隊列內可保留秒數 rcpthosts none qmail-smtpd 我們的主機接收郵件的域 smtpgreeting me qmail-smtpd SMTP 問候信息 smtproutes none qmail-remote 人爲指定的SMTP路由 timeoutconnect 60 qmail-remote SMTP連接超時秒數 timeoutremote 1200 qmail-remote 遠程服務器連接超時秒數 timeoutsmtpd 1200 qmail-smtpd SMTP客戶端超時秒數 virtualdomains none qmail-send 虛擬域和用戶 查找這些特殊控制文件的更多信息, 請參考上面表格 "被用于" 列下的各個模塊的 man 手冊頁. 3.2. 中繼轉信 3.2.1. 介紹 什麽是轉信? 轉信是 MTA 通過SMTP接收到一封既不是發給本地地址也不是從本地發送者發來的郵件之後, MTA轉發這個郵件的動作就是轉信. 在垃圾郵件時代之前, MTA被配置爲開放轉信是很常見的: 各種各樣的服務器接受來自任何人的郵件, 轉發給任何人. 現代的絕大多數 MTA 都被配置爲或者完全禁止轉信, 或者只允許某些被信任的用戶或者系統使用中繼轉信功能. Chris Johnson 爲qmail 的用戶寫了一個非常好的文檔. 我鼓勵你去看一看: http://www.palomine.net/qmail/relaying.html. 3.2.2. 禁止轉信如果你是按照 qmail 的正式安裝指導安裝的話, 那麽轉信在默認情況下已經被關閉了. 這個功能是通過把local和virtualdomains(指本地主機)文件裏面列出的有充分資格的域名寫入 /var/qmail/control/rcpthosts 文件來完成的. rcpthosts 這個文件名是來源于SMTP對話中的的RCPT(接收者)命令. 在SMTP對話裏面, RCPT是用來確認郵件接收者地址的, 然後, rcpthosts 列出可以出現在RCPT地址裏面的有效的主機名. 3.2.3. 允許有選擇的轉信 大多數單用戶和小型工作組服務器可以完全禁止轉信, 可是如果你維護的是一個分布式的用戶社區, 你就必須有一個方式能夠允許你的用戶, 而且只能是你的用戶通過的你的系統轉信. 本文是通過使用 tcpserver 來設置RELAYCLIENT 環境變量, 使 qmail-smtpd 重載 rcpthosts 文件完成這個功能的. 如果你是按照這個文檔的指導安裝的話, 有選擇的轉信已經在默認情況下安裝好了. 如果需要給客戶端轉信權利, 首先在 /etc/tcp.smtp 文件裏面增加類似下面的行: IP address of client:allow,RELAYCLIENT="" (斜體IP address of client代表客戶端的IP地址. 譯者注) 然後重建SMTP的訪問許可數據庫: qmailctl cdb 或者運行下面的命令(重建數據庫): tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp 如果你是按照正式安裝指導安裝的, Chris Johnson寫了另外一個非常好的如何配置qmail允許選擇主機轉發郵件的文檔, 參見: http://www.palomine.net/qmail/selectiverelay.html. 3.2.4. 使用smart host中繼轉信如果在一個典型的家庭寬帶上網條件下建立郵件服務器, 那麽將有非常大的可能, 這個服務器的IP地址會被列入黑名單, 比如SORBS(http://www.dnsbl.sorbs.net/lookup.shtml)的黑名單, 這樣作是爲了防止垃圾郵件. 絕大多數ISP都給他們的用戶提供SMTP服務器用來轉信, 這些服務器通常不在黑名單內. 舉個例子, Road Runner(美國某ISP. 譯者注)在辛辛那提(美國地名. 譯者注)使用smtp-server.cinci.rr.com 這個服務器來爲她的用戶提供SMTP轉信服務. 你可以讓qmail 將所有向外傳送的SMTP 訪問都通過這個服務器, 你可以這樣作: echo ":smtp-server.cinci.rr.com" /var/qmail/control/smtproutes smtproutes 文件可以提供更多的路徑選擇功能, 請參考qmail-remote 的man 幫助文檔. 3.3. 多主機名 如果你的主機名已知配置了多個名字, 例如, 所有的來自user@host1.example.com 的地址也可以被寫成 user@example.com 或者 user@mail.example.com, 那麽你就必須告訴 qmail 哪一個地址是它應該本地傳送的地址, 哪一個地址是它應該接受的遠程主機發送的地址. 如果要這樣作, 只要把所有的名字加入下面兩個控制文件就行了: rcpthosts, 這個文件通知 qmail-smtpd 接收這個主機可以接受的地址. 還有 locals, 這個文件通知 qmail-send 哪些地址是本地傳送地址. 給 qmail-send 發送一個HUP(挂起)信號來通知它重新讀取 locals文件. 如果你使用的是本文的 qmailctl 腳本, 那麽運行下面的命令就可以了: qmailctl reload 3.4. 虛擬域 虛擬域和上節提到的多主機名類似, 不過這裏面有一些很重要的不同之處. 首先如果 example.net 是 virtual.example.net 虛擬域的宿主主機, 那麽一個發送給 joe@virtual.example.net 的郵件將不會被發送給即使是同一個郵箱的 joe@example.net, 這裏虛擬域的名字空間是沖突的. 使用 qmail, 虛擬域將在 virtualdomains 文件裏面配置, 文件內由型如下面這行的條目構成: user@domain:prepend qmail 轉換 user@domain 爲 prepend-user@domain 並且將這個轉換後的名字作爲本地域一樣對待. user@ 這個部分是可選的, 如果缺少這個部分, 這個名字將匹配所有 @domain 域下面的地址. 回到上文的 example 劇情裏面, 如果 example.net 郵件管理員希望創建 virtual.example.com 虛擬域, 並且將這個域置于用戶 john 的管理之下, virtualdomains 文件下面的虛擬域條目應該這樣寫: virtual.example.com:john 這樣, 發往 joe@virtual.example.com 的郵件將會被修改爲發往 john-joe@virtual.example.com , 然後進行本地傳送. 更多信息, 請參見 .qmail 小節, 以及 擴展地址 細目. 那裏將介紹 john 如何管理他的虛擬域. 使用多主機名的時候, 所有的虛擬域都必須在rcphosts列出, 這樣 qmail-smtpd 才會知道那些地址的郵件才應該被接受. 但是不像多主機名方式, 虛擬域不可以在locals裏面設置相應條目. 修改 virtualdomains文件之後, 發送給 qmail-send 一個 HUP (挂起) 信號, 通知它重新讀取配置文件. 如果你使用本文的 qmailctl 腳本, 你可以運行如下命令: qmailctl reload 同時, 不要忘了在 rcpthosts 裏面增加虛擬域條目. 注意: 必須設置域名服務器(DNS)的郵件交換器(MX)記錄, 以使虛擬域指向正確的郵件服務器. 這是名字服務器管理員的工作, 超出了本文討論的範圍. 3.5. 別名qmail的標准別名機制是由qmail的本地傳送機制自然派生出來的.qmail-local 試圖傳送地址爲 localpart@host 的郵件給本地叫做 localpart 名字的用戶. 如果沒有匹配這個名字的用戶存在, 郵件將會被發送給別名 alias 用戶, 別名用戶是qmail系統裏面通常主目錄位于 /var/qmail/alias 的僞用戶. 舉例, 如果你想要創建一個叫做 info@example.com 的別名, 這個別名用戶將把上文收到的所有無主郵件轉發給用戶 tom, 在我們舉例的 example.com 上, 這樣作的方式是: 作爲 root 用戶, 運行下面的命令: echo \%26amp;tom /var/qmail/alias/.qmail-info .qmail 小節, 以及 擴展地址 細目介紹了如何創建 .qmail文件, 這些文件確定了那些別名存在, 以及如何處理哪些發給他們的郵件的. 附錄 新手常見問題 介紹了兩個關于別名應用的複雜案例. 那些別名使用了大寫字母和小數點("."), 以及 .qmail 文件的 man 手冊頁面, 其中包含了完整的關于 .qmail 文件用法的文檔. 注意由于別名在 qmail 裏面的實現方式, 別名是不能夠優先與一個已知用戶的傳送的. 例如, 如果 rachel 是一個普通用戶, 那麽~alias/.qmail-rachel 別名是無效的. fastforward 軟件包另外提供了一個可行的別名機制, 它將多個別名放入單獨一個和Sendmail別名數據庫兼容的文件裏面. 下一節, qmail-users, 描述了其他實現別名的機制. 3.6. 關于 qmail-users qmail-users 是一個分發地址給用戶的系統. 由 /var/qmail/users 下的一系列文件構成. assign 文件是一個分配表. 有兩種分配表的格式: 單體方式和通配符方式. 注意: assign 文件包含了一系列分配表, 每行一個, 後面接一個包含了一個單獨的小數點(.)的行. 如果你手動創建assign文件, 不要忘記小數點那一行. 3.6.1. 單體分配表 一個單體分配表看起來是這個樣子的: =address:user:uid:gid:directory:dash:extension: 這個表的含義是: 作爲 address 地址接收的郵件將會被使用用戶 user 來傳送, 使用指定的 uid 和 gid, 並且由 directory/.qmaildashextension 這個文件決定郵件如何被傳送. 3.6.2. 通配符分配表 通配符分配表看起來是這個樣子的: +prefix:user:uid:gid:directory:dash:prepend: 這個表的含義是: 作爲 prefixrest 地址裏面匹配的郵件地址接收的郵件, 將會被使用用戶 user 來傳送, 使用指定的 uid 和 gid, 並且由 directory/.qmaildashextension 這個文件決定郵件如何被傳送. 3.6.3. qmail-user 程序 qmail-user 有兩個輔助程序: qmail-newu 和 qmail-pw2u. qmail-newu 程序處理 assign 文件並且在 /var/qmail/users 下生成一個名爲 cdb 的靜態數據庫(CDB)文件. CDB是二進制格式, 所以在內含數千條分配表的情況下, 仍然可以被 qmail-lspawn 快速訪問. qmail-pw2u 把系統用戶數據庫 /etc/passwd 轉換爲一系列適于assign 使用的分配表. qmail-pw2u 使用一組文件來修改翻譯規則. include: 要包括的用戶 exclude: 不要包括的用戶 mailnames: 用戶的可替換的"郵件帳戶名字" subusers: 用戶控制的額外的地址, 使用可選的 .qmail 擴展方式 append: 其他分配表 注意: 如果你使用qmail-pw2u, 不要忘記在增加和刪除用戶, 或者改變UID和GID之後, 重新運行一下qmail-pw2u和qmail-newu. 標准的運行次序如下所示: qmail-pw2u /var/qmail/users/assign qmail-newu 3.7. 反垃圾郵件 Chris Hardie 寫了一個極好的的qmail反垃圾郵件 HOWTO. 可以在這個地址訪問到它: http://www.summersault.com/chris/techno/qmail/qmail-antispam.html. 3.8. 病毒掃描 Jason Haar編寫了 Qmail-Scanner, 一個爲qmail設計的內容掃描裝置. 更多信息請參見 http://qmail-scanner.sourceforge.net/. Qmail-Scanner 包括了一個簡單策略阻止組件(例如, 阻止*.scr文件, 或阻止"Yellow!"這樣的標題), 同時也直接支持許多不同的防病毒"插件", 包括ClamAV Antivirus掃描器 http://www.clamav.net/. 4. 使用方法 這一節介紹了qmail 針對普通用戶的使用方法. 如果你在 qmail 系統上讀信和發信, 那麽你閱讀本節就可以找到如何用qmail 達成你的目的了. 4.1. .qmail 文件 傳送用戶郵件通常是由一個或者幾個 ".qmail"(發音 dot kyoo mail) 文件控制的. 這些文件位于用戶的主目錄, 文件名由 .qmail 開頭. .qmail 的man 手冊頁面描述了 .qmail 文件使用方法. .qmail 文件包括了一個傳送指令清單, 每行一個指令. 每行的第一個字符決定了選擇那種傳送方式. 字符 傳送類型 值 # 無 (注釋) 忽略 | 程序 由shell 執行的命令 / 或者 . mbox郵箱格式 (如果路徑最後一個字符不是一個斜杠) mbox 的路徑名 (包括斜杠"/"或者 點".") / 或者 . maildir郵箱格式 (如果路徑最後一個字符是一個反斜杠) maildir 的路徑名 (包括斜杠"/"或者 點".") %26amp; 轉發 轉發郵件的地址 字母或者數字 轉發 轉發郵件的地址 (包括第一個字符) 4.1.1. 程序傳送 如果.qmail 文件內指令由程序傳送, qmail 將啓動一個 shell (/bin/sh) 來執行這個命令, 然後使用標准把郵件的一個副本傳送給這個命令. qmail-command 的man 幫助文檔對這個過程有詳細描述. 程序傳送是非常強大的, 被用來實現的功能範圍非常廣闊, 例如郵件過濾, 自動回複, 以及通過第三方傳送代理比如procmail來傳送郵件. 例如: |preline /usr/ucb/vacation djb 這個指令操作qmail 啓動preline, 將 /usr/ucb/vacation 和 djb 作爲參數傳送給 preline, 並且使用標准輸入將郵件的副本傳送給這個命令. 4.1.2. mbox 格式郵箱的郵件投遞 mbox 是標准的UNIX郵箱格式, 在一個獨立文件內存放多個郵件, 每個郵件由一個"From" 的開頭的行開始. 這一行看起來像一個郵件頭字段, 不過那不是郵件頭, 那僅僅是傳送代理添加的, 作爲一個標記,便于找到每個郵件的開始部分. 例如: ./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手冊頁詳細描述了maildir格式的細節. maildir 格式的優點之一就是保證郵件傳輸的安全, 即使在不鎖定情況下, 不同郵件代理同時更新郵件, 也能保證傳輸的可靠. 這意味著maildir 郵箱可以安全的建立在以NFS性質挂接的文件系統上. 例如: ./Maildir/ 這個設置表示將把郵件存儲在 $HOME/Maildir 下面的 maildir 格式的郵箱. 注意: qmail-local 可以將郵件傳送到 maildir 格式郵箱, 但是不能創建這種郵箱. 你需要使用qmail 附帶的maildirmake 程序來創建 maildir 格式郵箱. 例如: "maildirmake ~/Maildir". 不過要確定你使用maildir的擁有者運行maildirmake, 而不是 root 用戶. 另外的方式, 你的 useradd 和 adduser 命令可能支持"skeleton"骨架目錄, 例如: /etc/skel, 然後可以直接複制這個目錄給所有新用戶. 4.1.4. 轉發郵件轉發郵件就是將郵件重發到指定地址. 這些寫入.qmail文件內的地址不能包含注釋部分和多余的空格. 下面的寫法是錯的: %26amp; %26amp; user@example.com %26amp;Joe User 下面的是正確的寫法: %26amp;user@example.com user@example.com %26amp;user 前兩個將郵件副本轉發給 user@example.com, 最後一個將郵件副本轉發給本地用戶 user. 4.1.5. 擴展地址 qmail 支持用戶控制擴展地址. 在基本地址 username@hostname.domain 上擴展的擴展地址爲: username-extension@hostname.domain ,用戶同樣可以接收發往擴展地址的郵件. 在本節其余部分, 我們討論的範圍都是在本地系統上, 所以我們將不再使用"@hostname.domain" 部分. 給用戶 username 的郵件傳送指令由 ~username/.qmail 文件指定. 對于型如username-extension 的擴展地址的傳送指令由用戶目錄下的~username/.qmail-extension 文件指定. 舉一個例子, dave-lwq@sparge.example.com 這個擴展地址的傳送將由文件 ~dave/.qmail-lwq 來控制. 擴展地址可以擁有多個字段, 例如 dave-list-qmail 這個擴展地址, 由 ~dave/.qmail-list-qmail 來控制. 在這個例子裏面, dave-list-qmai 這個地址被用來訂閱 qmail 的郵件列表, ~dave/.qmail-list-qmail 則負責歸檔這個列表的郵件到單獨的郵箱裏面. .qmail 文件可以用-default 後綴進行匹配。 所以 dave-list-qmail 可以由 ~dave/.qmail-list-default 操作. 這個文件可以一對多方式用一個.qmail文件控制所有型如 dave-list-加上任何後綴的地址. 注意 dave-list 不能由 ~dave/.qmail-list-default 控制, 因爲在"list"後面沒有"-". qmail 會使用最接近的匹配方式. 例如, qmail在傳送一個標志著送給dave-list-qmail這個地址的郵件時, 會按照下面順序查找.qmail控制文件, 並按照最先匹配的.qmail文件傳送這個郵件. .qmail-list-qmail .qmail-list-default .qmail-default 如果沒有找到相匹配的.qmail文件, 傳送失敗, 並且將郵件反彈給發送者. 4.2. 發送郵件 郵件用戶通常並不直接發送郵件. 典型的方式是利用郵件用戶代理(Mail User Agent, MUA)程序, 例如 pine 或者 mutt 編寫並發送郵件. MUA程序調用MTA傳送郵件. 這個處理郵件到MTA的調用過程稱爲注入(injection). 有兩種方式完成注入, 一種利用SMTP協議(Simple Mail Transfer Protocol, SMTP), 或者利用MTA提供的的特定程序. 4.2.1. SMTP 方式 MUA程序可以使用TCP協議連接到標准的SMTP協議端口25, 可以是本地主機或者指定的郵件服務器. MUA和MTA後續進行的回話導致兩個結果: 郵件被傳送給MTA, 或者 返回一份錯誤報告給MUA SMTP沒有身份認證的機制, 所以發送郵件的過程是不要求用戶名和密碼的. 但是, 大多數MTA拒絕接收既不是來自本地用戶也不是發送給本地用戶的郵件的. 如果一個恰當的格式的郵件被MTA拒絕, 最大的可能就是轉信限制造成. 參見轉信小節查看更多的如何配置轉信的信息. 4.2.2. /var/qmail/bin/sendmail 文件 很多年以來, UNIX MTA一直都是Sendmail. 由于Sendmail的應用十分普遍, 許多程序員假定它是默認的MTA. 結果, Sendmail的本地注入機制成爲標准的本地郵件注入的應用編程接口(Application Programmer's Interface, API). qmail 以及其他非Sendmail的MTA因此也提供一個sendmail程序應用于本地注入方式上, 它的工作方式和真正的Sendmail 的 sendmail程序一樣. qmail 的用于替換Sendmail相應部分的 sendmail 程序, 通常位于 /var/qmail/bin/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 4.2.3. qmail-inject 除了模仿 sendmail 的 API之外, qmail 也擁有自己的注入程序: qmail-inject. 實際上, qmail提供的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程序設定和使用環境變量, 下面的表格列出了這些變量並且描述了他們的用法. 名字 Man 幫助頁 設置/使用 使用目的 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 使用 重載ontrol/defaultdomain 文件 QMAILDEFAULTHOST qmail-inject 使用 重載control/defaulthost 文件 QMAILHOST qmail-inject 使用 在郵件頭From中的主機名(1) QMAILIDHOST qmail-inject 使用 重載control/idhost 文件 QMAILINJECT qmail-inject 使用 指定幾個選項(參見下面的表格) QMAILMFTFILE qmail-inject 使用 包含下一級跟蹤的郵件地址列表的文件 QMAILNAME qmail-inject 使用 在郵件頭From中的個人姓名(1) 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) QMAILINJECT 標志位 QMAILINJECT Flags 字母 使用目的 c 爲From部分使用地址注釋風格 s 不考慮任何傳入郵件的返回路徑部分 f 刪除所有傳入郵件的From部分 i 刪除所有傳入郵件的Message-ID部分 r 使用每接收者VERP m 使用每郵件VERP 5. 高級話題5.1. 關于 procmailprocmail 是一個流行的郵件傳送代理( Message Delivery Agent , MDA). MDA的功能是從MTA爲特定用戶或者郵箱接收郵件, 然後按照用戶的要求傳送郵件的程序. procmail 可以用來針對郵件主體或者不同的郵件頭內容過濾郵件. 舉一個例子, 從某個特定的人發來的郵件可以被定向傳送到某個專門爲這個人准備的郵箱. 在qmail上應用procmail有兩個技巧. 第一個, procmail 通常被配置成傳送郵件到/var/spool/mail 下的mbox 格式的郵箱. 你可以重新設置安裝procmail到缺省的$HOME 路徑下, 或者指導用戶不要依賴procmail 將郵件投遞到默認的mbox位置. 除非你爲$HOME 郵件投遞方式打補丁, 否則, procmail依然會使用/var/spool/mail 作爲臨時文件. 另外一個問題是qmail-command和procmail使用的退出碼是不同的. procmail使用的是標准UNIX退出碼: 零代表成功, 非零代表失敗, 失敗的原因由/usr/include/sys/errno.h 定義. qmail-command 使用某個非零碼指示永久錯誤, 其余作爲臨時碼. 解決方式可以應用一個小的shell腳本爲 qmail-command 翻譯退出碼. 這樣的一個shell腳本曾經在qmail 郵件列表刊登, 現在被存檔在這個位置http://www.ornl.gov/lists/mailing-lists/qmail/1998/04/msg00487.html. 同樣的情況, 舊版本的procmail(3.14之前)不能直接傳送郵件給maildir格式的郵箱. 最好的辦法是升級你的procmail到最新版本. 另外一個解決辦法是使用safecat, 這個程序將標准輸入的郵件寫入指定的maildir格式的郵箱. 用戶可以使用 procmail 處方(傳送指令)來使用safecat 保存郵件. 也可以完全跳過procmail, 使用maildrop. 最後, procmail 認爲郵件將被接收到mbox格式的郵箱, 常規的qmail傳送程序僅僅包括實際的郵件, 而不包括"From"起始行. 這裏可以使用preline 命令來格式化郵件, 以保證procmail的要求. 上面鏈接提到的腳本就包括了 preline. 舉一個例子, 假設用戶"dave"希望用procmail來處理他的郵件. 他的系統管理員設置procmail來傳送郵件到默認的$HOME, 並且已經配置好了上面的退出碼翻譯腳本程序, 假設名字是 /usr/local/bin/qmail-procmail, 那麽他的.qmail文件應該是這個樣子的: |/usr/local/bin/qmail-procmail 5.2. POP 和 IMAP 服務器 qmail包括一個POP服務器, qmail-pop3d, 不過並沒有作爲qmail 安裝過程的一部分. 你可以選用其他POP或者IMAP服務器, 盡管他們大多數都是爲Sendmail編寫的, 在qmail下運行這些服務器時, 需要作一些額外的修改工作. 5.2.1. qmail-pop3dqmail-pop3d 是qmail自帶的很不錯的POP服務器. 很多qmail站點都使用它作爲POP服務器. 它是模塊化的, 可以通過不同的認證模塊支持多種認證方案. 注意: 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端口監聽, 一旦有連接, 它將提示輸入用戶名和密碼, 然後它調用checkpassword來校驗用戶名/密碼, 通過校驗後調用qmail-pop3d. 5.2.1.2. 安裝 qmail-pop3d 1. 完整安裝並測試qmail. 如果你希望所有用戶都可以用 POP 方式訪問郵箱, 那麽首先確定 defaultdelivery 文件內容已經設置爲 ./Maildir/. 如果你是按照本文的安裝小節安裝的qmail, /var/qmail/rc腳本已經被安裝到恰當位置, 那麽在文件 control/defaultdelivery 中已經配置了這個參數. 如果不是這樣安裝的, 則這個參數可能是在/var/qmail/rc 的 qmail-start 命令行上實現的. 2. 從http://www.qmail.org/top.html#checkpassword下載checkpassword 程序. 如果你不需要其他特別的東西, 也可以在http://cr.yp.to/checkpwd.html 下載標准的checkpassword程序. 3. 按照安裝指導編譯並安裝checkpassword程序. 確定你安裝程序到 /bin/checkpassword 下. 注意: 如果你安裝的是標准checkpassword, 解開源代碼之後別忘記打修補錯誤返回碼的補丁: patch 4. mkdir /var/qmail/supervise/qmail-pop3d 5. 創建一個/var/qmail/supervise/qmail-pop3d/run 腳本, 包括如下內容: #!/bin/shexec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -v -R -H -l 0 0 110 /var/qmail/bin/qmail-popup \ FQDN /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2%26amp;1 這裏 FQDN 是你建立的POP服務器的完整的有資格的正式域名, 例如, pop.example.net. 注意: 由softlimit命令 指定的內存使用限度是可以依賴于你是用的的硬件平台和操作系統作適當提高的. 當連接到110端口失敗或者POP3連接以難以理解的方式失敗情況下, 或者你查看到如下錯誤信息: /usr/local/bin/tcpserver: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory 試著將這個參數提高到3000000或者5000000. 6. mkdir /var/qmail/supervise/qmail-pop3d/log 7. 創建包括以下內容的/var/qmail/supervise/qmail-pop3d/log/run 文件. #!/bin/shexec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \ /var/log/qmail/pop3d 8. 建立log日志文件夾並且設置相應的run腳本, 將腳本鏈接到 /service 目錄: chmod +t /var/qmail/supervise/qmail-pop3d # if daemontools 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 9. 將下面內容加入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 10. 將下面內容加入qmailctl腳本的"stop"部分 echo " qmail-pop3d" svc -d /service/qmail-pop3d /service/qmail-pop3d/log 11. 將下面內容加入qmailctl腳本的"stat"部分 svstat /service/qmail-pop3d svstat /service/qmail-pop3d/log 12. 將下面內容加入qmailctl腳本的"pause"部分 echo "Pausing qmail-pop3d" svc -p /service/qmail-pop3d 13. 將下面內容加入qmailctl腳本的"cont"部分 echo "Continuing qmail-pop3d" svc -c /service/qmail-pop3d 14. 將下面內容加入qmailctl腳本的"restart"部分 echo "* Restarting qmail-pop3d." svc -t /service/qmail-pop3d /service/qmail-pop3d/log 5.2.2. Qpopper如果你需要一個在mbox格式郵箱下工作的的POP後台服務程序, 你可以選用 Qualcomm的 Qpoper. 可以在這裏找到 http://www.eudora.com/products/unsupported/qpopper/. 5.2.3. Binc IMAPAndreas Hanssen 編寫了 Binc IMAP服務器, Binc IMAP被設計爲和qmail-pop3d使用相同的認證機制(checkpassword), 所以它很適合于qmail 郵件服務器. 和qmail-pop3d一樣, 它只支持maildir格式的郵箱. 參見http://www.bincimap.org/. 5.2.4. DovecotTimo Sirainen 編寫了Dovecot, 這是一個mbox 和 maildir 格式郵箱都予以支持的 IMAP 和 POP 服務器. 以安全爲設計目標. 可以在這裏訪問到它 http://dovecot.procontrol.fi/. 5.2.5. imap-maildirDavid R. Harris 整理了有關 University of Washington IMAP 服務器的關于 maildir 格式支持的補丁, 並且存檔了安裝過程. 參見http://www.davideous.com/imap-maildir/ . 5.2.6. Courier-IMAPSam Varshavchik 編寫了一個只支持maildir郵箱的IMAP 服務器. 可以在這裏 http://www.courier-mta.org/imap/ 訪問. 5.2.7. CyrusCarnegi Mellon 大學的Cyrus 項目包含了一個IMAP 服務器, 可以在這裏找到它 http://asg.web.cmu.edu/cyrus/imapd/. Rick Updegrove 寫了一個qmail到cyrus的腳本用來將郵件傳送給Cyrus 存儲, 這個http://msgs.securepoint.com/cgi-bin/get/qmail0308/41/1/1.html. 5.3. POP 和 IMAP 客戶端 5.3.1. fetchmailfetchmail 是一個從POP或者IMAP服務器接收郵件並且再次本地注入的程序. fetchmail從qmail服務器接收郵件是沒有問題的, 不過作爲qmail的客戶端, 要讓它良好的工作, 有兩個技巧. 這裏是一個在qmail系統上爲某個用戶配置的.fetchmailrc例子: poll mail.example.net proto pop3 nodns user dsill with password flubgart is dave here fetchall forcecr 這個文件指示fetchmail 通過POP3協議連接mail.example.net服務器, 使用賬戶dsill , 密碼flubgart, 登錄並接收所有郵件, 然後傳送這些郵件到 dave@localhost. forcecr 標志使fetchmail將每個郵件通過SMTP方式注入本地系統前對郵件的每行以回車符結束. qmail要求如此. 5.3.2. getmailgetmail 從POP服務器接收郵件然後傳送到maildir格式的郵箱. 實際上它是個Python 腳本, 所以你在使用getmail之前需要安裝Python解釋器. getmail 由 Charles Cazabon 編寫, 他在這個位置 http://pyropus.ca/software/getmail/ 爲getmail維護了一個網頁. 5.4. Multi-RCPT 與 Single RCPT 傳送方式的比較 假如你是一個MTA, 你的一個用戶發送一封郵件給 hostx.example.com上的三個人. 那麽你有以下幾種方式可以達成目標. 你可以建立一個連接到hostx主機, 發送郵件的一個拷貝給第一個用戶, 發送一個拷貝給第二個用戶, 發送一個拷貝給第三個用戶, 然後關閉連接. 你可以開始三個進程, 每一個都建立一個和hostx的SMTP連接, 給每個用戶發送一份郵件的副本, 然後關閉連接. 你可以建立一個SMTP連接, 然後發送一個標志著傳送給所有三個用戶的副本, 然後關閉連接. 第一個方法明顯劣于第三個. 甚至郵件很小的情況下, 整個郵件傳送也需要最長的時間. 如果郵件很大, 那麽將會使用很長時間並且浪費大量網絡帶寬. 所以, 劃掉第一個. 第二個和第三個方法有點意思. 第三個方法僅僅建立一個連接到hostx, 而且只發送一個郵件的副本, 這個方式取得了最有效的帶寬利用率. 第二種方式建立多個連接, 並且傳送了郵件的多個副本, 這是非常浪費帶寬的, 不過由于SMTP協議的現狀, 這個方式可以得到更少的來回往返延遲, 從而比第三中方式更快. 而且比第三種方式更簡單, 進而MTA可以被編寫使用一個更直接了當的方式來傳送郵件. 最後, 由于每個接收者接收到屬于他自己的哪一份郵件副本, 這樣才有可能讓MTA實現VERPs(參見下一節) qmail 總是使用第二種方式(single RCPT). 而且沒有補丁讓qmail實現第三種方式(multiple RCPT)的傳送-- 因爲那將是一個非常大的修補工作. 雖然有些病態的案例表明第二種方式比第三種方式更慢, 整體上, 系統的簡單性和VERP取得的優勢比這個更爲重要. Single RCPT 傳送方式比multiple RCPT方式的確使用了更多的帶寬, 不過差別常常是被誇大了的. 絕大多數郵件至多只有兩個接收者, 而他們通常是本別兩個主機上的用戶, 對于這樣的情形, multi-RCPT沒有任何優勢. 甚至情況特殊些, 在一個郵件列表服務器上, 相對來說, multi-RCPT看起來會有很大幫助可是潛在的增益是非常微小的, 因爲SMTP利用的往往只是帶寬的很細碎的份額, 在絕大多數連接上, HTTP通常占用了最大的部分. 舉一個例子, 如果你的上行帶寬的10%用于SMTP, 假設你的SMTP帶寬由于使用multiple RCPT被降低了25%, 那麽實際上應用multiple RCPT僅僅讓你的SMTP需求的總帶寬需求降低到了7.5%. 5.5. 關于 VERP一旦一個郵件未能被傳送, MTA的反應應該是按照信封上的返回路徑(envelope return path, ERP)發送一個反彈郵件. 反彈郵件應該包括接收者的地址, 未能發送的原因, 以及故障是暫時的還是永久的信息. 盡管某些MTA做的不是正確的事情, 他們發送反彈郵件給郵件頭的From區域標志的地址, 或者反彈郵件幹脆不能識別接收者. 對于大多數用戶到用戶的郵件, 這種問題沒什麽大不了. 人們可以按照反彈定時和郵件內容來處理. 可是對于郵件列表, 糟糕的反彈將會嚴重的多. 訂閱者移動, 轉發郵件到他們的新地址, 如果新地址發生傳送問題, 並且反彈郵件只包含了新地址, 那就無法知道到底是哪個訂戶的郵件被反彈了. Dan Bernstein 爲這個問題提出一個解決方案稱爲VERP(Variable Envelope Return Path). 使用VERP, 發送給每個郵件列表訂戶的郵件都擁有唯一的返回路徑. 這讓反彈控制可以控制查找有問題的訂閱者. 舉一個例子, 一個典型的非VERP郵件列表擁有的返回地址型如listname-owner@domain. 而對于VERP類型的郵件列表, 返回地址型如listname-owner-subscriber=sdomain@ldomain, 這裏訂戶的地址 subscriber@sdomain被嵌入到列表擁有者"owner"和符號"@"之間了. (訂閱者郵件地址的"@"符號被置換成等號"=".) ezmlm郵件列表管理器使用VERP來自動控制反彈. 對于列表暫時的傳送問題造成的某些郵件丟失, 這個管理器也提供讓訂閱者從列表存檔文件中單獨接收的功能. T Russell Nelson 爲qmail下的Majordomo寫了一個反彈控制器, 不過他沒有再繼續維護這個軟件. 可以在這裏http://www.qmail.org/bounceman-0.4.shar 訪問到它. 5.6. 故障處理 5.6.1. 進程一個恰當運行著的, 完整的, 最小化安裝的qmail 應該擁有下面的四個進程. 由用戶qmails 運行的 qmail-send 由用戶qmailq運行的qmail-clean 由用戶qmailr運行的qmail-rspawn 由用戶root運行的qmail-lspawn 取決于你使用的何種UNIX, 下面兩個命令的一個可能列出這些進程, 而且可能還要多一點: ps -ef | grep qmail ps waux | grep qmail 舉個例子: [dave@sparge dave]$ ps waux|grep qmaildave 2222 0.0 0.8 836 348 p4 S 10:25 0:00 grep qmailqmaild 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 qmailqmailq 368 0.0 0.7 736 292 ? S N 12:43 0:00 qmail-cleanqmailr 367 0.0 0.6 732 272 ? S N 12:43 0:00 qmail-rspawnqmails 350 0.0 0.8 776 336 ? S N 12:43 0:00 qmail-sendroot 340 0.0 0.6 724 252 ? S N 12:43 0:00 /usr/local/sbin/supervise /var/supervise/qmail-send /var/qmail/rcroot 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.smtproot 366 0.0 0.7 736 276 ? S N 12:43 0:00 qmail-lspawn ./Mailbox[dave@sparge dave]$ 如果你在supervise下運行qmail或qmail-smtpd, 像上面的例子那樣, 你應該能看到上面那些進程. 如果你在tcpserver下運行qmail-smtpd, 你將看到一個父tcpserver進程加上每個活動的SMTP訪問建立的連接的tcpserver進程. 如果你使用splogger (或者 multilog 或者 cyclog) 來控制日志, 你應該還有一個 splogger(或者 multilog 或者 cyclog) 進程由用戶qmaill運行著. 同時, 如果qmail忙于傳送本地和遠程郵件, 你將會看到最高上限爲 concurrencylocal 個數的qmail-local進程, 或者最高上限爲 concurrencyremote 個數的qmail-remote 進程. 5.6.2. 日志 5.6.2.1. multilogmultilog, 是daemontools 軟件包內的一部分, 功能是將日志記錄到指定文件夾內一系列文件上. 日志文件夾將在multilog命令行上指定, 所以你可以檢查你的qmail運行腳本來確定文件夾的位置. log文件夾內文件數量以及每個log文件的最大長度, 是由multilog的選項決定的. log日志文件名是以文件開始記錄時刻的TAI (Temps Atomique International) 時間戳命名的. daemontools裏面的另外一個命令 tai64nlocal , 可以轉換TAI時間戳爲易讀的本地時間戳. 一個標准的multilog日志條目看起來是下面這樣的: @4000000038c3eeb104a6ecf4 delivery 153: success: did_1+0+0/ "@4000000038c3eeb104a6ecf4"是TAI時間戳, 爲可選部分, 不過推薦在日志條目裏面加上這個段, "delivery 153: success: did_1+0+0/" 是日志消息本身. 5.6.2.2. sploggersplogger 使用syslog 日志記錄系統給消息打時間戳, 然後將消息送往syslog後台服務程序. Syslog的配置文件爲 /etc/syslog.conf. 發送給syslog的消息擁有功能和優先級屬性. syslog按照定義在/etc/syslog.conf裏面的條目過濾消息, 並依據功能和優先級將消息發往以下目標: log日志文件, 遠程日志主機, 或者控制台. splogger 默認情況下將記錄到mail 功能下面, 所以用grep命令在syslog.conf文件裏面查找"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.3. 日志消息下面是一段從本地系統發送一個郵件到遠程系統的日志片斷: 1 @4000000038c3eeb027f41c7c new msg 938692 @4000000038c3eeb027f6b0a4 info msg 93869: bytes 2343 from qp 18695 uid 494913 @4000000038c3eeb02877ee94 starting delivery 2392: msg 93869 to remote lwq@w3.to4 @4000000038c3eeb0287b55ac status: local 0/10 remote 1/205 @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/207 @4000000038c3eeb104a6ecf4 end msg 93869 第 1 行指出qmail接收到一條新郵件, 郵件的隊列ID是93869. 隊列ID是 /var/qmail/queue/mess/NN/ 包含這個郵件的隊列文件的 i-node 節點值. 隊列ID將在這個消息存在于隊列的過程中保持全局唯一. 第 2 行表明郵件來自 dave@sill.org, 並且大小爲2343字節. 第 3 行表明qmail-remote開始傳送這個郵件到lwq@w3.to, 並且爲這個傳送指定了ID 2392. 第 4 行指出 0 個本地傳送和 1 個遠程傳送處于等待狀態., 第 5 行顯示出 ID 2392 這個傳送已經成功完成, 並且返回遠程主機的回應, 這個回應裏面常常包含了遠程郵件管理員對于跟蹤這個傳送的有用信息. 在我們這個例子裏面, "CAA01516"是遠程系統的傳送ID. 第 6 行指出 0 個本地傳送和 0個遠程傳送處于等待狀態. 也就是傳送已經完成了. 第 7 行指出這個消息已經被傳送完畢並且被移出隊列. 這個時候, 隊列ID 93869, 已經可以重用于其他傳送ID了. 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)是幫助郵件列表所有者運行郵件列表的的程序. 它的功能由兩部分組成: 管理訂閱者列表, 還有就是控制對訂閱者的郵件再發. 大多數(全部?)UNIX郵件列表管理器都可以和qmail 合作運行. 5.9.1. ezmlmezmlm 是qmail的作者Dan Bernstein爲qmail編寫的郵件列表管理器. 它依賴于qmail服務器的幾個特點工作, 最顯著的, 就是它使用VERPs 來可靠的處理反彈郵件. ezmlm 在衆多郵件列表管理器(MLM)中顯得有點獨特, 它不是處理傳送到中央MLM地址的命令, 而是將命令附加在列表名字後面. 例如, 發送郵件到"foo-subscribe@list.example.net" 來訂閱 "foo@list.example.net" 的郵件列表, . 關于ezmlm的更多信息, 參見 http://www.ezmlm.org/, 這是ezmlm的非正式web站點. ezmlm-idx的正式站點, 介紹了這個非常棒的add-on插件ezmlm-idx, 它包括了很多有用的特色. 5.9.2. MajordomoMajordomo 是最受歡迎的UNIX MLM之一. 只要作很少的簡單修改就可以使它和qmail很好的合作了. Russ Allbery曾經寫了一個關于qmail和Majordomo的FAQ, 可以在這個位置訪問http://web.archive.org/web/20050308091420/http://www.eyrie.org/~eagle/faqs/mjqmail.html. 5.10. 補丁 Patchesqmail擁有各種各樣的源代碼補丁. 爲了安裝補丁, 下載補丁並且進入qmail源代碼目錄樹, 使用patch 命令施加補丁. cd /usr/local/src/qmail/qmail-1.03 patch -p0 注意: 參考 patch 的 man 幫助頁取得更多信息. 這僅僅是個例子. 你可能需要使用最新版本的GNU patch 來施加補丁, 參見http://www.gnu.org/software/patch/patch.html. 終止 qmail-send 來停止qmail, 或者如果你安裝了 qmailctl 腳本, 那麽這樣: qmailctl stop 然後重新編譯和安裝新的二進制代碼: make setup check 然後重新啓動: qmailctl start 最後測試qmail, 尤其是你打補丁的部分. 注意: 雖然http://www.qmail.org/列出了qmail的大量補丁, 但是他們中的任何一個都沒有得到qmail作者的認可. 這些補丁可能引入qmail原本沒有的安全, 可靠性, 效率以及功能性問題. 絕大多數qmail安裝只是要求某些推薦的補丁. 請不要安裝任何你不是明確需要的補丁. 5.10.1. 推薦的補丁 qmail.org 有一個"Recommended Patches"小節 http://qmail.org/top.html#patches . 這些補丁用于幾個已知的qmail的bug. 注意: 所有推薦補丁都已經包括在 netqmail發行版中. 請參考http://www.qmail.org/netqmail/. 5.10.1.1. errno.h 補丁這個補丁修複 errno.h 頭文件缺失問題. 參考http://article.gmane.org/gmane.mail.qmail.general/13960 查看這個補丁, 以及的詳細的解釋. Mate Wierdl 爲所有 Dan Bernstein 的軟件, 其中包括 qmail, daemontools 和 ucspi-tcp 編寫了關于 errno.h 的補丁. 可以在這裏找到這些補丁文件: http://www.thedjbway.org/patches/djb_errno_patches.tgz. 5.10.1.2. qmail-local TAB 補丁這個補丁修補處理.qmail文件內對TAB 字符開頭命令解析的小bug. 參見http://www.ornl.gov/lists/mailing-lists/qmail/2000/10/msg00696.html 5.10.1.3. IP 0.0.0.0 補丁這個補丁將使qmail把 0.0.0.0 這個IP地址作爲本地主機處理. http://www.suspectclass.com/~sgifford/qmail/qmail-0.0.0.0.patch . 5.10.2. DNS在曆史上, DNS 的回答被限制在512字節以內. 一些大型站點返回的 MX 記錄要長于這個限度. 這樣qmail和其他很多程序都會遇到這個DNS返回查詢記錄過長的問題. 有兩種種方式來修補qmail, 其中任何一個都夠用了. 5.10.2.1. Christopher K. Davis 的補丁程序, http://www.ckdhr.com/ckd/qmail-103.patchChuck Foster 寫了一個補丁修正, 可以配合任何一種DNS 解析庫工作, 無論多老的庫, 這個補丁使用一個保護字節來避免"置于緩沖區中的字節數"這個庫bug. 通過一次性重分配緩沖區爲65536大小, 而不是申請分配恰好合適的緩沖區大小來解決問題, 所以它可能要比Chuck 的補丁內存使用效率低. (盡管如此, 這個補丁也只是當返回大小大于PACKETSZ 情況下才進行緩沖區重分配, PACKETSZ 的默認大小爲512字節). 緩沖區重分配後, 將強制一次TCP查詢, 而不是要求DNS 解析庫去作解析(這樣避免了qmail 和名字服務器之間的額外來回交互過程, 盡管qmail 和名字服務器可能都在一個服務器上, 或者都在本地網絡內, 這些來回交互過程並不是什麽問題). 5.10.2.2. 提高包緩存長度到65536 如果DNS反饋設置有切斷位, 在近來的BIND解析庫下工作時, 解析器編碼爲自動進行TCP查詢. 雖然取決于你的系統如何管理系統內存頁的情況下, 內存的最大浪費成爲潛在存在的可能性, 不過這卻是最簡單的修補. 作這個修補, 只需要替換 dns.c 文件內的PACKETSZ爲 65536, 然後重新編譯安裝qmail就行了. 5.10.2.3. 從djbdns 運行 dnscachednscache 顧名思義, 是一個DNS的緩存服務器. 它知道如何掌握很長的DNS 返回記錄, 去掉不必要的查詢信息, 所以通過它返回的結果通常比直接查詢更小, 並且通常可以爲所有服務提高DNS查詢性能. 由于它不用給qmail打補丁, 這是一個可以接受的方式, 遺憾的是, 它並不能完全解決問題, 通過它返回可能對qmail 還是過大. 參見 相關軟件包 下的 djbdns 節取得更多信息. 5.10.3. qmail-ldap這個補丁, 由 Andre Oppermann等人編寫, 實現了qmail的Lightweight Directory Access Protocol (LDAP)支持. LDAP像一個網絡電話簿. 使用 qmail-ldap, 它可以使一個POP服務器支持數千計的衆多用戶. 參見http://www.nrg4u.com/. 5.11. QMTPQMTP 是 Quick Mail Transfer Protocol 的縮寫, 由Dan Bernstein設計的用來替代SMTP的協議. 這個協議定義在 http://cr.yp.to/proto/qmtp.txt . QMTP比SMTP更簡單, 更快速以及兼容SMTP. qmail包含一個QMTP服務器, qmail-qmtpd, 它運行起來非常類似于 qmail-smtpd. QMTP通常使用端口209. qmail並不包括QMTP的客戶端, 不過 serialmail 軟件包包括一個客戶端. maildirqmtp 命令接收maildir格式郵箱並以QMTP協議傳送郵箱內的郵件到指定的QMTP服務器. QMTP不是一個drop-in方式的SMTP的替代品, 在因特網上的使用也不是很普遍. Russ Nelson 爲qmail-remote寫了一個支持QMTP的補丁. 可以在 這裏 http://www.qmail.org/qmail-1.03-qmtpc.patch 取得這個補丁. 他也編寫了一個tarball安裝方式的程序, 可以展開到 /service 目錄下進行QMTP服務. 可以在這裏http://www.qmail.org/qmtpd-service.tar.gz 取得這個tarball包. 5.12. 在SMTP對話過程中拒絕無效接收者當一個遠端服務器連接到 qmail-smtpd服務並提交了一個郵件時, qmail-smtpd服務會依據 control或 rcpthosts的內容來檢查收件人的地址. 如果接受者的服務器名或域名(就是郵件地址在@符號後面的部分)在這兩個列表內存在,qmail-smtpd 會接受這封郵件, 並將郵件放置于發送隊列內, qmail-send 將開始嘗試傳送郵件. 如果通過名字在本地接收者內查找不到接收用戶或者別名, 即本地接收者無效, qmail-send 會生成一個反彈郵件並將郵件傳送到回複地址, 這個回複地址在SMTP對話過程中確定. 在一個秩序並禮貌的世界, 任何策略或計謀都是有好的結果的. 但很不幸, 除此之外, 還有很多行爲惡劣的垃圾郵件制造者. 一些垃圾制造者試圖把郵件發送到你服務器上"可能"存在的用戶郵箱, 他們使用常用名字字典或數據庫, 甚至他們窮舉所有可能的字母組合來構成一本名字字典, 向整個字典或數據庫內所有"可能"存在的人發送垃圾郵件. 在qmail 系統內, 這種垃圾郵件行爲會造成巨大的系統負擔, 郵件隊列內充斥垃圾, 並且耽擱了合理合法郵件的傳送. 一些MTA 在SMTP 對話過程中對本地郵件接收者進行確認並對不匹配的郵件予以拒絕, 這免去了郵件服務器大量的不必要工作, 但也帶來了負面影響, 使用這種校驗方式, 垃圾郵件制造者可以迅速確定那些郵件地址在你的服務器上是存在的. 有幾種方式可以在qmail 上實現在SMTP 對話過程中校驗用戶名是否存在. Eben Pratt 建立了一個列表, 在這裏http://netdevice.com/qmail/rcptck/ . 絕大多數這種解決方案都要求提供一個有效或無效接收者的數據庫或者相應模式. 其中一個不使用數據庫的解決方式是Paul Jarc 的qmail-realrcptto, 可以在這裏找到它http://code.dogmap.org./qmail/. 5.13. TLS and STARTTLS關于在qmail 上使用傳輸層加密(TLS), Scott Gifford 寫了一個非常詳細徹底的一步一步介紹文檔, 包括在SMTP 上使用STARTTLS 和在POP3D 上使用STLS, 專門用于netqmail , 可以在這裏訪問這個文檔: http://www.suspectclass.com/~sgifford/ucspi-tls/ucspi-tls-qmail-howto.html. 附錄 A. 致謝 首先, 感謝Dan Bernstein 編寫了這樣一個強大而優雅的系統. 經過近十年的使用, qmail依然給我深刻的印象. 我也感謝那些qmail 郵件列表的成員. 作爲最有幫助的, 最有耐心的, 以及最知識淵博和有趣的撰稿人之一, Russell Nelson 應該被特別提及, 他對于qmail 社區的貢獻僅次于DJB. 其次是Charles Cazabon, 他緊接著Russ 之後, Charles 是最近郵件列表的主要撰稿者, 比其他人更多的給出正確答案. Charles 還寫了兩個非常有用的實用程序--getmail 和pymsgauth, 同時還是The qmail Handbook 的技術編輯, 他的文章被認爲是此書成功的重要原因, 因此他也得到了不少獎賞和贊譽. 感謝每一個評論或者對這個文檔作出貢獻的人, 他們包括: Vince Vielhaber Chris Green Christopher K. Davis Scott Schwartz Fred Lindberg Russell P. Sutherland Alex Miller Tim Hunter Frank D. Cringle Mahlon Smith Rogerio Brito Tony Hansmann Matthias Andree Tillman Hodgson Stefan Witzel Scott Gifford 有太多可被提及的其他的人了.... 特殊感謝Henning Brauer捐贈了lifewithqmail.org 域名, 並維護服務器! Life with qmail 使用Simple Document Format (SDF) 編寫, SDF是一個非常酷的基于Perl 的標記語言, 可以産生HTML, 純文本, PostScript, POD以及其他格式. 這個工具使工作變得特別容易, 參見http://search.cpan.org/author/IANC/sdf-2.001/ 查找關于這個工具的更多信息. 附錄 B. 相關軟件包介紹 B.1. dot-forwardSendmail 使用.forward(發音 dot forward)文件來允許用戶控制傳輸他們收到的郵件. qmail使用一種類似的機制: .qmail文件. dot-forward軟件包給予qmail使用.forward文件的能力. 那些使用Sendmail和其他使用.forward控制文件的系統可以利用dot-forward程序來避免使用.forward文件的等效物.qmail文件, 在轉移到qmail 品太過程中不用將.forward 文件轉換爲.qmail 文件, 或者簡單地對于用戶來說, 在使用qmail平台時盡量少的改變用戶原來使用Sendmail時看得到的東西., 比如直接使用. forward文件的習慣. dot-forward程序是一個小軟件包, 很容易安裝配置. 源代碼可以在http://cr.yp.to/software/dot-forward-0.71.tar.gz.這裏取得. dot-forward 由Dan Bernstein編寫, 他爲這個軟件維護了一個web頁面http://cr.yp.to/dot-forward.html. B.2. fastforwardfastforward是另一個Sendmail兼容插件. Sendmail使用保存在一個單一文件內的中心別名數據庫, 通常是 /etc/aliases. qmail使用/var/qmail/alias下的一系列文件, 一個別名一個文件. 如果你要從Sendmail遷移到qmail, dot-qmail文件還不想轉換Sendmail格式的的別名文件, 那麽fastforward賦予qmail按照原樣使用Sendmail別名文件的能力. 源代碼可以在 ftp://cr.yp.to/software/fastforward-0.51.tar.gz 這裏取得. fastforward 由Dan Bernstein 編寫, 他在 http://cr.yp.to/fastforward.html 這裏維護了一個web頁面. B.3. ucspi-tcpqmail的SMTP服務器並不是按照一個獨立的後台服務程序運行的, 必須依靠例如 inetd, xinetd 或者 tcpserver 這些助手程序運行. 當這些助手程序接受一個到達25端口, SMTP端口, 的TCP連接之後, 將執行一個qmail-smtpd的副本. inetd 是標准網絡服務器"super-server". 可以通過配置/etc/inetd.conf 來運行qmail-smtpd, 不過推薦的工具是tcpserver, 它是ucspi-tcp軟件包的一部分. ucspi-tcp是UNIX Client-Server Program Interface for TCP的縮寫, 發音是 ooks-pie tee see pee. tcpserver 優于 inetd的幾條原因: tcpserver 允許限制並行訪問服務的數量. inetd使用連接率限制機制在"太忙"情況下阻斷服務. tcpserver 可以被配置爲拒絕某些主機連接或者認可並標志本地主機, 使qmail-smtpd 可以分別對待. tcpserver 是唯一的qmail 作者認可的服務器. 源代碼可以在這裏ftp://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz取得. Gerrit Pape 爲ucspi-tcp作爲 man 幫助頁分發的文檔可以在這裏http://smarden.org/pape/djb/ 訪問到. ucspi-tcp由Dan Bernstein編寫, 他在這裏http://cr.yp.to/ucspi-tcp.html維護了一個web頁. B.4. daemontoolsdaemontools軟件包包含了一系列控制和監視服務的實用工具. 不強制使用, 但高度推薦, 特別是對于比較繁忙的系統. 它包括: superivse, 監視服務並在服務停止後重新啓動之. svc, 用來要求supervise 停止, 暫停, 或者重啓動服務器. multilog, 維護服務的日志, 可以自動回轉記錄以保持低于配置大小. seruidgid, 使用普通用戶的UID和GID爲超級用戶運行程序. daemontools的源碼可以在這裏http://cr.yp.to/daemontools/daemontools-0.76.tar.gz取得. Gerrit Pape 爲daemontools作爲 man 幫助頁制作的發行文檔可以在這裏http://smarden.org/pape/djb/訪問到. daemontools 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/daemontools.html 維護了一個web頁面. B.5. qmailanalogqmailanalog處理qmail的日志文件並且生成一系列的報告. 報告指示出系統正在工作的類型和工作量. 如果你需要有多少郵件被發送和接收的統計, 以及他們有多大, 他們被處理的有多快, qmailanalog都能顯示出來. 作爲一個意外收獲, matchup 程序合並qmail 的每個郵件投遞的多個日志行爲一行 -- 有點類似于Sendmail的日志. qmailanalog的源代碼可以在這裏http://cr.yp.to/software/qmailanalog-0.70.tar.gz取得. qmailanalog 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/qmailanalog.html維護了一個web頁面. 注意: qmailanalog 依賴于由accustamp 使用的小數秒格式的日志條目時間戳. 爲了使用它和multilog生成的TAI64N格式的日志, 你必須將他們轉換成舊格式. 一個完成這個轉換工作的程序可以在這裏http://www.qmail.org/tai64nfrac取得. B.6. rblsmtpd如果你從未被垃圾郵件騷擾, 可以說你太幸運了. 絕大多數的電子郵件用戶都太熟悉Unsolicited Bulk E-mail (UBE)了, UBE也被稱爲"spam". 絕大多數垃圾郵件都是色情站點的廣告, 郵件鎖鏈或其他詭計. 回到過去的的舊時光, 直到1998年左右, 絕大多數因特網上的MTA都是開放轉信的, 也就是說, 他們將會接收任何人給人和人的郵件, 甚至沒有發信人也沒有本地收信人的郵件. 垃圾郵件發送者利用這些開放轉信服務, 盡可能找到他們能找的服務器傳送他們的垃圾郵件. 這樣就隱藏了他們的蹤迹, 栽贓給那些"無罪的"開放轉信站點, (通過浪費開放轉信站點的資源) 爲垃圾郵件制造者節省了大量的CPU和帶寬. 從那個時期開始, 這樣的開放轉信的站點被認爲是非常糟糕的, 幾個反垃圾郵件義務組織創造了一個機制來識別開放轉信和其他垃圾郵件的通常來源, 這樣他們就能夠避免來自垃圾郵件商的SMTP連接. rblsmtpd 是一個 RBL SMTP後台服務程序. 它位于tcpserver和qmail-smtpd之間, 並且拒絕系統認定的那些列表裏面系統的連接. 舉一個例子, 在tcpserver下運行rblsmtpd, 試試下面這樣的寫法: #!/bin/shQMAILDUID=`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 -R -H -l 0 -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \ -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /usr/local/bin/rblsmtpd\ -r relays.ordb.org /var/qmail/bin/qmail-smtpd 2%26amp;1 rblsmtpd 以前是作爲一個分立的軟件包, 現在被捆綁在ucspi-tcp 裏面. rblsmtpd 由Dan Bernstein 編寫, 他在這裏http://cr.yp.to/ucspi-tcp/rblsmtpd.html 維護了一個web頁面. RBL 硬編碼不再free 之後, Charles Cazabon 制作了一個補丁用來移去默認的RBL 硬編碼, 替換爲爲rblsmtpd 程序, 這個程序可以在這裏訪問到 http://pyropus.ca/software/misc/rblsmtpd-nodefaultrbl.patch. B.7. serialmailqmail 是爲高速連接, 不間斷運行設計的. serialmail 這個工具集讓qmail更好的適用于斷斷續續的, 低速的連接. 在這樣的系統上使用serialmail, qmail被配置爲傳送所有遠程郵件到一個單獨的maildir文件夾. 一旦網絡連通, serialmail的maildirsmtp 命令將用來上傳這個maildir到ISP的郵件中心. 如果ISP支持QMTP(參看 高級話題 下的 QMTP), maildirqmtp也能用得上. serialmail 可以被用于ISP方面, 用來實現 AutoTURN, 這是一個 由客戶端發起的SMTP 連接, 導致服務器開始反向連接到客戶端 , 然後發送服務器端的郵件隊列給客戶端的過程. 這個和ETRN SMTP機制很相似. serialmail的源代碼可以在這裏http://cr.yp.to/software/serialmail-0.75.tar.gz 得到. serialmail 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/serialmail.html維護了一個web頁面. B.8. mess822mess822 是一個處理 RFC822兼容郵件的庫和一系列應用程序. 這些程序包括: ofmipd: 一個後台服務程序,從客戶端接收郵件並基于數據庫記錄改寫From郵件頭部分. new-inject: 一個qmail-inject的替代程序, 支持用戶控制的主機名改寫. iftocc: 一個.qmail應用程序, 用來檢查是否郵件被發送到指定地址. 822header, 822field, 822date, 和 822received: 從郵件中摘錄信息. 822print: 用來打印郵件. mess822的源代碼可以在這裏 http://cr.yp.to/software/mess822-0.58.tar.gz取得. mess822 由Dan Bernstein編寫, 他在這裏http://cr.yp.to/mess822.html維護了一個web頁面. B.9. ezmlmezmlm 是一個爲qmail設計的高效, 易用的郵件列表管理器(MLM). 如果你熟悉 LISTSERV 或者 Majordomo, 你會知道郵件列表管理器能作什麽. 更多在qmail下的關于郵件列表的信息可以在高級話題 下面的 郵件列表管理器 找到. ezmlm的源代碼可以在http://cr.yp.to/software/ezmlm-0.53.tar.gz這裏取得. ezmlm 由 Dan Bernstein編寫, 他在這裏http://cr.yp.to/ezmlm.html維護著一個web頁面. Fred Lindberg 和 Fred B. Ringel 爲ezmlm開發了一個擴展, 叫做ezmlm-idx, 後者增加了大量的有用特色, 我特別推薦使用它. 可以在 http://www.ezmlm.org/ 這裏訪問 ezmlm-idx, 這個頁面現在有Bruce Guenter 維護. B.10. safecatsafecat 將文件可靠的寫入maildir 郵箱中. 在使用procmail 處方時候有個特別的用處, 用來將郵件填入 procmail. 舉一個例子, 下面的處方將所有Maildir中的郵件存檔. :0w|safecat Maildir/tmp Maildir/new safecat 由 Len Budney 編寫, 他在這裏http://jeenyus.net/~budney/linux/software/safecat.html.爲safecat 維護了一個web頁面. B.11. djbdnsdjbdns 是qmail作者編寫的DNS服務器. 它包括 tinydns, 一個DNS內容服務器, 和 dnscache, 這是一個 DNS 緩沖服務器. djbdns的正式頁面在 http://cr.yp.to/djbdns.html. B.12. maildropmaildrop是一個和procmail類似的郵件過濾器. maildrop 由 Sam Varshavchik 編寫, 他在這裏http://www.courier-mta.org/maildrop/.爲maildrop維護了一個web頁面. B.13. syncdirsyncdir 是一個小型庫, 可使 link() 系統調用同步. 在一個不能同步執行 link() 的文件系統上運行qmail隊列時, syncdir是必要的. 例如 Linus的 ext2fs, Reiserfs, SGI的 XFS以及BSD的使用softupdates的FFS系統. syncdir 由 Bruce Guenter編寫, 可以在這個web頁面http://untroubled.org/syncdir/訪問. 安裝指導在這個位置http://www.ornl.gov/lists/mailing-lists/qmail/2001/12/msg00949.html. 附錄 C. 因特網郵件工作原理 C.1. 郵件如何從A點到達B點 當一個主機上的用戶想要發送一個郵件給另一個主機上的用戶時, 許多事情發生了, 這個場景後面的東西很多是不必要知道的那麽確切的. 假設一個用戶 Alice, alice@alpha.example.com 想要發送一個郵件給 Bob, bob@beta.example.com, 下面是發送接收過程: 1. Alice 用她的郵件用戶代理(MUA)編寫郵件, 比如使用 mutt 或者 pine. 她在 To 這一欄指定接收者, Subject 這一欄填寫郵件主題, 加上郵件本身的文本部分. 整個郵件看起來是下面這樣的: To: bob@beta Subject: lunch How about pizza? 2. 當她覺得這封郵件已經滿意之後, 她指示 MUA 發送郵件. 3. 這時候, MUA 會加上附加的郵件頭部分, 比如日期 Date 和郵件ID(Message-Id) 並且修改Alice輸入的值(例如, 將 bob@beta 替換爲"Bob ") 下一步, MUA 將郵件注入郵件系統. 有兩種方式進行注入: MUA 運行一個由郵件系統提供的爲注入郵件爲目的的程序; 或者使用SMTP協議和本地或者遠程郵件服務器建立連接, 在本例內, 我們假定 MUA 使用本地注入程序將郵件傳送給 MTA, 對于不同的MTA, 注入細節都是不同的, 不過對于UNIX系統, 使用sendmail 程序注入已經成了事實上的標准. 使用這種方式, MUA 可以將郵件頭和郵件主體放置在一個文件內, 由空行分隔, 然後傳遞這個文件到 sendmail 程序. 4. 如果注入成功--郵件句法正確, 並且 sendmail 調用適當--那麽現在郵件由 MTA 負責. 不同的 MTA 細節是完全不同的, 通常MTA首先檢查郵件頭決定郵件將發往何處. 然後建立一個到主機beta的SMTP連接, 轉發郵件給 beta 系統上的MTA. SMTP對話要求郵件被分成兩部分發送: 第一部分是信封, 這個部分確定了接收者的地址(bob@beta.example.com)和返回地址(alice@alpha.example.com), 以及第二部分郵件本身, 包括郵件頭和郵件主體. 5. 如果beta主機的MTA拒絕這個郵件, 可能原因是在beta系統上沒有這個bob用戶, 在alpha 上的MTA發送一個反彈郵件給返回地址, 也就是 alice@alpha, 通知她郵件發送出現了問題. 6. 如果 beta主機上的 MTA接收了郵件, 它查看接收者地址, 決定是發送給本地local 還是遠程 remote系統的郵件. 這個例子裏面, 接收者是本地用戶, 然後MTA或者傳送郵件給 mail delivery agent (MDA), 比如 /bin/mail或者傳送給 procmail. 7. 如果傳輸失敗了, 可能是Bob的郵箱超過了使用限額, beta 主機上的 MTA 將發送一個反彈信息給信封上的返回地址, 即 alice@alpha. 8. 如果傳輸成功, 郵件將在Bob的郵箱中等待, 直到他使用MUA來閱讀和顯示郵件. C.2. 其他資料 C.2. More information關于因特網郵件工作方式的更多信息, 請查看下面的信息: Internet mail, 由qmail作者撰寫 http://cr.yp.to/im.html . SMTP, 由qmail作者撰寫 http://cr.yp.to/smtp.html Internet mail message header format, 由qmail作者撰寫 http://cr.yp.to/immhf.html C.2.1. 因特網的RFC文檔 Internet Requests for Comment, 縮寫爲Internet RFC是關于因特網標准的正式文檔. 大部分Internet RFC 文檔已經度過了評論階段, 進入穩定狀態, 他們定義了包括諸如 TCP, FTP, Telnet和各種各樣得郵件標准和協議. RFC 821, Simple Mail Transfer Protocol (obsoleted by RFC 2821) http://www.ietf.org/rfc/rfc0821.txt RFC 822, Standard for the Format of ARPA Internet Text Messages (obsoleted by RFC 2822) http://www.ietf.org/rfc/rfc0822.txt RFC 931, Authentication Server. http://www.ietf.org/rfc/rfc0931.txt RFC 974, Mail Routing and the Domain System. http://www.ietf.org/rfc/rfc0974.txt RFC 1123, Requirements for Internet Hosts -- Application and Support. http://www.ietf.org/rfc/rfc1123.txt RFC 1413, Identification Protocol. http://www.ietf.org/rfc/rfc1413.txt RFC 1423, Privacy Enhancement for Internet Electronic Mail: Part III: Algorithms, Modes, and Identifiers. http://www.ietf.org/rfc/rfc1423.txt RFC 1651, SMTP Service Extensions. http://www.ietf.org/rfc/rfc1651.txt RFC 1652, SMTP Service Extension for 8bit-MIMEtransport. http://www.ietf.org/rfc/rfc1652.txt RFC 1806, Content disposition. header. http://www.ietf.org/rfc/rfc1806.txt RFC 1854, SMTP Service Extension for Command Pipelining. http://www.ietf.org/rfc/rfc1854.txt RFC 1891, SMTP Service Extension for Delivery Status Notifications. http://www.ietf.org/rfc/rfc1891.txt RFC 1892, The Multipart/Report Content Type for the Reporting of Mail System Administrative Messages. http://www.ietf.org/rfc/rfc1892.txt RFC 1893, Enhanced mail system status codes. http://www.ietf.org/rfc/rfc1893.txt RFC 1894, An Extensible Message Format for Delivery Status Notifications. http://www.ietf.org/rfc/rfc1894.txt RFC 1939, Post Office Protocol - Version 3. http://www.ietf.org/rfc/rfc1939.txt RFC 1985, SMTP Service Extension for Remote Message Queue Starting (ETRN). http://www.ietf.org/rfc/rfc1985.txt RFC 1991, PGP Message Exchange Formats. http://www.ietf.org/rfc/rfc1991.txt RFC 2015, MIME Security with Pretty Good Privacy. (PGP). http://www.ietf.org/rfc/rfc2015.txt RFC 2045, MIME Internet message bodies. http://www.ietf.org/rfc/rfc2045.txt RFC 2046, MIME Media Types. http://www.ietf.org/rfc/rfc2046.txt RFC 2047, MIME Headers. http://www.ietf.org/rfc/rfc2047.txt RFC 2048, MIME Registration Procedures. http://www.ietf.org/rfc/rfc2048.txt RFC 2049, MIME Conformance Criteria. http://www.ietf.org/rfc/rfc2049.txt RFC 2142, Mailbox names for common services. http://www.ietf.org/rfc/rfc2142.txt RFC 2183, Content Disposition header. http://www.ietf.org/rfc/rfc2183.txt RFC 2821, Simple Mail Transfer Protocol. http://www.ietf.org/rfc/rfc2821.txt RFC 2822, Internet Message Format http://www.ietf.org/rfc/rfc2822.txt 一個綜合性的郵件相關RFC列表可以在Internet Mail Consortium的web網站上找到 http://www.imc.org/mail-standards.html. 附錄 D. 體系結構 D.1. 模塊化系統結構 因特網MTA可以完成多種任務. 早期如 Sendmail和 smail的設計是整體式的, 換句話說就是他們是一個大而複雜的程序, 其中一部分是SMTP服務器, 另一部分是SMTP客戶端, 另外的是本地郵件注入, 還有管理郵件隊列的部分,等等. qmail是模塊化的, 每個功能都是由單獨的程序執行的, 結果程序更小, 更簡單, 而且更不容易出現功能和安全方面的問題. 爲了進一步增強qmail的安全性, qmail模塊以不同的權限模式運行, 模塊之間互不"信任", 他們並不以爲其他模塊總是按照他們假定的方式去運行. 這些是qmail的核心模塊: 模塊 功能 qmail-smtpd 接收/拒收通過SMTP傳遞的郵件 qmail-inject 本地郵件注入 qmail-rspawn/qmail-remote 控制遠程傳輸 qmail-lspawn/qmail-local 控制本地傳輸 qmail-send 處理隊列 qmail-clean 清除隊列 模塊化也有一些不利因素, 整體式的MTA, 模塊之間的相互作用定義良好, 而且模塊之間只是交換最小的必要信息. 這是個大好事, 但模塊化方式使處理某些事情變的困難起來. 舉個例子, 爲了debug目的, 運行sendmail 並使用"-v"選項, 使 Sendmail 打印它的活動跟蹤消息到標准輸出, 由于所有的包括郵件注入, 隊列控制, 別名處理, .forward文件處理, 以及遠程SMTP轉發郵件等等都是由一個 sendmail 二進制程序控制, 那麽可以很容易的跟蹤整個郵件傳送過程直到郵件被送抵目的地. 這樣的等價物在qmail裏面是不存在的, 如果在qmail上執行這樣的"debug"過程, 需要實質性的改變源碼以及在模塊到模塊之間的過程調試, 這增加了的很大複雜性. D.2. 文件結構 /var/qmail 是qmail的文件結構的根. 在qmail 編譯安裝的時候可以選擇改變這個目錄的位置, 不過最好還是不作改動的安裝到默認位置, 這樣其他的管理員就知道到哪裏能找到需要的東西. 如果你真的想重新定位部分或者全部的qmail 目錄樹, 最好的辦法是使用符號連接方式. 詳細信息請參看創建目錄 小節中的細目. qmail 根目錄下面的一級子目錄: 目錄 內容 alias 系統級別名定義的.qmail文件 bin 二進制程序和可執行腳本 boot 啓動腳本 control 配置文件 doc 文檔(不包括man 手冊頁) man man 手冊頁 queue 未送出的郵件 users qmail-users 的數據庫文件 D.3. 隊列結構 在qmail的安裝目錄下的 INTERNALS文件更充分的討論了有關的細節信息. 下面是一些更寬泛的隊列結構的概述. 子目錄 內容 bounce 永久傳送錯誤 info* 信封發送者地址 intd 由qmail-queue構建的信封 local* 本地信封接收者地址 lock 文件鎖文件 mess* 郵件文件 pid 由qmail-queue使用用來獲得 i 節點編號 remote* 遠程信封接收者地址 todo 完整的信封 注意: 由"*"標志的目錄包含了一系列分開的由"0", "1",..., (最大數字直到conf-split 減去 1)這些數字命名的子目錄. 這裏conf-split 是由源代碼目錄下的conf-split 文件設定的一個參數, 在編譯源碼時確定, 默認是23. 分離出多個子目錄是爲了在繁忙的服務器上降低單個目錄裏面的文件數量. conf-split 必須是個質數. 在mess組目錄下的文件由它們的 i 節點編號命名. 這就意味著你不能使用標准的UNIX工具, 比如mv, dump/restore還有 tar來手動地移動這些文件. 這裏有兩個用戶提供的實用工具, 可以使用它們來正確地重命名隊列文件. 可以在這裏http://www.qmail.org/ 找到這些工具. 注意: 當qmail正在運行地時候, 修改隊列文件是不安全的. 如果你想更改隊列, 首先停止 qmail, 然後仔細的處理隊列, 然後重啓qmail. D.4. 圖片 在 /var/qmail/doc 下面有一系列的以 PIC 名字開頭的文件. 這些是qmail處理不同情況的文本"圖片". 它們顯示了qmail 在各個模塊之間處理的控制流, 在處理問題和建立複雜系統配置的時候這些圖片將大有裨益. 文件名 處理場景 PIC.local2alias 傳遞給本地別名的本地注入郵件 PIC.local2ext 傳遞給擴展地址的本地注入郵件 PIC.local2local 傳遞給本地用戶的本地注入郵件 PIC.local2rem 傳遞給遠程地址的本地注入郵件 PIC.local2virt 傳遞給本地虛擬域上的一個地址的本地注入郵件 PIC.nullclient 注入到空用戶的郵件 PIC.relaybad 使用本地主機轉信失敗的嘗試 PIC.relaygood 使用本地主機轉信成功的嘗試 PIC.rem2local 通過SMTP爲本地用戶接收郵件 這些圖片也可以在線觀看, 地址如下: http://www.qmail.org/man/index.html如果你想看qmail的"真實"圖片, 那麽請查看Andre Opperman 的 "big qmail picture", 地址在http://www.nrg4u.com/ . 附錄 E. 一些不常見的問題 Infrequently Asked Questions一些沒有資格稱爲常見問題的問題, 可是還是很重要也不容易回答的. E.1. qmail如何處理延期發送的郵件? 每個郵件都有自己的重試時間表, 越長時間不能發送的郵件, 得到qmail重發的機會就越少. 重試時間表是不可更改的. 下面的表格顯示了一個發往遠程接收者的郵件, 如果這封郵件每次都無法發送, 直到這封郵件被反彈, 整個重試時間表如下. 本地傳送郵件使用一個相似的不過頻率更高的時間表. 重試次數 秒 天-小時-分鍾-秒 1 0 0-00:00:00 2 400 0-00:06:40 3 1600 0-00:26:40 4 3600 0-01:00:00 5 6400 0-01:46:40 6 10000 0-02:46:40 7 14400 0-04:00:00 8 19600 0-05:26:40 9 25600 0-07:06:40 10 32400 0-09:00:00 11 40000 0-11:06:40 12 48400 0-13:26:40 13 57600 0-16:00:00 14 67600 0-18:46:40 15 78400 0-21:46:40 16 90000 1-01:00:00 17 102400 1-04:26:40 18 115600 1-08:06:40 19 129600 1-12:00:00 20 144400 1-16:06:40 21 160000 1-20:26:40 22 176400 2-01:00:00 23 193600 2-05:46:40 24 211600 2-10:46:40 25 230400 2-16:00:00 26 250000 2-21:26:40 27 270400 3-03:06:40 28 291600 3-09:00:00 29 313600 3-15:06:40 30 336400 3-21:26:40 31 360000 4-04:00:00 32 384400 4-10:46:40 33 409600 4-17:46:40 34 435600 5-01:00:00 35 462400 5-08:26:40 36 490000 5-16:06:40 37 518400 6-00:00:00 38 547600 6-08:06:40 39 577600 6-16:26:40 40 608400 7-01:00:00 E.2. 爲什麽我無法給一個有很多MX記錄的大站點發送郵件? 如果你得到下面的錯誤提示: deferral: CNAME_lookup_failed_temporarily._(#4.4.3)/ 出問題的原因是qmail不能處理名字服務器返回的大尺寸查詢返回. 安裝 djbdns 來解決這個問題. 參考高級話題下面的 補丁 小節. 不過也有一些人使用這樣的系統但是卻沒有遇到這樣的問題. 本質上說, 這取決于對你本地名字服務器查詢的定時和排序, 名字服務器對于"aol.com"的ANY查詢返回的可能是大于512 字節 的 UDP 數據包, 或者可能不是. "可能不是" 這種情況可能是碰巧查詢的A記錄和MX記錄超時, 而NS記錄沒有超時. 由于 .COM的服務器設置的TTL記錄生命期爲2天, 而AOL的TTL只有1個小時, 這種超時現象會經常在較少的某些比較忙的名字服務器上發生. 比較忙碌的名字服務器更大的可能在所有開放時間把這些記錄放在他們的高速緩存中. 查詢超時而又沒有打補丁的qmail將會試著去查詢CNAME記錄. 一個更好的測試方式是發送郵件到nosuchuser@large-mx.ckdhr.com這裏; 如果郵件被清除出了你的郵件隊列, 並且從ckdhr.com反彈信息給你, 就表明你的MTA可以發送郵件給擁有超過512字節MX列表記錄的主機. (如果使用單一查詢項目, 在一個TTL生命期中, 盡管查詢結果超過了512字節, 可是由于單一查詢不依賴于定時和排序, 這個問題將不會被表現出來) E.3. QUEUE_EXTRA 是什麽? QUEUE_EXTRA是一個編譯時的配置參數, 用它來確定每個郵件傳送的一個附加的接收者. 這個參數首先用于日志記錄. 例如, FAQ裏面描述的如何使用QUEUE_EXTRA來保存所有的進出郵件. 要使用QUEUE_EXTRA, 編輯 extra.h 使用"Trecipient\0"這個格式確定附加的接收者, QUEUE_EXTRA的長度由QUEUE_EXTRALEN確定("\0"算成一個字符). 舉一個例子: #define QUEUE_EXTRA "Tlog\0" #define QUEUE_EXTRALEN 5 關掉正在運行的qmail. 如果你按照本文安裝順序, 運行下面的命令: qmailctl stop 如果你沒有qmailctl腳本, 你可以使用你的啓動/關閉 腳本, 或者給qmail-send發送一個TERM信號. 然後重編譯qmail, 使用命令: make setup check 設置 ~alias/.qmail-log 來定義你想要記錄的內容. 比如, 需要記錄郵件 ID(Message-ID), 那麽就這樣編寫這個文件內容: | awk '/^$/ { exit } /^[mM][eE][sS][sS][aA][gG][eE]-/ { print }' 最後, 重新啓動qmail. 附錄 F. 錯誤訊息 qmail的錯誤訊息以及他們的含義. 參見 RFC 1893 標准文檔內括號內每個錯誤信息的說明部分. 這個附錄是不完整的. 附錄 G. 新手常見問題(Gotchas) 這個"gotchas" 是qmail 新手經常遇到的問題. G.1. qmail 不能給超級用戶發郵件. 爲了防止qmail-local以特權用戶運行命令的可能性, qmail忽略所有UID是0的用戶. 這個文檔請看 qmail-getpw 的 man 手冊頁. 不過這並不意味著qmail不能給root用戶傳送郵件, 只是郵件傳送必須由一個非特權用戶來執行. 典型情況, 爲root用戶創建一個系統別名文件 ~alias/.qmail-root. G.2. qmail不能給沒有主目錄的用戶發郵件. 這是另外一個安全特色, 也是一個新手的很好的練習機會. 看看 qmail-getpw的man 手冊頁面找答案吧. G.3. qmail 不能給名字裏面含有大寫字符的用戶投遞郵件. qmail 將整個"本地部分" -- 郵件地址中"@" 符號左面的所有部分轉換爲小寫. man 手冊頁面裏面沒有提到和表示, 不過代碼裏面有相關表示. 實際上在qmail-getpw 的 man 手冊頁面裏面有關于qmail忽略使用大寫字符名字用戶的文檔. G.4. qmail處理擴展地址的時候, 用冒號(:)替換掉了點(.). 這是qmail另一個安全特色. 是爲了防止擴展地址裏面".."和文件樹沖突, 點(.)置換爲冒號(:)之後, qmail就可以確定使用的每個用戶的所有 .qmail 文件都位于他們的主目錄下面. 這個問題存檔于 dot-qmail 的 man 手冊頁裏面. G.5. qmail 處理擴展地址的時候把大寫字符轉換成了小寫字符. qmail轉換本地地址的整個部分爲小寫字符. 文檔參見 dot-qmail 的 man 手冊頁. G.6. qmail 不使用 /etc/hosts 文件 qmail 從不使用 /etc/hosts 來確定一個主機名關聯的IP地址. 如果你在控制文件內使用主機名而不是IP地址, qmail必須能夠訪問名字服務器. 即使在沒有名字服務器的情況下, 也可以運行qmail, 在control 文件內的主機由 IP 地址確定, IP地址兩邊必須加上方括號([ ]). 例如: [10.1.2.219] 實際上, 方括號不總是必要的--不過用上它們無論如何是恰當的. G.7. qmail 不在日志記錄 SMTP 的活動. 由于很多原因, qmail 對于 SMTP 的連接, 拒信, 非法命令或者有效命令都不記錄, tcpserver可以用來記錄連接, recordio 可以用來記錄整個 SMTP 對話. recordio 是 ucspi-tcp 的一部分. 這個過程存檔在FAQ裏面. 可以在這個地址 http://cr.yp.to/qmail/faq/servers.html#recordio 訪問到它. G.8. qmail 不生成郵件延遲通知. 如果在幾個小時內 Sendmail 無法傳遞郵件, 代表性的是4個小時, 它就會發送一個郵件延遲通知給郵件原始發送者. 這個通知有點像反彈郵件, 不過還不表示郵件傳送永久失敗了. qmail 並不發送這樣的警告. 未發送郵件在隊列內等待發送直到超過 queuelifetime 規定的時間後還未能發送, 才會被反彈給郵件原始發送者. G.9. qmail 由于/var/qmail/queue/lock/trigger 文件丟失、權限設置錯誤或者錯誤的文件屬性設置等原因變的很慢 qmail-queue 和 qmail-send 使用一個稱作 /var/qmail/queue/lock/trigger 的命名管道進行通訊. 如果這個管道陷入混亂, qmail-send 將在大約半個小時內無法注意到新郵件. 最好的方式是正確設置qmail, 在源代碼目錄下使用"make check"命令檢查. 如果不能這樣作, 那麽像下面這樣確定一下: # ls -l /var/qmail/queue/lock/triggerprw--w--w- 1 qmails qmail 0 Jul 5 21:25 /var/qmail/queue/lock/trigger 特別注意那一行開頭的"p"(表明這是一個命名管道), 狀態(特別是任意用戶可寫標志位), 以及用戶和用戶組的歸屬. G.10. DNS 或者 IDENT 查詢使 SMTP 變慢 如果 qmail-smtpd 對連接的反應變慢, 原因可能使由于DNS反相查詢或者 IDENT 查詢. 如果你 使用 tcpserver 運行 qmail-smtpd, 刪除 "-h", "-p", 和 "-r" 選項, 並增加 "-H", "-P", "-R", 和 "-l hostname" 選項. 參看 http://cr.yp.to/ucspi-tcp/tcpserver.html 這裏的 tcpserver 的文檔查看這些選項的說明. G.11. 回車(Carriage Return)和換行(CRLF)不同 qmail-inject 和其他本地注入機制比如 sendmail 不能正確接受DOS風格的回車/換行符. 不像 Sendmail, qmail 要求本地注入郵件使用 Unix 換行(只有 LF). 這和PHP 腳本遇到的問題一樣. G.12. 日志回滾造成qmail-send 和 tcpserver 停止 如果你使用第二節描述的受到監控的日志服務, 日志服務將會因爲以下任何原因停止: 磁盤滿, run 腳本打字錯誤, 日志目錄配置錯誤, 等等. 而管道將被填滿, 導致服務被阻塞, 或者被挂起. 解決這個問題(參看 故障處理)之後, 所有部分都會恢複正常. G.13. qmail-smtpd 不能使地址的本地部分生效 假如 example.com 被列入control/rcpthosts 文件, 發給 anything@example.com 的郵件在SMTP會話期間將會被接受. 如果 anything 不是一個合法用戶或者別名, qmail 將發送一個反彈郵件給信封上的發送者地址. 一些單純的轉信測試假設如果郵件被接受, 那麽一定會被傳送, 這是錯的. 如果某人宣稱你的系統使開放轉信的, 你要查看通過轉信的郵件的副本--包括完整的郵件頭, 特別是 Received 部分--比較一下這些部分和你的日志記錄. 要在qmail 中增加接收者認證, 請參考這小節: 在SMTP對話過程中拒絕無效接收者. G.14. 設置防火牆導致遠程無法連接 SMTP/POP3/IMAP 服務器 如果安裝了 SMTP, POP3 和 IMAP 服務器, 你可以在本機或者本地網絡的主機連接到這些服務器, 但是無法從遠程服務器連接, 很有可能是防火牆的問題. 第一個查看的地方是服務器本身. 舉例, Red Hat Linux, 使用 iptables 在默認配置下是阻塞 SMTP 服務的. 其他包過濾機制比如 ipchains 也會和這個問題有關系. 也有可能是你的因特網服務提供商 (ISP) 阻塞了某些端口來防止垃圾郵件騷擾或者強制執行他們的服務條款(Terms of Service, TOS). 確認不是包過濾的原因以及你沒有違反ISP的服務條款(TOS)之後, 可以聯系你的ISP的技術支持解決問題. G.15. 如果USER 和 LOGNAME 沒有設置的話, qmail-inject 將設置郵件發送方字段(From)爲匿名(anonymous) 如果通過 qmail-inject 發送郵件, 並且郵件不包括 From 字段, qmail-inject 將查找環境變量來得知是那個用戶發送的郵件. 查找變量的順序爲: QMAILUSER, MAILUSER, USER, 然後 LOGNAME. 普通用戶登錄期間通常要設置USER和LOGNAME變量, 不過某些批處理任務, 比如以 cron 執行的任務, 將不會設置這兩個環境變量. 爲了使你的 cron 任務發送的郵件有一個合法的 From 字段, 請在發信之前設置一個環境變量就可以了. G.16. 停止qmail-send進程的時候, 它不總是立即退出. 在還有郵件傳送的情況下, 向qmail-send發送 KILL 信號是不能使qmail-send立刻退出的. qmail-send退出前將等待所有的qmail-local和qmail-remote進程完成任務, 這樣qmail-send才能記錄下傳送結果. 由于這個原因, "qmailctl restart" 或者 "qmailctl stop" 這樣的命令可能在qmail-send依然在運行的情況下, 報告qmail-send進程已經被停止了. 所以, 請使用"qmailctl stat"來檢查"stop"和"restart"命令的實際執行結果. 還要注意, qmail-send 退出前將遍曆郵件隊列, 所以當存在非常大的郵件隊列情況下停止qmail-send 會有一個非常明顯的時間延遲. G.17. 不能通過把郵件傳送到/dev/null 將郵件丟棄.假設這樣寫一個傳送指令: /dev/null 因爲qmail 認爲/dev/null 是一個mbox 格式的郵箱, 而/dev/null 是個特殊文件, 所以這樣作將導致qmail 無法傳送郵件. 最好的丟棄郵件的方式是建立一個.qmail 文件, 這個文件內可以包含無效的指令, 但一定要非空(.qmail 的空文件將被作爲按照defaultdelivery 內缺省指令或者qmail-start 命令行指令進行傳送) , 在這個文件裏面只放上注釋語句就可以作到了. 舉例如下, 一個僅包含注釋的.qmail 文件: # 或者: # throw messages away undelivered (注釋語句可以隨便些上點什麽. 譯者注) 這樣的.qmail 文件可以丟棄郵件, 而不予傳送. G.18. qmail-send 正在運行過程中修改郵件隊列是危險的在qmail-send 運行過程中, 如果你不是非常確切的知道你正在作什麽, 修改/var/qmail/queue 下面的文件或目錄是非常危險的, 可能會導致郵件隊列崩潰, 舉例來說, 郵件將處于未定義的狀態, 日志文件中出現奇異錯誤信息, 重複傳送郵件, 出現假的反彈郵件等等錯誤都可能發生. 一旦發生這些情況, 你必須找到並運行一個隊列檢查程序(有兩個可以在 qmail.org 找到)或者創建一個新的空郵件隊列. 如果你要修改郵件隊列, 首先停止qmail, 仔細處理隊列, 然後重啓qmail. 注意, qmail-send 停止也會造成這樣的隊列崩潰, 所以你應該知道如果你遇到這樣的情況應該怎麽作. 附錄 H. 關于本文 Life with qmail 的常見話題 H.1. 這個 Life with qmail 的版本是多少? 這是LWQ 2006年01月02日的英文版本(翻譯). H.2. 誰擁有 Life with qmail? 版權所有1999-2006, David E. Sill 個人主頁:http://Web.InfoAve.Net/~dsill/dave/ H.3. Life with qmail 的版權信息? How is Life with qmail licensed?Life with qmail 使用OpenContent 1.0 版本許可證, 參見 http://www.opencontent.org/opl.shtml查看完整的版權許可證. 基本上, 你可以拷貝, 再發布, 或者對于修改版本可以對Life with qmail 進行修改, 如果重發布, 也需要在 OpenContent 的版權許可證規定範圍內. H.4. 我怎麽取得新版 LWQ 的發布通知? 發送郵件到 lwq-announce-subscribe@sws1.ctd.ornl.gov 加入 lwq-announce 郵件列表. H.5. 在哪裏可以爲 LWQ 投稿, 捐助以及討論它? 發送郵件到 lwq-subscribe@sws1.ctd.ornl.gov 加入lwq郵件列表. H.6. Life with qmail 被翻譯成其他語言了嗎? 大概LWQ已經被翻譯成了幾種語言. 參見 http://lifewithqmail.org/trans.html 查看更多關于LWQ的翻譯消息. H.7. Life with qmail 有沒有 PostScript, PDF, plain text, 或者其他任何除了HTML的格式? 有的, 其他格式的可以在這裏 http://lifewithqmail.org/ 取得. H.8. 我按照 Life with qmail 說的作了, 可是我的系統崩潰了, 或者弄壞了我的硬盤, 或者毀了我的愛情, 或者弄死了我的狗, 等等問題, 我該怎麽辦? (這屬于老外的幽默啦. ^_^, 譯者注) 我很抱歉, 真的很抱歉. 可是使用 Life with qmail 是沒有任何擔保的. 請參考上面提到的 OpenContent 版權許可證. 我不是爲了賺錢才寫Life with qmail 的, 我只是想爲 qmail 社區作出一些有益的貢獻. 其實, Life with qmail 並不是一個FAQ, 反而我希望這是個 NAQ (Never Asked Question). H.9. 我怎麽爲 LWQ捐贈和投稿? 請把對 LWQ 的修正意見, 建議以及抱怨等等發送到 lwq@sill.org. 如果你想要作更大的投稿, 比如, 比如文章的新的小部分或者附錄, 那太棒了! 首先請和我協商以便確認哪些我想要在LWQ裏面添加的內容還有就是核實是否已經有人在作同樣的工作了. 另外一個支持LWQ 的方式是去我的書店買東西, 這是Amazon.com 的聯盟書店, 使用這個地址訪問: http://www.amazon.com/exec/obidos/redirect-home/davesill. 感謝你的衷心支持! Thanks for your support! H.10. 這個版本的LWQ有那些變化呢?修正了許多的小錯誤, 無效鏈接等等. 增加了 /dev/null/ 部分. 感謝Payal Rathod. 擴展了nosuid 注意事項部分. 感謝Tony Hansmann. 增加了到Cazabon 的nodefaultrbl 的補丁的鏈接. 感謝Jeremy Kister. 在qmail-pop3d 指令中添加了mkdirs. 感謝Larry Weldon. 增加了checkpasswd 的關于errno 補丁的注意事項. 感謝tlad. 增加了smarthost relay 子章節. 感謝Silver Dirk. 改善了Qmail-Scanner 的措辭. 感謝Jason Haar. 增加了Yenigul 的書的章節. 感謝Ismail Yenigul. 增加了abuse@ 別名. 感謝Charles Cazabon. 增加了ucspi-tls 章節. 感謝Scott Gifford. 增加了修改郵件隊列可能發生問題的提示. H.10.1. 2004-06-30版本的LWQ有什麽更改?加入了新的qmail 的logo, 感謝Michael Kadrie. 修正了一些打字輸入錯誤. 更新了Macintosh OS X 的注意事項. 更新了ClamAV 鏈接. 在高級話題內增加了接收者驗證章節. 修改了"setuid/exe required for queue filesystem" 的措辭. H.10.2. 2004-03-28版本的LWQ有什麽更改?更新了關于Levine 的書的信息. 修改了"What changed in the 2004-03-01 version of LWQ?"章節的輸入錯誤. 在G16內增加了關于qmail-send 在退出前掃描郵件隊列的注釋. H.10.3. 2004-03-01版本的LWQ有什麽更改?G.16 內"kill"的表達被替換爲更好的詞"term". 增加了softlimit-too-low 示例錯誤信息. 修正了E.2, CNAME查詢錯誤. H.10.4. 2004-01-26版本的LWQ有什麽更改?更新了netqmail 1.05部分. 更新了一些小輸入錯誤. H.10.5. 2003-11-10版本的LWQ有什麽更改?更新了一些小輸入錯誤. H.10.6. 2003-10-30版本的LWQ有什麽更改?爲netqmail 調整了安裝部分. 更新了Binc IMAP 入口. H.10.7. 2003-08-16版本的LWQ有什麽更改?增加了這個變更記錄節. 感謝 Jerry Asher 提出的這個要求. 增加了關于 noexec 和 nosuid 系統需求節. 在測試節增加了 inst_check 腳本和例子的鏈接. 增加了Mate Wierdl 的errno 補丁的鏈接. 在系統要求節增加了OS X 的注意事項. IMAP 服務器節增加了Cyrus 條目. 感謝 Rick Updegrove. 在IMAP 服務器節增加了Dovecot 條目. 重新表述了地址擴展節. 感謝 Adrian Ho. 重新定制了 POP 的 run 腳本格式, 更容易複制和粘貼. 感謝 Woody Preston. 在Chunck Foster 的DNS 補丁部分修正了一處拼寫錯誤. 感謝 Josh Parreco. 在QMTP 節修正了兩個拼寫錯誤. 感謝 Marek Gutkowski.
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有