sendmail address rewriting mini-HOWTO <author> 作者: Thomas Roessler <tt><htmlurl url="mailto:roessler@guug.de" name="roessler@guug.de"></tt><newline> 譯者: 蘇江文 <tt><htmlurl url="mailto:softsprite@yeah.net" name="softsprite@yeah.net"></tt> <date>v0.0, 6 May 1998 翻譯日期: 16 Dec 1999 <abstract> 本文介紹家庭用戶撥號訪問如何配置 sendmail 。 </abstract> <sect>導言 <p>我們假設你現在已經能夠進行類似通常在大學中的互聯網訪問及在線服務:你在串口聯接通過PPP撥號進入你的聯接供應商的網絡。 你接收的郵件是放在供應商的POP或IMAP服務器中,發出的郵件則通過SMTP送出。你沒有一個屬于你的域名,因此一切都必須使用<em/一個/地址。 <p>我們假設你已經安裝了Eric Allman的sendmail的最新版本(本文寫作時最新版本是8.8.8,這個版本能很好地工作)。(譯者:當前最新穩定版本是8.9.3) <p>本文部分說明專指Debian GNU/Linux系統,使用其它發行版本的用戶應引起注意。 <p>確認你手頭掌握了以下信息: <itemize> <item>你的ISP的郵件服務器。 <item>你的互聯網郵件地址。 </itemize> <p>我們計划中的配置包括兩個主要目標: <enum> <item>能在兩個不同的本地用戶之間發送郵件。 <item>外部世界接收郵件時看到的是本地用戶的ISP的郵件地址,而不是本地郵件地址。 </enum> <p>為了達到這個目的,我們將使用sendmail的 <tt/genericstable/ 特點。 <sect>文件路徑映射 <p>我們將把所有sendmail的配置文件放在以下不同的目錄中: <tt//etc/: <tt//etc/mail/ 。通常,sendmail將期待這些文件存放在 <tt//etc/ 。 為了避免這個問題,將 <tt//etc/sendmail.cf/ 符號鏈接到 <tt//etc/mail/sendmail.cf/ 。 <p>以下文件存放在 <tt//etc/mail/: <itemize>=20 <item><tt/aliases/ - 包含附加的本地地址 <item><tt/genericsdomain/ - 包含本地主機配置的一些信息 <item><tt/genericstable/ - 包含重寫規則 <item><tt/sendmail.cf/ - sendmail的配置文件 <item><tt/sendmail.mc/ - <tt/sendmail.cf/ 的配置源代碼。 </itemize> 以上部分文件都附帶著 <tt/.db/ 文件。它們包含能被sendmail直接使用的哈希數據庫。 <p>我們假設sendmail配置源代碼樹的 <tt/cf/ 部分存放在目錄 <tt//usr/lib/sendmail.cf/ 中。 在 Debian GNU/Linux 系統中就是這樣存放的。其它發行版本可能存放在不同的地方。詳情請參考你的發行版本的文檔。 <sect>配置 sendmail <sect1>主要的配置文件 <p>sendmail 在它的配置中使用相當復雜的規則系統。在你掌握許多配置竅門之前,通過手工寫一個 <tt/sendmail.cf/ 文件很不常見并且耗費大量時間。如果你對此感興趣,你可以停止閱讀本文而去看 O'Reilly 的 "Bat Book" 。 <p>取代使用手工配置的方法,我們使用 <tt/m4/ 宏處理器將預定義好的文件生成你的配置文件,這些預定義文件隨 sendmail 的發行版本一并提供。 <p>請看文件 <tt/sendmail.mc/ 的第一行: <code> include(/usr/lib/sendmail.cf/m4/cf.m4) VERSIONID(`sendmail.mc - roessler@guug.de') OSTYPE(debian) define(`ALIAS_FILE',`/etc/mail/aliases') </code> 在第一行, <tt/cf.m4/ 被包含進來。這個 m4 宏文件包含了其它部分將用到的許多宏定義。 確定你提供的路徑是正確的 - 在我們這個例子中提供的這個路徑是Debian GNU/Linux的典型路徑。 <tt/OSTYPE/ 宏被用來給出一些非常有用的當前配置的缺省值。 如果你不是使用Debian系統,你可以將這里的 "debian" 換成 "linux" 。 <tt/ALIAS_FILE/ 告訴 sendmail 到哪里去找到 aliases 文件。 <p>以下几行告訴 sendmail 使用 <tt/genericstable/ 特點和到哪里去找到使用該特點的配置文件: <code> FEATURE(masquerade_envelope) FEATURE(genericstable, `hash -o /etc/mail/genericstable') GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain') </code> <tt/masquerade_envelope/ 特點告訴 sendmail 去實現郵頭重寫到郵件的<em/信封/ 傳送者。 這是一個外部郵件投遞系統將用來直接投遞失敗報告和警告郵件的郵件地址。<tt/generics*/ 文件將在下面解釋。 <p>現在,我們必須定義一個所謂 smart 主機,就是將要負責為你的系統傳送外部郵件的主機。 注意:這台主機有可能不是你的ISP的POP和IMAP服務器。 如果對此不太清楚,聯系你的ISP供應商。 主配置文件的代碼如下: <code> define(`SMART_HOST',`mail-out.your.provider') </code> 請替換 <em/mail-out.your.provider/ 成你的ISP的主機地址。 <p>最后兩行包含 "mailer" 定義,sendmail 根據這些定義才能知道如何處理不同類型的郵件: <code> MAILER(local) MAILER(smtp) </code> <p>為了從這個 <tt/sendmail.mc/ 生成 <tt/sendmail.cf/ 文件,輸入以下命令 (作為 root 用戶): <code> # m4 sendmail.mc > _sendmail.cf # mv -f _sendmail.cf sendmail.cf </code> 注意我們使用的技朮:將 <tt/m4/ 的輸出寫入一個臨時文件,再轉移到合適的地方。這將幫助我們避免sendmail讀入只寫了一部分的配置文件。 <sect1>地址重寫 <p>首先,我們必須告訴sendmail哪些地址將被認為是本地地址(然后將被重寫)。這很簡單:只要將你的機器的完整主機名放入文件 <tt//etc/mail/genericsdomain/。 為了取得你的機器的完整主機名,輸入以下命令: <code> $ hostname -f </code> <p>現在,讓我們看一下重寫表: <tt//etc/mail/genericstable/ 。這個文件由被空格分開的兩列組成。第一列包含本地地址,第二列包含替換后的郵件地址。 文件看起來如下: <code> harry harryx@your.isp maude maudey@her.isp root fredx@your.isp news fredx@your.isp </code> 注意<em/每一個/本地機器上的賬號都要有一行,這樣自動生成的外發郵件能帶上正確的頭信息。 <p>為了性能的考慮, sendmail 并不直接使用這個文本文件,而是用“哈希”版本替代。為了生成這個版本,輸入以下命令: <code> # makemap -r hash genericstable.db < genericstable </code> <p>注意: <tt/genericstable/ 指定的重寫規則將<em/不/ 作用在本地郵件或你從外部接收到的郵件 - 這種轉換只使用在從你本地機器通過你的ISP主機發往外部的郵件。 <sect1>別名 <p>別名文件包含只對你本地郵件有效的附加本地名字。這對管理員賬號象 <tt/root/ 非常有用,從你的系統接收自動轉換來的郵件。 <p><tt//etc/mail/aliases/ 可能如下所示: <code> root: fred news: root postmaster: root mail: root www: root nobody: /dev/null MAILER-DAEMON: nobody </code> 這個例子將路由送往 <tt/root/, <tt/news/, <tt/postmaster/, <tt/mail/, 和 <tt/www/ 用戶的本地郵件到 <tt/fred/ , 而送往 <tt/nobody/ 和 <tt/MAILER-DAEMON/ 的郵件將重定向到 <tt//dev/null/ 。 <p>就象 <tt/genericstable/, <tt/aliases/ 可能包含<em/許多/ 項。因此,就象我們上面所說的,sendmail直接使用文本文件將效率低下。 <tt/aliases/ 采用和 <tt/genericstable/ 同樣的機制:生成一個哈希數據庫。 取代直接使用 <tt/makemap/ ,這次你可以輸入命令 <tt/newaliases/ 。它將自動處理所需的一切。 <sect>進階閱讀 <p>sendmail源代碼發行版中包含了許多文檔。閱讀它們,特別是文件 <tt/cf/README/ 。 <p>如果你想深入了解sendmail的配置選項,你可以從以下地址取得“Bat Book”: O'Reilly: Bryan Costales, Eric Allman, and Neil Rickert: "sendmail". O'Reilly, 1993. </article></linuxdoc>