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

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

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

例如,在以下範本中,$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