Sun Java logo     上一個      目錄      索引      下一個     

Sun logo
Sun Java System Messaging Server 6 2004Q2 管理指南 

第 11 章
配置重寫規則

本章描述如何在 imta.cnf 檔案中配置重寫規則。您應先閱讀第 10 章「關於 MTA 服務和配置」,然後再閱讀本章。

本章包含以下各節:

Messaging Server 的位址重寫功能區是處理和變更位址的主機部分或網域部分的主要功能區。Messaging Server 還提供了用於位址處理的其他功能區,如別名、位址反向資料庫和專用對映表。但是,為獲得最佳效能,應儘可能使用重寫規則來執行位址處理。


imta.cnf 檔案中變更重寫規則時,您必須使用 imsimta restart 指令重新啟動僅在啟動時載入一次配置資料的所有程式或通道,如 SMTP 伺服器。如果您使用已編譯的配置,則必須重新編譯,然後再重新啟動。

如需有關編譯配置和啟動程式的更多資訊,請參閱「Messaging Server Reference Manual」



重寫規則結構

重寫規則顯示在 MTA 配置檔案 imta.cnf 的上半部分。配置檔案中的每個規則顯示在單一行中。規則之間允許出現註釋,但不允許有空白行。重寫規則以空白行結束,後面是通道定義。以下範例顯示部分配置檔案的重寫規則區段。

! test.cnf - An example configuration file.
!
! This is only an example of a configuration file.It serves
! no useful purpose and should not be used in a real system.
!
a.com   $U@a-host
b.org   $U@b-host
c.edu   $U%c@b-daemon
d.com   $U%d@a-daemon

! Begin channel definitions

重寫規則包括兩個部分:型樣,後跟等效字串或範本。這兩個部分必須以空格分隔,但這兩部分內部不允許有空格。重寫規則的結構如下:

pattern template

pattern

表示要在網域名稱中搜尋的字串。表格 11-3 中的型樣包括 a.comb.orgc.edud.com

如果型樣匹配位址的網域部分,則重寫規則將套用至位址。必須以空格分隔型樣和範本。如需有關型樣語法的更多資訊,請參閱重寫規則型樣和標記

template

是以下其中之一:

UserTemplate%DomainTemplate@ChannelTag[controls]

UserTemplate@ChannelTag[controls]

UserTemplate%DomainTemplate[controls]

UserTemplate@DomainTemplate@ChannelTag[controls]

UserTemplate@DomainTemplate@SourceRoute@ChannelTag[controls]

其中

UserTemplate 指定如何重寫位址的使用者部分。可以使用替換序列來表示原始位址部分或資料庫查詢的結果。用替換序列所代表的內容取代它們,以建構重寫位址。在表格 11-4 中,使用了 $U 替換序列。如需更多資訊,請參閱範本替換和重寫規則控制序列

DomainTemplate 指定如何重寫位址的網域部分。與 UserTemplate 一樣,DomainTemplate 也可以包含替換序列。

ChannelTag 表示此郵件要傳送至的通道。(所有通道定義必須包含通道標記和通道名稱。通道標記通常在重寫規則及其通道定義中出現。)

controls。使用 controls 可以限制規則的適用性。某些控制序列必須顯示在規則的開頭;其他 controls 必須顯示在規則的結尾。如需有關 controls 的更多資訊,請參閱範本替換和重寫規則控制序列

如需有關範本語法的更多資訊,請參閱重寫規則範本


重寫規則型樣和標記

本節包含以下小節:

大多數重寫規則型樣均包含僅匹配某一主機的特定主機名稱,或匹配整個子網域中任一主機/網域的子網域型樣。

例如,以下重寫規則型樣包含僅匹配指定主機的特定主機名稱:

host.siroe.com

下一個重寫規則型樣包含將匹配整個子網域中任一主機或網域的子網域型樣:

.siroe.com

但是,此型樣將不匹配主機名稱 siroe.com;若要匹配主機名稱 siroe.com,則需要單獨的 siroe.com 型樣。

MTA 嘗試從特定主機名稱開始重寫主機/網域名稱,然後不斷地一般化名稱以消除其特定性。這就是說,相對於較一般的重寫規則型樣而言,將優先使用較為特定的重寫規則型樣。例如,假設配置檔案中存在以下重寫規則型樣:

hosta.subnet.siroe.com
.subnet.siroe.com
.siroe.com

根據重寫規則型樣,位址 jdoe@hosta.subnet.siroe.com 將匹配 hosta.subnet.siroe.com 重寫規則型樣;位址 jdoe@hostb.subnet.siroe.com 將匹配 .subnet.siroe.com 重寫規則型樣;位址 jdoe@hostc.siroe.com 將匹配 .siroe.com 重寫規則型樣。

特別是,對於網際網路上的站點來說,使用併入子網域重寫規則型樣的重寫規則很普遍。此類站點通常包含許多其內部主機和子網路的重寫規則,並且還將頂層網際網路網域的重寫規則包含在其配置檔案 internet.rules (msg_svr_base/config/internet.rules) 中。

為了確保傳送至網際網路目標 (而不是經由更為詳細的重寫規則處理的內部主機目標) 的郵件會被正確重寫,並將這些郵件路由至外送的 TCP/IP 通道,請確定 imta.cnf 檔案中包含:

!    Ascension Island
.AC                      $U%$H$D@TCP-DAEMON
. [text
.     removed for
.             brevity]
!      Zimbabwe
.ZW                         $U%$H$D@TCP-DAEMON

IP 網域文字使用類似的階層匹配型樣,但為從右至左 (而不是從左至右) 的匹配。例如,以下型樣僅匹配 IP 文字 [1.2.3.4]

[1.2.3.4]

下一個型樣匹配 1.2.3.0 子網路中的所有位址:

[1.2.3.]

除了已說明的較常用主機或子網域重寫規則型樣之外,重寫規則還可以利用幾個特殊型樣,這些型樣已在表格 11-1 中概述並在以下小節中說明。

表格 11-1 重寫規則的特殊型樣摘要

型樣

描述/用法

$*

匹配任一位址。如果指定此規則,則不論它在檔案中位於何處,均將最先嘗試此規則。

$%

百分比入侵規則。匹配格式 A%B 的任一主機/網域規格。

$!

bang 樣式規則。匹配格式 B!A 的任一主機/網域規格。

[ ]

IP 文字全匹配規則。匹配任一 IP 網域文字。

.

匹配任一主機/網域規格。例如,joe@[129.165.12.11]

除這些特殊型樣之外,Messaging Server 還包括 tags 的概念,此概念可能會體現在重寫規則型樣中。如果位址被重寫多次,並且根據先前的重寫,必須透過控制與該位址匹配的重寫規則以在後續的重寫中進行區別的情況下,需要使用這些標記。如需更多資訊,請參閱標記的重寫規則集

匹配百分比入侵的規則

如果 MTA 嘗試重寫 A%B 格式的位址但失敗,則它會在徹底失敗並將此位址格式處理為 A%B@localhost 之前嘗試一個額外的規則。(如需有關這些位址格式的更多資訊,請參閱重寫規則範本。)此額外規則即為百分比入侵規則。其型樣為 $%,且從不變更。只有在包含百分比符號的本地部分無法重寫其他任何方法 (包括下面描述的全匹配規則) 時,才會啟動此規則。

百分比入侵規則對於為百分比入侵位址指定某些特殊的內部含義十分有用。

匹配 bang 樣式 (UUCP) 位址的規則

如果 MTA 嘗試重寫 B!A 格式的位址但失敗,則它會在徹底失敗並將此位址格式處理為 B!A@localhost 之前嘗試一個額外的規則。此額外規則即為 bang 樣式規則。其型樣為 $!,且從不變更。只有在包含驚嘆號的本地部分無法重寫其他任何方法 (包括下面描述的預設規則) 時,才會啟動此規則。

可以使用 bang 樣式規則,將 UUCP 樣式位址強制路由至具有 UUCP 系統和路由綜合知識的系統。

匹配任一位址的規則

如果其他規則均不匹配,並且在通道表格中找不到主機/網域規格,則特殊型樣「.」(單一小數點) 將匹配任一主機/網域規格。也就是說,若無法使用其他方法重寫位址時,將使用.規則作為最後的解決方案。


對於替換序列,如果全匹配規則匹配,並且其範本已延伸,則 $H 將延伸為完整的主機名稱,$D 將延伸為單一點「.」。這樣,$D 在全匹配規則範本中的使用將受到限制!


標記的重寫規則集

在重寫程序過程中,可能比較適合使用不同的規則集。這可以透過使用重寫規則標記來實現。在配置檔案或網域資料庫中查詢之前,目前標記置於每個型樣之前。透過使用重寫規則範本 (以下有描述) 中的 $T 替換字串,可以用任何匹配的重寫規則變更該標記。

標記具有黏性;一旦設定,它們將始終套用至從單一位址擷取的所有主機。這就是說,一旦使用標記,在提供以正確標記值開頭的替代規則時應十分謹慎。實際上,由於標記通常僅用於非常專業的應用程式,所以很少出現問題。一旦完成位址重寫,標記將重設為預設標記 (空字串)。

依慣例,所有標記值均以垂直線 | 結束。該字元不在一般位址中使用,因此可以在型樣的其餘部分隨意使用此標記。


重寫規則範本

以下各節將更詳細地描述重寫規則的範本格式。表格 11-2 中概述了這些範本格式。

表格 11-2 重寫規則的範本格式摘要

範本

頁數

用法

A%B

更多資訊

A 將是新的使用者/電子信箱名稱,B 將是新的主機/網域規格,再次重寫。

A@B

更多資訊

處理為 A%B@B。

A%B@C

更多資訊

A 將是新的使用者/電子信箱名稱,B 將是新的主機/網域規格,路由至與主機 C 關聯的通道。

A@B@C

更多資訊

處理為 A@B@C@C。

A@B@C@D

更多資訊

A 將是新的使用者/電子信箱名稱,B 將是新的主機/網域規格,插入 C 作為源路由,然後路由至與主機 D 關聯的通道。

一般重寫範本:A%B@C 或 A@B

以下範本是最常用的範本格式。此規則會套用至位址的使用者部分和網域部分。然後,使用新位址將郵件路由至特定通道 (由 ChannelTag 表示)。

UserTemplate%DomainTemplate@ChannelTag[controls]

下一個範本格式在應用方面與最常用的範本格式完全相同。但是,僅當 DomainTemplateChannelTag 完全相同時,才能使用該範本格式。

UserTemplate@ChannelTag[controls]

重複的重寫範本 A%B

以下範本格式用於在套用規則後還需要附加重寫的元規則。規則套用後,將在結果新位址上重複整個重寫程序。(規則套用後,所有其他重寫規則格式會導致重寫程序終止。)

UserTemplate%DomainTemplate[controls]

例如,以下規則可以從位址的結尾處移除所有 .removable 網域:

.removable $U%$H

使用這些重複規則時,必須十分謹慎;使用不當會引起「規則迴圈」。因此,只有在絕對必要時才能使用元規則。請確定使用 imsimta test -rewrite 指令測試元規則。如需有關 test -rewrite 指令的更多資訊,請參閱「Messaging Server Reference Manual」

指定的路由重寫範本 A@B@C@D 或 A@B@C

以下範本格式與較常用的範本 UserTemplate%DomainTemplate@ChannelTag (請注意第一個分隔字元的差異) 的工作方式相同,除了 ChannelTag 將作為源路由插入位址。然後,郵件將被路由至 ChannelTag

UserTemplate@DomainTemplate@Source-Route@
ChannelTag
[controls]

重寫位址將是 @route:user@domain。以下範本也有效:

UserTemplate@DomainTemplate@ChannelTag[controls]

例如,以下規則會將位址 jdoe@com1 重寫至源路由的位址 @siroe.com:jdoe@com1。通道標記將是 siroe.com

com1 $U@com1@siroe.com

重寫規則範本中的大小寫區分

與重寫規則中的型樣不同,範本中的字元大小寫將被保留。當使用重寫規則為區分字元大小寫的郵件系統提供介面時,此功能十分必要。請注意,諸如 $U 和 $D 之類的替換序列 (替換從位址中擷取的材料) 也會保留字元的原始大小寫。

當需要強制所替換材料使用特定大小寫時 (例如,強制 UNIX 系統上的電子信箱採用小寫),則可以在範本中使用特殊的替換序列,以強制所替換材料採用所需的大小寫。特別是,$\ 將強制後續的所替換材料採用小寫,$^ 將強制後續的所替換材料採用大寫,$_ 表示使用原始大小寫。

例如,您可以使用以下規則強制 unix.siroe.com 位址的電子信箱採用小寫:

unix.siroe.com $\$U$_%unix.siroe.com


MTA 如何將重寫規則套用至位址

  1. MTA 從位址中擷取第一個主機或網域規格。
  2. 一個位址可以指定多個主機或網域名稱,如下例所示:

    jdoe%hostname@siroe.com.

  3. 在識別第一個主機或網域名稱之後,MTA 將進行搜尋,掃描其型樣匹配主機或網域名稱的重寫規則。
  4. 找到匹配的重寫規則後,MTA 將根據此規則的範本部分重寫位址。
  5. 最後,MTA 會將通道標記和與每個通道關聯的主機名稱相比較。

這些步驟將在以下小節中詳細描述。


使用不屬於任何現有通道的通道標記,將導致其位址匹配此規則的郵件被退回。即,它會使匹配的郵件無法路由。


步驟 1. 擷取第一個主機或網域規格

重寫位址的程序是透過從位址擷取第一個主機或網域規格開始的。(建議不熟悉 RFC 822 位址慣例的讀者閱讀該標準,以理解以下討論內容。) 掃描位址中主機/網域規格的次序如下:

  1. 源路由中的主機 (從左至右讀取)
  2. 顯示在「at」符號 (@) 右側的主機
  3. 顯示在最後一個單百分比符號 (%) 右側的主機
  4. 顯示在第一個驚嘆號 (!) 左側的主機

如果 bangoverpercent 關鍵字在正在執行位址重寫的通道上有效,則最後兩個項目的次序將被交換。即,嘗試為郵件形成佇列的通道本身是否標記有 bangoverpercent 通道關鍵字。

表格 11-3 中顯示了可以首先擷取的位址和主機名稱的範例。

表格 11-3 擷取的位址和主機名稱  

位址

第一個主機網域規格

註釋

user@a

a

「縮寫」網域名稱。

user@a.b.c

a.b.c

「完全合格的」網域名稱 (FQDN)。

user@[0.1.2.3]

[0.1.2.3]

「網域文字」。

@a:user@b.c.d

a

包含縮寫網域名稱「路由」的源路由位址。

@a.b.c:user@d.e.f

a.b.c

源路由的位址;路由部分是完全合格的。

@[0.1.2.3]:user@d.e.f

[0.1.2.3]

源路由的位址;路由部分是網域文字。

@a,@b,@c:user@d.e.f

a

包含 a 至 b 至 c 路由的源路由位址。

@a,@[0.1.2.3]:user@b

a

在路由部分中包含網域文字的源路由位址。

user%A@B

B

此路由的非標準格式稱為「百分比入侵」。

user%A

A

 

user%A%B

B

 

user%%A%B

B

 

A!user

A

「bang 樣式」定址;通常用於 UUCP。

A!user@B

B

 

A!user%B@C

C

 

A!user%B

B

nobangoverpercent 關鍵字處於作用中;預設。

A!user%B

A

bangoverpercent 關鍵字處於作用中。

RFC 822 不會在位址中定址驚嘆號 (!) 和百分比符號 (%) 的解譯。如果 at 符號 (@) 不存在,則百分比符號通常使用與 at 符號相同的解譯方式,因此 Messaging Server MTA 採用此慣例。

重複百分比符號的特殊解譯用來允許將百分比符號作為本地使用者名稱的一部分;這在處理某些外部郵件系統位址時可能會十分有用。驚嘆號的解譯符合 RFC 976 的「bang 樣式」位址慣例,這可讓 UUCP 位址與 Messaging Server MTA 一同使用。

這些解譯的次序不是由 RFC 822 或 RFC 976 指定,因此可以使用 bangoverpercentnobangoverpercent 關鍵字來控制執行重寫的通道套用它們的次序。雖然在某些情況下替代設定可能很有用,但預設更「標準」。


建議不要在位址中使用驚嘆號 (!) 或百分比符號 (%)。


步驟 2. 掃描重寫規則

從位址中擷取第一個主機或網域規格之後,MTA 將參考重寫規則以找出處理它的方法。然後將主機/網域規格與每個規則的型樣部分 (即每個規則的左側) 進行比較。這種比較不區分大小寫。RFC 822 規定不區分大小寫。MTA 不區分大小寫,但會儘可能保留大小寫。

如果主機或網域規格不匹配任何型樣 (在這種情況下稱為「不匹配任何規則」),則主機或網域規格的第一部分 (第一個小數點之前的部分,通常是主機名稱) 將被移除並以星號 (*) 取代,然後系統將嘗試找出結果主機或網域規格的位置,但僅在配置檔案重寫規則中查找 (不查詢網域資料庫)。

如果此作業失敗,將移除第一部分並重複該程序。如果此作業也失敗了,則會移除下一個部分 (通常是子網域),然後重寫程式將重試,第一次帶星號,以後不帶星號。包含星號的所有探測僅在配置檔案重寫規則表中進行;不檢查網域資料庫。該程序將繼續進行,直至找到匹配或耗盡整個主機或網域規格。該程序的作用是,首先嘗試匹配最特殊的網域,然後匹配不太特殊和更為一般的網域。

從演算角度看,此匹配程序為:

例如,假設要重寫位址 dan@sc.cs.siroe.edu。這會導致 MTA 以給定次序查找以下型樣:

sc.cs.siroe.edu
*.cs.siroe.edu
.cs.siroe.edu
*.*.siroe.edu
.siroe.edu
*.*.*.edu
.edu
*.*.*.*
.

步驟 3. 根據範本重寫位址

一旦主機/網域規格匹配某個重寫規則,將使用此規則的範本部分對其進行重寫。範本指定三項內容:

  1. 位址的新使用者名稱。
  2. 位址的新主機/網域規格。
  3. 識別現有 MTA 通道 (到達該位址的郵件應傳送至該通道) 的通道標記

步驟 4. 完成重寫程序

一旦主機/網域規格被重寫,可能會出現以下兩種情況之一。

重寫規則失敗

如果主機/網域規格不匹配任何重寫規則,並且未提供預設規則,則 MTA 將使用規格「as-is」;例如,原始規格變成新規格和路由系統。如果位址包含無意義的主機/網域規格,則當路由系統不匹配與任何通道關聯的任何系統名稱時,將偵測到該位址,並且郵件將被退回。

重寫後的語法檢查

將重寫規則套用至位址後,將不進行其他語法檢查。這是經過深思熟慮的 ─ 它可讓您使用重寫規則將位址轉換為與 RFC 822 不相符的格式。但是,這也意味著配置檔案中的錯誤可能會導致郵件為 MTA 留下錯誤或非法的位址。

處理網域文字

在重寫程序中,系統將對網域文字進行特殊處理。如果位址網域部分中顯示的網域文字不匹配重寫規則型樣 as is,則文字將被解譯為一組以小數點分隔且由方括號包圍的字串。最右邊的字串將被移除並會重複搜尋。如果此作業不起作用,則將移除下一個字串,以此類推,直至僅剩下空括號。如果搜尋空括號失敗,則會移除整個網域文字,並且重寫將繼續處理網域位址的下一個區段 (如果有)。在網域文字的內部處理中不使用星號;若整個網域文字由星號取代,則星號的數量應與網域文字中的元素數量相符。

與一般網域或主機規格一樣,網域文字也是按照從最特定到最不特定的次序嘗試。其型樣匹配的第一個規則將是用於重寫主機或網域規格的規則。如果在規則清單中有兩個完全相同的型樣,則使用先出現的型樣。

例如,假設要重寫位址 dan@[128.6.3.40]。重寫程式將依次查找 [128.6.3.40][128.6.3.][128.6.][128.][] 以及 [*.*.*.*],最後是全匹配規則「.」


範本替換和重寫規則控制序列

透過將字元字串插入重寫位址,替換可用來重寫使用者名稱或位址,替換的值由使用的特定替換序列決定。本節包含以下小節:

例如,在以下範本中,$U 為替換序列。它導致被重寫的位址的 username 部分被替換為範本的輸出。因此,如果 jdoe@mailhost.siroe.com 被此範本重寫,則結果輸出將為 jdoe@siroe.com$U 將替換原始位址的 username 部分 jdoe

$U@siroe.com

控制序列還為給定重寫規則的適用性施加了附加條件。不僅重寫規則的型樣部分必須匹配被檢查的主機或網域規格,而且被重寫的位址的其他方面也必須滿足由控制序列設定的條件。例如,$E 控制序列要求被重寫的位址是訊息封位址,$F 控制序列要求該位址是正向定位位址。以下重寫規則僅套用至 (重寫) user@siroe.com 格式的訊息封 To: 位址:

siroe.com $U@mail.siroe.com$E$F

如果網域或主機規格匹配重寫規則的型樣部分,但是不滿足規則範本中的控制序列所施加的所有準則,則重寫規則將失敗,並且重寫程式將繼續查找其他適用的規則。

表格 11-4 中概述了範本替換和控制序列。

表格 11-4 重寫規則範本替換和控制序列的摘要  

替換序列

替換

$D

匹配的網域規格部分。

$H

不匹配的主機/網域規格部分;型樣中小數點的左側。

$L

不匹配的網域文字部分;型樣文字中小數點的右側。

$U

原始位址的使用者名稱。

$0U

原始位址的本地部分 (使用者名稱),不包括任何子位址。

$1U

原始位址本地部分 (使用者名稱) 的子位址 (如果有)。

$$

插入文字美元符號 ($)。

$%

插入文字百分比符號 (%)。

$@

插入文字 at 符號 (@)。

$\

強制材料採用小寫。

$^

強制材料採用大寫。

$_

使用原始大小寫。

$W

以隨機的唯一字串替換。

$]...[

LDAP 搜尋 URL 查詢。

$(text)

一般資料庫替換;如果查詢失敗,則規則失敗。

${...}

將指定的對映套用至所提供的字串。

$[...]

呼叫用戶提供的常式;在結果中替換。

$&n

不匹配 (或帶有萬用字元的) 主機的第 n 部分 (從 0 開始從左至右計數)。

$!n

不匹配 (或帶有萬用字元的) 主機的第 n 部分 (從 0 開始從右至左計數)。

$*n

匹配型樣的第 n 部分 (從 0 開始從左至右計數)。

$#n

匹配型樣的第 n 部分 (從 0 開始從右至左計數)。

$nD

匹配的網域規格部分,保留從 0 開始的最左端第 n 個部分。

$nH

不匹配的主機/網域規格部分,保留從 0 開始的最左端第 n 個部分。

控制序列

對重寫規則的影響

$1M

僅當通道為內部重新處理通道時才套用。

$1N

僅當通道不是內部重新處理通道時才套用。

$1~

執行所有擱置的通道匹配檢查。如果檢查失敗,將成功終止目前重寫規則範本的處理。

$A

當主機位於 at 符號的右側時套用。

$B

僅套用至標頭/內文位址。

$C channel

如果傳送至 channel,則失敗 。

$E

僅套用至訊息封位址。

$F

僅套用至正向定位的 (例如,To:) 位址。

$M channel

僅當 channel 重寫位址時套用。

$N channel

如果 channel 重寫位址,則失敗。

$P

當主機位於百分比符號右側時套用。

$Q channel

當傳送至 channel 時套用。

$R

僅套用至反向定位的 (例如,From:) 位址。

$S

當主機來自源路由時套用。

$Tnewtag

將重寫規則標記設定為 newtag。

$Vhost

如果未在 LDAP 目錄 (在 DC 樹中或作為虛擬網域) 中定義主機名稱,則失敗。如果 LDAP 搜尋逾時,則重寫型樣的剩餘項目 (在主機名稱後面的字元之後) 將由 MTA 選項字串 DOMAIN_FAILURE 取代。

$X

當主機位於驚嘆號的左側時套用。

$Zhost

如果在 LDAP 目錄 (在 DC 樹中或作為虛擬網域) 中定義了主機名稱,則失敗。如果 LDAP 搜尋逾時,則重寫型樣的剩餘項目 (在主機名稱後面的字元之後) 將由 MTA 選項字串 DOMAIN_FAILURE 取代。

$?errmsg

如果重寫失敗,則傳回 errmsg,而不是預設錯誤訊息。錯誤訊息必須為 US ASCII。

$number?errmsg

如果重寫失敗,則傳回 errmsg,而不是預設錯誤訊息,並將 SMTP 延伸錯誤代碼設定為 a.b.c

  • anumber/ 1000000 (第一個數字)
  • b 為 (number/1000) 剩餘的 1000 (數字 2 至 4 的值)
  • cnumber 剩餘的 1000 (最後三個數字的值)

以下範例將錯誤代碼設定為 3.45.89:

$3045089?the snark is a boojum

使用者名稱和子位址替換 ($U、$0U、$1U)

範本中出現的所有 $U 均由原始位址的使用者名稱 (RFC 822「本地部分」) 取代。請注意,a."b" 格式的使用者名稱將由 "a.b" 格式的使用者名稱取代,這是因為 RFC2822 將拒絕 RFC 822 的前一種語法,並期望後一種用法將來能成為強制性語法。

範本中出現的所有 $0U 將由原始位址的使用者名稱取代,不包括任何子位址和子位址指示字元 (+)。範本中出現的所有 $1U 將由原始位址的子位址和子位址指示字元 (如果有) 取代。因此請注意,$0U 和 $1U 是使用者名稱的補充,$0U$1U 與簡單的 $U 等效。

主機/網域和 IP 文字替換 ($D、$H、$nD、$nH、$L)

出現的所有 $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 查詢 URL,並且 LDAP 查詢的結果會被替換。標準 LDAP URL 在使用時會省略主機和連接埠,而是在 msg.conf 檔案 (local.ldaphostlocal.ldapport 屬性) 中指定主機和連接埠。

即,LDAP URL 應按以下方式指定,其中方括號字元 [ ] 表示 URL 的選擇性部分:

ldap:///dn[?attributes[?scope?filter]]

dn 是必需的,並且是指定搜尋基準的辨別名稱。URL 的選擇性部分 (屬性、範圍和過濾器) 會進一步細加區別要傳回的資訊。對於重寫規則,指定傳回的所需屬性可能是 mailRoutingSystem 屬性 (或某些類似的屬性)。範圍可以是任何基準 (預設)、一或子。所需的過濾器可能會請求物件 (其 mailDomain 值匹配被重寫的網域) 傳回。

如果 LDAP 目錄網目包含屬性 mailRoutingSystemmailDomain,則決定特定類型的位址路由到之系統,其可能的重寫規則可能顯示如下,其中 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

使用者名稱

一般資料庫替換,$(...)

$(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 (即,使用者名稱 = jdoe,主機/網域規格 = eng.siroe.com),且路由系統將是 siroenet

如果一般資料庫存在,則該資料庫應可由所有人讀取,以確保其正確作業。

套用指定的對映,${...}

${mapping,argument} 格式的替換用於查找並套用 MTA 對映檔案中的對映。mapping 欄位指定要使用的對映表名稱,argument 指定要傳送至對映的字串。若要重寫成功,對映必須存在並且必須在其輸出中設定 $Y 旗標;如果對映不存在或未設定 $Y,重寫將失敗。如果成功,對映結果將併入目前位置的範本,並重新延伸。

此機制可讓 MTA 重寫程序以各種複雜的方式進行延伸。例如,可以選擇性地分析和修改位址的使用者名稱部分,MTA 重寫程序通常不具有此功能。

用戶提供的常式替換,$[...]

$[image,routine,argument] 格式的替換用於查找並呼叫用戶提供的常式。在 UNIX 上運行時,MTA 使用 dlopendlsym 從共用程式庫影像中動態地載入並呼叫指定的常式。然後,將使用以下引數清單以函數的方式呼叫常式:

status := routine (argument, arglength, result, reslength)

argumentresult 是長度為 252 個位元組的字元字串緩衝區。在 UNIX 上,argumentresult 將作為指標傳送至字元字串 (例如,在 C 中作為 char*),arglengthreslength 是由參考傳送的帶符號的長整數。在輸入中,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 十分有用。

來源通道特定的重寫規則 ($M、$N)

重寫規則可以僅與特定源通道結合使用。這在縮寫名稱包含兩種含義時十分有用:

  1. 當它在到達某個通道的郵件中顯示。
  2. 當它在到達其他通道的郵件中顯示。

源通道特定的重寫與使用中的通道程式及通道關鍵字 rulesnorules 相關聯。如果在與執行重寫的 MTA 元件關聯的通道上指定了 norules,則不會執行通道特定的重寫檢查。如果在通道上指定了 rules,則將強制執行通道特定的規則檢查。關鍵字 rules 為預設。

來源通道特定的重寫與匹配給定位址的通道不關聯。它僅取決於執行重寫的 MTA 元件及該元件的通道表格項目。

通道特定的重寫檢查由規則範本部分中的 $N$M 控制序列觸發。$N 或 $M 後面的字元 (直到 at 符號 [@]、百分比符號 [%] 或後續的 $N$M$Q$C$T$?) 均被解譯為通道名稱。

例如,如果 channel 目前未執行重寫,則 $Mchannel 將導致規則失敗。如果 channel 正在執行重寫,則 $Nchannel 將導致規則失敗。可以指定多個 $M$N 子句。如果多個 $M 子句中的任何一個匹配,規則將成功。如果多個 $N 子句中的任何一個匹配,規則將失敗。

目標通道特定的重寫規則 ($C、$Q)

重寫規則的應用程式可以取決於郵件在其中形成佇列的通道。這在主機具有兩個名稱 (一個由一組主機所知,一個由其他主機所知) 時十分有用。透過使用不同的通道將郵件傳送至各群組,可以重寫位址以針對名稱為各群組所知的主機。

目標通道特定的重寫與要處理郵件並將郵件移出佇列的通道,以及該通道上的通道關鍵字 rulesnorules 關聯。如果在目標通道上指定了 norules,則不會執行通道特定的重寫檢查。如果在目標通道上指定了 rules,則將強制執行通道特定的規則檢查。關鍵字 rules 為預設。

目標通道特定的重寫與給定位址匹配的通道不關聯。它僅取決於郵件的訊息封 To: 位址。當郵件形成佇列後,將首先重寫其訊息封 To: 位址,以決定郵件在哪個通道中形成佇列。在重寫訊息封 To: 位址的過程中,將忽略任何 $C$Q 控制序列。在重寫訊息封 To: 位址並決定目標通道之後,$C$Q 控制序列才有效,因為與該郵件關聯的其他位址已重寫。

目標通道特定的重寫檢查由規則範本部分中的 $C$Q 控制序列觸發。$C$Q 後面的字元 (直到 at 符號 [@]、百分比符號 [%] 或後續的 $N$M$C$Q$T$?) 均被解譯為通道名稱。

例如,如果 channel 不是目標通道,則 $Qchannel 將導致規則失敗。再如,如果 channel 是目標通道,則 $Cchannel 將導致規則失敗。可以指定多個 $Q$C 子句。如果多個 $Q 子句中的任何一個匹配,規則將成功。如果多個 $C 子句中的任何一個匹配,規則將失敗。

方向和位置特定的重寫規則($B、$E、$F、$R)

有時,您需要指定僅套用至訊息封位址或標頭位址的重寫規則。如果被重寫的位址不是訊息封位址,則控制序列 $E 將強制重寫失敗。如果被重寫的位址不是來自郵件標頭或內文,則控制序列 $B 將強制重寫失敗。這些序列對重寫沒有其他影響,它們可以出現在重寫規則範本中的任何地方。

位址也可以按方向進行分類。正向定位的位址是源於 To:、Cc:Resent-to: 或其他標頭或訊息封行並參考目標的位址。反向定位的位址是 From:Sender:Resent-From: 之類的參考源的位址。如果位址是正向定位的,則控制序列 $F 將導致套用重寫。如果位址是反向定位的,則控制序列 $R 將導致套用重寫。

主機位置特定的重寫 ($A、$P、$S、$X)

有時需要重寫主機名稱在位址中出現的敏感位置。主機名稱可以在位址的幾個不同環境中出現:

在一般情況下,應以相同的方式處理主機名稱,而不管其出現的位置。某些情況可能需要特殊處理。

四個控制序列用於根據主機在位址中的位置來控制匹配。

如果主機位置不是指定的位置,規則將失敗。這些序列可以併入單一重寫規則。例如,如果指定了 $S$A,則規則將匹配源路由中或 at 符號右側指定的主機。不指定這些序列等同於指定所有這些序列;規則可以匹配而不用考慮位置。

變更目前標記值,$T

$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 與本地通道匹配,這可確保將 internet 從位址中移除。此時便會設定重寫標記。重寫將繼續,但由於該標記,將不會有正規規則匹配。最後,預設規則將嘗試該標記,此設定的第二個規則將啟動,強制將位址與 TCP-DAEMON 通道匹配,而不考慮其他任何準則。

控制與重寫關聯的錯誤訊息 ($?)

當重寫和通道匹配失敗時,MTA 將提供預設的錯誤訊息。在某些情況下,變更這些訊息的功能十分有用。例如,如果某人嘗試將郵件傳送至某個乙太網路路由器信箱,則使用訊息「我們的路由器無法接受郵件」將比一般的「指定了非法的主機/網域」訊息更清楚明瞭。

如果規則失敗,則可以使用一個特殊的控制序列來變更列印的錯誤訊息。序列 $? 用於指定錯誤訊息。如果本次重寫的結果不匹配任何通道,則 $? 後面的文字 (直到 at 符號 [@]、百分比符號 [%]、$N、$M、$Q、$C、$T 或 $?) 均被視為要列印的錯誤訊息文字。錯誤訊息的設定具有「黏性」,並在整個重寫程序中始終有效。

包含 $? 的規則與其他所有規則的作業方式相同。規則中僅包含 $? 的這種特殊情況需要特別注意 ─ 重寫程序將終止,而不變更電子信箱或位址的主機部分,並且系統會在通道表中查詢未經變更的主機。此查詢必定會失敗,並最終傳回錯誤訊息。

例如,假設 MTA 配置檔案中的最後重寫規則如下:

. $?Unrecognized address; contact postmaster@siroe.com

在此範例中,可能失敗的任何無法識別的主機或網域規格,均會在失敗過程中產生錯誤訊息:Unrecognized address; contact postmaster@siroe.com


處理大量重寫規則

MTA 始終從 imta.cnf 檔案讀入所有重寫規則,並將它們儲存在雜湊表的記憶體中。每次需要配置檔案中的資訊時,使用編譯的配置可以節省讀取配置檔案所需的時間;雜湊表還用於在記憶體中儲存所有的重寫規則。此方案可以滿足少量到中量的重寫規則。但是,某些站點可能需要 10,000 個或更多的重寫規則,這會消耗過多的記憶體。

MTA 提供了將大量重寫規則儲存在輔助索引的資料檔案中的選擇性功能,來解決此問題。系統讀取正規配置檔案時,MTA 將檢查網域資料庫是否存在。如果該資料庫存在,則嘗試匹配配置檔案中的規則失敗時,MTA 將開啟並查看該資料庫。僅當未在配置檔案中找到給定的規則時,網域資料庫才會被查看,因此始終可以將規則加入配置檔案以置換資料庫中的規則。依預設,網域資料庫用於儲存與託管網域關聯的重寫規則。IMTA_DOMAIN_DATABASE 屬性儲存在 imta_tailor 檔案中。資料庫的預設位置是 msg_svr_base/data/db/domaindb.db


請勿手動編輯此檔案。



測試重寫規則

您可以使用 imsimta test -rewrite 指令測試重寫規則。-noimage 修飾符可讓您在重新編譯新配置之前,測試對配置檔案所作的變更。

您會發現使用這個帶有 -debug 修飾符的公用程式來重寫一些位址十分有用。以下將逐步為您顯示如何重寫位址。例如,發出以下指令:

% imsimta test -rewrite -debug joe@siroe.com

如需 imsimta test -rewrite 公用程式的詳細描述,請參閱「Messaging Server Reference Manual」


重寫規則範例

以下範例提供了範例重寫規則以及規則如何重寫範例位址。

假設系統 SC.CS.SIROE.EDU 的配置檔案中包含以下範例中顯示的重寫規則:

sc                     $U@sc.cs.siroe.edu

sc1                    $U@sc1.cs.siroe.edu

sc2                    $U@sc2.cs.siroe.edu

*                      $U%$&0.cs.siroe.edu

*.cs                   $U%$&0.cs.siroe.edu

*.cs.siroe             $U%$&0.cs.siroe.edu

*.cs.siroe.edu         $U%$&0.cs.siroe.edu@ds.adm.siroe.edu

sc.cs.siroe.edu        $U@$D

sc1.cs.siroe.edu       $U@$D

sc2.cs.siroe.edu       $U@$D

sd.cs.siroe.edu        $U@sd.cs.siroe.edu

.siroe.edu             $U%$H.siroe.edu@cds.adm.siroe.edu

.edu                   $U@$H$D@gate.adm.siroe.edu

[]                     $U@[$L]@gate.adm.siroe.edu

表格 11-7 中顯示了某些範例位址,以及如何根據重寫規則對它們進行重寫和路由。

表格 11-7 範例位址和重寫

初始位址

重寫為

路由至

user@sc

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sc.cs

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1.cs

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2.cs

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sc.cs.siroe

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1.cs.siroe

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2.cs.siroe

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sc.cs.siroe.edu

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1.cs.siroe.edu

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2.cs.siroe.edu

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sd.cs.siroe.edu

user@sd.cs.siroe.edu

sd.cs.siroe.edu

user@aa.cs.siroe.edu

user@aa.cs.siroe.edu

ds.adm.siroe.edu

user@a.eng.siroe.edu

user@a.eng.siroe.edu

cds.adm.siroe.edu

user@a.cs.sesta.edu

user@a.cs.sesta.edu

gate.adm.siroe.edu
─ 插入路由

user@b.cs.sesta.edu

user@b.cs.sesta.edu

gate.adm.siroe.edu
─ 插入路由

user@[1.2.3.4]

user@[1.2.3.4]

gate.adm.siroe.edu
─ 插入路由

基本上,這些重寫規則的意思是:如果主機名稱是我們的縮寫名稱 (scsc1sc2) 之一,或者是我們的完整名稱 (sc.cs.siroe.edu 等) 之一,則將其延伸至完整名稱,並路由給我們。將 cs.cmu.edu 附加至一部分縮寫名稱並重試。將後面是 .cs 的一部分轉換為後面是 .cs.siroe.edu 的一部分,並重試。還可以將 .cs.siroe 轉換為 .cs.siroe.edu,並重試。

如果名稱為 sd.cs.siroe.edu (可能是我們直接連接至的某些系統),則重寫並將其路由至那裡。如果主機名稱是 .cs.siroe.edu 子網域中的其他名稱,則將其路由至 ds.cs.siroe.edu (.cs.siroe.edu 子網域的閘道)。如果主機名稱是 .siroe.edu 子網域中的其他名稱,則將其路由至 cds.adm.siroe.edu (.siroe.edu 子網域的閘道)。如果主機名稱是 .edu 頂層網域中的其他名稱,則將其路由至 gate.adm.siroe.edu (它應可以將郵件路由至正確的目標)。如果使用網域文字,則也可以將其傳送至 gate.adm.siroe.edu

重寫規則的大多數應用程式 (如先前的範例所示) 將不會以任何方式變更位址的使用者名稱 (或電子信箱) 部分。使用 MTA 與不符合 RFC 822 的郵寄者 (必須將主機/網域規格部分加入位址的使用者名稱部分) 聯絡時,可以使用變更位址的使用者名稱部分的功能。使用此功能時應十分小心。



上一個      目錄      索引      下一個     


Copyright 2004 Sun Microsystems, Inc.。版權所有。