透過將字元字串插入重寫位址,替換可用來重寫使用者名稱或位址,替換的值由使用的特定替換序列決定。本節包含以下小節:
例如,在以下範本中,$U 為替換序列。它導致重寫位址的使用者名稱部分被替換為範本的輸出。因此,如果 jdoe@mailhost.siroe.com 由此範本重寫,則結果輸出將為 jdoe@siroe.com,$U 將替換原始位址的使用者名稱部分 jdoe︰
$U@siroe.com
控制序列還為給定重寫規則的適用性施加了附加條件。不僅重寫規則的式樣部分必須匹配被檢查的主機或網域規格,而且被重寫的位址的其他方面也必須滿足由控制序列設定的條件。例如,$E 控制序列要求被重寫的位址是訊息封位址,$F 控制序列要求該位址是正向定位位址。以下重寫規則僅套用至 (重寫) user@siroe.com 格式的訊息封 To: 位址︰
siroe.com $U@mail.siroe.com$E$F
如果網域或主機規格匹配重寫規則的式樣部分,但是不滿足規則範本中控制序列所強加的所有準則,則重寫規則將失敗,並且重寫程式將繼續尋找其他適用的規則。
表 11–4 概括了範本替換和控制序列。
表 11–4 重寫規則範本替換和控制序列的摘要
範本中出現的所有 $U 均由原始位址中的使用者名稱 (RFC 822「本機部分」) 替代。請注意,格式 a.「b」中的使用者名稱將由「a.b」替代,因為 RFC2822 已停用之前 RFC 822 中的語法,且希望之後強制使用後一種用法。
範本中出現的所有 $0U 將由原始位址的使用者名稱取代,不包括任何子位址和子位址指示字元 (+)。範本中出現的所有 $1U 將由原始位址的子位址和子位址指示字元 (如果有) 取代。因此請注意,$0U 和 $1U 是使用者名稱的補充,$0U$1U 與簡單的 $U 等效。
出現的所有 $H 均由規則不匹配的主機/網域規格部分取代。出現的所有 $D 均由重寫規則匹配的主機/網域規格部分取代。$nH 和 $nD 字元是保留從 0 開始計數的第 n 個最左側部分的一般 $H 或 $D 部分的變體。也就是說,$nH 和 $nD 分別省略了最左側 n 個部分 (從 1 開始計數,通常為 $H 或 $D) 的替換。特別是,$0H 等效於 $H,$0D 等效於 $D。
例如,假設位址 jdoe@host.siroe.com 匹配以下重寫規則:
host.siroe.com $U%$1D@TCP-DAEMON
則結果位址是 jdoe@siroe.com,且 TCP-DAEMON 用做外寄通道。其中,$D 會在整個匹配網域 host.siroe.com 中進行替換,而 $1D 將從第 1 部分 (第 1 部分是 siroe) 開始替換匹配的部分,因此是在 siroe.com 中進行替換。
$L 用於替換重寫規則不匹配的網域文字部分。
$、% 和 @ 字元通常是重寫規則範本中的元字元。若要執行此類字元的文字插入,請以美元字元 $ 引用它。也就是說,$$ 延伸至單一美元符號 $;$% 延伸至單一百分比符號 % (此處的百分比符號不會解譯為範本欄位分隔符號);$@ 延伸至單一 at 符號 @ (也不解譯為欄位分隔符號)。
$]ldap-url[ 格式的替換被解譯為 LDAP 查詢 URL,並且 LDAP 查詢的結果會被替換。標準 LDAP URL 在使用時會省略主機和連接埠,而是在 msg.conf 檔案 (local.ldaphost 和 local.ldapport 屬性) 中指定主機和連接埠。
即,LDAP URL 應按以下方式指定,其中方括號字元 [ ] 表示 URL 的選擇性部分:
ldap:///dn[?attributes[?scope?filter]]
dn 是必要的,它是指定搜尋基底的辨別名稱。URL 的選擇性部分 (屬性、範圍和篩選器) 會進一步細加區別要傳回的資訊。對於重寫規則,指定傳回的所需屬性可能是 mailRoutingSystem 屬性 (或某些類似的屬性)。該範圍可能是任何基底 (預設),或子基底。並且,所需的篩選可能會請求物件的傳回,該物件的 mailDomain 值匹配被重寫的網域。
如果 LDAP 目錄模式包含屬性 mailRoutingSystem 和 mailDomain,則可能顯示決定將給定位址類型路由至哪個系統的重寫規則,如下所示,其中 LDAP URL 替換序列 $D 用於將目前的網域名稱替換為已建構的 LDAP 查詢:
.siroe.com \ $U%$H$D@$]ldap:///o=siroe.com?mailRoutingSystem?sub? \ (mailDomain=$D) |
為了便於讀取,使用反斜線字元將單一邏輯重寫規則行延續至第二個實體行。表 11–5 列出了 LDAP URL 替換序列。
表 11–5 LDAP URL 替換序列
替換序列 |
說明 |
---|---|
$$ |
文字 $ 字元 |
$~ account |
使用者帳號的主目錄 |
$A |
位址 |
$D |
網域名稱 |
$H |
主機名稱 (完全合格的網域名稱的第一部分) |
$L |
不包含任何特殊前導字元 (如 ~ 或 _) 的使用者名稱 |
$S |
子位址 |
$U |
使用者名稱 |
現在,MTA 可從重寫規則和對映中執行的查找中快取 URL 結果。這一新 URL 結果快取由兩個新 MTA 選項 URL_RESULT_CACHE_SIZE (預設為 10000 個項目) 和 URL_RESULT_CACHE_TIMEOUT (預設為 600 秒) 控制。
$(text) 格式的替換是經過特殊處理的。文字部分用做存取特殊一般資料庫的金鑰。此資料庫包含使用 /imta/config/imta_tailor 檔案中的 IMTA_GENERAL_DATABASE 選項指定的檔案,該檔案通常為 /imta/db/generaldb.db。
此資料庫是使用 imsimta crdb 公用程式產生的。如果在資料庫中找到「文字字串」,則將替換資料庫中相應的範本。如果「文字字串」與資料庫中的任何項目均不匹配,則重寫程序將失敗;如同重寫規則從未匹配過。如果替換成功,將重新掃描從資料庫中擷取的範本,以便進行其他替換。但是,為避免無盡的遞迴參考,將禁止在擷取範本中進行其他 $(text) 替換。
例如,假設位址 jdoe@siroe.siroenet 匹配以下重寫規則:
.SIROENET $($H)
則將在一般資料庫中查詢文字字串 siroe,並將查詢結果 (如果有) 用於重寫規則的範本。假設查詢 siroe 的結果為 $u%eng.siroe.com@siroenet.,則範本的輸出將為 jdoe@eng.siroe.com (亦即 username = jdoe、host/domain specification = eng.siroe.com),且路由系統將為 siroenet。
如果一般資料庫存在,則該資料庫應可由所有人讀取,以確保其正確作業。
格式的替換。SIROENET $($H) ${mapping ,argument} 用於尋找並套用 MTA 對映檔案中的對映。mapping 欄位指定要使用的對映表名稱,而 argument 指定要傳送至對映的字串。若要重寫成功,對映必須存在並且必須在其輸出中設定 $Y 旗標;如果對映不存在或未設定 $Y,重寫將失敗。如果成功,對映結果將併入目前位置的範本,並重新延伸。
此機制可讓 MTA 重寫程序以各種複雜的方式進行延伸。例如,可以選擇性地分析和修改位址的使用者名稱部分,MTA 重寫程序通常不具有此功能。
$[image ,routine,argument ] 格式的替換用於尋找並呼叫用戶提供的常式。在 UNIX 上運行時,MTA 使用 dlopen 和 dlsym 從共用程式庫影像中動態地載入並呼叫指定的常式。然後,將使用以下引數清單以函數的方式呼叫常式:
status := routine (argument, arglength, result, reslength)
argument 和 result 為 252 位元組長的字元字串緩衝區。在 UNIX 上,argument 和 result 將做為指標傳送至字元字串 (例如,在 C 中做為 char*)。arglength 和 reslength 是由參照傳送的帶符號的長整數。在輸入中,argument 含有來自重寫規則範本的引數字串,而 arglength 含有該字串的長度。在傳回中,結果字串應位於 result 中,其長度應位於 reslength 中。然後,該結果字串將替代重寫規則範本中的「$[ image,routine,argument]」。如果重寫規則失敗,常式應傳回 0;如果成功,應傳回 -1。
此機制可讓重寫程序以各種複雜的方式進行延伸。例如,可以執行某種類型的名稱服務呼叫,並且可以某種方式將結果用於改變位址。正向定位位址 (例如,To: 位址) 至主機 siroe.com 的目錄服務查詢可以使用以下重寫規則並按以下方式執行。如方向和位置特定的重寫規則 ($B、$E、$F、$R) 中所述,$F 導致此規則僅用於正向定位位址︰
siroe.com $F$[LOOKUP_IMAGE,LOOKUP,$U]
當正向定位位址 jdoe@siroe.com 匹配此重寫規則時,將導致 LOOKUP_IMAGE (UNIX 上的共用程式庫) 被載入記憶體,並導致常式 LOOKUP 被呼叫 (以 jdoe 做為引數參數)。然後,常式 LOOKUP 可能會在結果參數中傳回不同的位址 (如 John.Doe%eng.siroe.com) 和值 -1,以表示重寫規則成功。結果字串中的百分比符號 (請參閱重複的重寫範本 A%B),John.Doe@eng.siroe.com 做為位址被重寫。
在 UNIX 系統上,網站提供的共用程式庫影像應可由所有人讀取。
單一欄位替換從被重寫的主機/網域規格中擷取單一子網域部分。可用的單一欄位替換在表 11–6 中顯示。
表 11–6 單一欄位替換
控制序列 |
用法 |
---|---|
$&n |
在主機規格 (該部分不匹配或匹配某種萬用字元) 中替換第 n 個元素,n=0,1,2,..,9。元素以點分隔;左邊第一個元素是元素零。如果所需的元素不存在,則重寫失敗。 |
$!n |
在主機規格 (該部分不匹配或匹配某種萬用字元) 中替換第 n 個元素,n=0,1,2,..,9。元素以點分隔;右邊第一個元素是元素零。如果所需的元素不存在,則重寫失敗。 |
$*n |
在網域規格中 (該部分匹配式樣中的明確文字) 替換第 n 個元素,n=0,1,2,...,9。元素以點分隔;左邊第一個元素是元素零。如果所需的元素不存在,則重寫失敗。 |
$#n |
在網域規格中 (該部分匹配式樣中的明確文字) 替換第 n 個元素,n=0,1,2,...,9。元素以點分隔;右邊第一個元素是元素零。如果所需的元素不存在,則重寫失敗。 |
假設位址 jdoe@eng.siroe.com 匹配以下重寫規則:
*.SIROE.COM $U%$&0.siroe.com@mailhub.siroe.com
則範本結果將是 jdoe@eng.siroe.com,並將 mailhub.siroe.com 用做路由系統。
每次使用 $W 控制序列時均會插入一個由大寫字母和數字組成的文字字串,這些大寫字母和數字均是唯一且不可重複的。在必須建構不可重複的位址資訊時,$W 十分有用。
重寫規則可以僅與特定源通道結合使用。這在縮寫名稱包含兩種含義時十分有用:
當它在到達某個通道的郵件中顯示。
當它在到達其他通道的郵件中顯示。
來源通道特定的重寫與正在使用的通道程式和通道關鍵字 (rules 和 norules) 關聯。如果在與執行重寫的 MTA 元件關聯的通道上指定 norules,則不會執行通道特定的重寫檢查。如果在通道上指定規則,則會強制執行通道特定的規則檢查。關鍵字 rules 為預設。
來源通道特定的重寫與匹配給定位址的通道無關。它僅取決於執行重寫的 MTA 元件及該元件的通道表項目。
通道特定的重寫檢查由規則範本部分中的 $N 或 $M 控制序列觸發。$N 或 $M 之後直至 at 符號 (@)、百分比符號 (%) 或後續 $N、$M、$Q、$C、$T 或 $? 之間的字元被解譯為通道名稱。
例如,如果通道目前未執行重寫,則 $M 通道將導致規則失敗。如果通道正在執行重寫,則 $N 通道將導致規則失敗。可以指定多個 $M 和 $N 陳述式。如果多個 $M 陳述式中的任何一個匹配,規則將成功。如果多個 $N 陳述式中的任何一個匹配,規則將失敗。
重寫規則的應用程式可以取決於郵件在其中形成佇列的通道。這在主機具有兩個名稱 (一個由一組主機所知,一個由其他主機所知) 時十分有用。透過使用不同的通道將郵件傳送至各群組,可以重寫位址以針對名稱為各群組所知的主機。
目標通道特定的重寫與要將郵件移出佇列並處理郵件的通道,以及該通道上的通道關鍵字 (rules 和 norules) 關聯。如果在目標通道上指定 norules,則不會執行通道特定的重寫檢查。如果在目標通道上指定 rules,則將強制執行通道特定的規則檢查。關鍵字 rules 為預設。
目標通道特定的重寫與給定位址匹配的通道不關聯。僅取決於郵件的訊息封 To: 位址。當郵件形成佇列時,會首先重寫訊息封 To: 位址以決定形成佇列的通道。在重寫訊息封 To: 位址期間,會忽略任何 $C 和 $Q 控制序列。重寫訊息封 To: 位址並決定目標通道之後,由於與郵件關聯的其他位址會被重寫,因此會執行 $C 和 $Q 控制序列。
目標通道特定的重寫檢查由規則範本部分中的 $C 或 $Q 控制序列觸發。$C 或 $Q 之後直至 at 符號 (@)、百分比符號 ( %) 或後面的 $N、$M、$C, $Q、$T 或 $? 的字元會被解譯為通道名稱。
例如,如果通道不是目標通道,則 $Q 通道將導致規則失敗。例如,如果通道是目標通道,則 $C 通道將導致規則失敗。可以指定多個 $Q 和 $C 陳述式。如果多個 $Q 陳述式中的任何一個匹配,規則將成功。如果多個 $C 陳述式中的任何一個匹配,規則將失敗。
有時您需要指定僅套用至訊息封位址或標頭位址的重寫規則。如果被重寫的位址不是訊息封位址,則控制序列 $E 將強制重寫失敗。如果被重寫的位址不是來自郵件標頭或內文,則控制序列 $B 將強制重寫失敗。這些序列對重寫沒有其他影響,它們可以出現在重寫規則範本中的任何地方。
位址也可以按方向進行分類。正向定位的位址是源於 To:、Cc:、Resent-to: 或其他參照目標的標頭或訊息封行的位址。反向定位的位址是 From:、Sender: 或 Resent-From: 之類參照來源的位址。如果位址是正向定位的,則控制序列 $F 將導致套用重寫。如果位址是反向定位的,則控制序列 $R 將導致套用重寫。
有時需要重寫主機名稱在位址中出現的敏感位置。主機名稱可以在位址的幾個不同環境中出現:
在源路由中
在 at 符號 (@) 的右側
在本機部分的百分比符號 (%) 的右側
在本地部分的驚嘆號的左側
在一般情況下,應以相同的方式處理主機名稱,而不管其出現的位置。某些情況可能需要特殊處理。
四個控制序列可用於根據位址中的主機位置來控制匹配。
$S 指定規則可以匹配擷取自來源路由的主機。
$A 指定規則可以匹配 @ 符號右側的主機。
$P 指定規則可以匹配 % 符號右側的主機。
$X 指定規則可以匹配驚嘆號 (!) 左側的主機)。
如果主機位置不是指定的位置,規則將失敗。這些序列可以併入單一重寫規則。例如,如果指定了 $S 和 $A,則規則可以匹配來源路由中指定的或 at 符號右側的主機。不指定這些序列等同於指定所有這些序列;規則可以匹配而不用考慮位置。
$T 控制序列用於變更目前的重寫規則標記。在配置檔案和網域資料庫中查詢重寫規則標記之前,這些標記位於所有重寫規則式樣的前面。$T 之後直至 at 符號、百分比符號 $N、$M、$Q、$C、$T 或 $? 的字元被用做新標記。
在處理特殊定址格式 (當遇到某個元件時,位址的全部性質會變更) 時,標記十分有用。例如,假設在來源路由中找到特殊主機名稱 internet,則應將其從位址中移除,強制結果位址與 TCP-DAEMON 通道匹配。
此作業可以使用如下規則來實作 (假設 localhost 為本地主機的法定名稱):
internet $S$U@localhost$Tmtcp-force| mtcp-force|. $U%$H@TCP-DAEMON
如果源路由中出現特殊主機名稱,則第一個規則將與之匹配。此規則強制 internet 與本地通道匹配,這可確保將 internet 從位址中移除。此時便會設定重寫標記。重寫將繼續,但由於該標記,將不會有正規規則匹配。最後,預設規則將嘗試該標記,此設定的第二個規則將啟動,強制將位址與 TCP-DAEMON 通道匹配,而不考慮其他任何準則。
當重寫和通道匹配失敗時,MTA 提供預設錯誤訊息。在某些情況下變更這些訊息的功能十分有用。例如,如果某人嘗試將郵件傳送至某個乙太網路路由器信箱,則使用訊息「我們的路由器無法接受郵件」將比一般的「指定了非法的主機/網域」訊息能夠提供更明確的資訊。
如果規則失敗,則可以使用一個特殊的控制序列來變更列印的錯誤訊息。序列 $? 用於指定錯誤訊息。如果此重寫的結果無法匹配任何通道,則 $? 之後直至 at 符號 (@)、百分比符號 (%)、$N、$M、$Q、$C、$T 或 $? 的文字做為要列印的錯誤訊息文字。錯誤訊息的設定為「黏貼式」,在整個重寫程序期間持續有效。
含有 $? 的規則與任何其他規則的執行方式相同。規則中僅包含 $? 的這種特殊情況需要特別注意 - 重寫程序將終止,而不變更電子信箱或位址的主機部分,並且系統會在通道表中查詢未經變更的主機。此查詢必定會失敗,並最終傳回錯誤訊息。
例如,假設 MTA 配置檔案中的最後重寫規則如下:
. $?Unrecognized address; contact postmaster@siroe.com
此範例中,任何無法識別的主機或 可能失敗的網域規格將在失敗過程中產生此錯誤訊息︰Unrecognized address; contact postmaster@siroe.com。