Sun Java System Messaging Server 6 2005Q4 管理指南

第 11 章 配置重寫規則

本章說明如何在 imta.cnf 檔案中配置重寫規則。如果您尚未閱讀第 10 章, 關於 MTA 服務和配置,則應先閱讀該章,然後再閱讀本章。

本章包含以下各節:

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

開始之前

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

如需編譯配置資訊和啟動程式的更多資訊,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」

重寫規則結構

重寫規則位於 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 必須顯示在規則的結尾。如需有關控制項的更多資訊,請參閱範本替換和重寫規則控制序列

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

重寫規則式樣和標記

本節包含以下小節:

大多數重寫規則式樣由僅與主機匹配的特定主機名稱,或與整個子網域中所有主機/網域均匹配的子網域式樣組成。

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

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 還包括標記的概念,這些標記可能會出現在重寫規則式樣中。如果位址被重寫多次,並且根據先前的重寫,必須透過控制與該位址匹配的重寫規則以在後續的重寫中進行區別的情況下,需要使用這些標記。如需更多資訊,請參閱標記的重寫規則集

匹配百分比入侵的規則

如果 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 

處理為 A%B@B。一般重寫範本 A%B@C 或 A@B

A%B@C 

A 將成為新使用者/電子信箱名稱,B 將成為新主機/網域規格,路由至與主機 C 關聯的通道。一般重寫範本 A%B@C 或 A@B

A@B@C 

處理為 A@B@C@C。指定的路由重寫範本 A@B@C@D 或 A@B@C

A@B@C@D 

A 將成為新使用者/電子信箱名稱,B 將成為新主機/網域規格,將 C 做為來源路由插入,路由至與主機 D 關聯的通道。指定的路由重寫範本 A@B@C@D 或 A@B@C

一般重寫範本 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 指令的更多資訊,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」

指定的路由重寫範本 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 如何將重寫規則套用至位址

以下步驟描述 MTA 如何將重寫規則套用至給定位址:

  1. MTA 從位址中擷取第一個主機或網域規格。

    一個位址可以指定多個主機或網域名稱,如下例所示:

    jdoe%hostname@siroe.com.

  2. 識別第一個主機或網域名稱後,MTA 會執行搜尋,掃描重寫規則匹配主機或網域名稱的式樣。

  3. 找到匹配的重寫規則後,MTA 將根據此規則的範本部分重寫位址。

  4. 最後,MTA 會將通道標記和與每個通道關聯的主機名稱相比較。

    如果找到匹配的通道,MTA 會將郵件形成佇列,傳送至關聯的通道;否則重寫程式會失敗。如果匹配的通道是本地通道,則可以透過查詢別名資料庫和 Alias 檔案來對位址進行額外重寫。

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


備註 –

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


步驟 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

來源路由的位址,具有縮寫網域名稱「route」。

@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 將使用規格「現狀」;例如,原始規格同時成為新規格和路由系統。如果位址包含無意義的主機/網域規格,則當路由系統不匹配與任何通道關聯的任何系統名稱時,將偵測到該位址,並且郵件將被退回。

重寫後的語法檢查

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

處理網域文字

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

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

例如,假設要重寫位址 dan@[128.6.3.40]。重寫程式搜尋 [128.6.3.40][128.6.3.][128.6.][128.][][*.*.*.*],然後最終搜尋匹配全部規則「.」

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

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

例如,在以下範本中,$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 重寫規則範本替換和控制序列的摘要

替換序列 

替換 

$D

匹配的網域規格部分。 

$H

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

$L

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

$U

原始位址的使用者名稱。 

$nA 

插入從位置 0 開始的目前位址的左邊第 n 個字元。如果省略了 n,則插入整個位址。 

$nX 

插入從 0 開始的郵件主機的左邊第 n 個元件。如果 n 省略,則插入整個郵件主機。 

$0U 

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

$1U 

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

$$

插入文字美元符號 ($)

$%

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

$@

插入文字 at 符號 (@)。

$\

強制材料採用小寫。 

$^

強制材料採用大寫。 

$_

使用原始大小寫。 

$=

強制後續替換的字元承擔適當的配額作業以便插入 LDAP 搜尋篩選器。 

$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 

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

$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

使用者名稱 

現在,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 使用 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 為預設。

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

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

例如,如果通道目前未執行重寫,則 $M 通道將導致規則失敗。如果通道正在執行重寫,則 $N 通道將導致規則失敗。可以指定多個 $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$? 的字元會被解譯為通道名稱。

例如,如果通道不是目標通道,則 $Q 通道將導致規則失敗。例如,如果通道是目標通道,則 $C 通道將導致規則失敗。可以指定多個 $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 從位址中移除。此時便會設定重寫標記。重寫將繼續,但由於該標記,將不會有正規規則匹配。最後,預設規則將嘗試該標記,此設定的第二個規則將啟動,強制將位址與 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 公用程式的詳細說明,請參閱「Sun Java System Messaging Server 6 2005Q4 Administration Reference」

重寫規則範例

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

假設系統 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—route inserted 

user@b.cs.sesta.edu 

user@b.cs.sesta.edu 

gate.adm.siroe.edu—route inserted 

user@[1.2.3.4] 

user@[1.2.3.4] 

gate.adm.siroe.edu—route inserted 

基本上這些重寫規則的意思是:如果主機名稱是我們的縮寫名稱 (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 的郵寄者 (必須將主機/網域規格部分加入位址的使用者名稱部分) 聯絡時,可以使用變更位址的使用者名稱部分的功能。使用此功能時應十分小心。