位址轉換和路由程序首先會從 user@domain 形式的位址開始檢查 domain 是否位於本機。本節包含以下小節:
MTA 重寫規則機制中增加了一項功能,可用於檢查指定字串以確定其是否為需要在本機進行處理的網域。這項新功能透過 $V 或 $Z 中介字元啟動。這些新的中介字元在語法結構上類似於現有的 $N、$M、$Q 以及 $C 中介字元,也就是它們後面都跟有式樣字串。如果是 $N、$M、$Q 以及 $C,則式樣要符合來源通道或目標通道。如果是 $V 和 $Z,則式樣要為一個網域,並且系統會檢查該網域是否位於本機。$V 會導致用於非本機網域的規則失敗,而 $Z 會導致用於本機網域的規則失敗。
這些中介字元的處理按照以下程序進行:
Messaging Server 進行檢查以查看目前網域是否與目錄中有效的網域項目相符。如果不存在項目,則移至步驟 3。
如果網域在目錄中有項目,則會從網域項目中擷取 LDAP_DOMAIN_ATTR_ROUTING_HOSTS MTA 選項 (預設 mailRoutingHosts) 所指定的屬性。如果該屬性存在,便會列出能夠處理該網域中使用者的一組主機。此清單會與 local.hostname configutil 參數指定的主機以及 local.imta.hostnamealiases configutil 參數指定的主機清單進行對照。這些選項可以分別由 LDAP_LOCAL_HOST 和 LDAP_HOST_ALIAS_LIST MTA 選項覆寫。如果存在相符項目或網域中不存在該屬性,則該網域為本機。如果不存在相符項目,則該網域為非本機。
由於 mailRoutingHosts 屬性而被視為非本機的網域處理取決於 ROUTE_TO_ROUTING_HOST MTA 選項的設定。如果該選項設定為 0 (預設),則位址只會被作為非本機進行處理,而 MTA 重寫規則被用於確定路由。如果該選項設定為 1,則 LDAP_DOMAIN_ATTR_ROUTING_HOSTS MTA 選項列出的第一個值組成的來源路由會置於位址之前。
如果找不到網域項目,請移除網域左側的一個元件並移至步驟 1。如果沒有剩餘任何元件,請繼續執行步驟 4。
這種向上回溯網域樹狀結構的結果是,如果 siroe.com 被識別為本機,則 siroe.com 的任何子網域都將被識別為本機。有時可能不希望發生這種情況,因此我們提供 MTA 選項 DOMAIN_UPLEVEL 來控制此運作方式。具體來說,DOMAIN_UPLEVEL 的位元 0 (值 = 1) (如果清除) 可停用使用已移除網域元件進行的重試。DOMAIN_UPLEVEL 的預設值為 0。
現在需要執行虛名網域檢查。虛名網域不包含網域項目,更確切地說,它們是透過附加特殊網域屬性到一個或多個使用者項目而指定的。虛名網域檢查的執行方法是,使用 DOMAIN_MATCH_URL MTA 選項指定的 LDAP URL 來執行 LDAP 搜尋。該選項的值應設定為:
ldap:///$B?msgVanityDomain?sub?(msgVanityDomain=$D)
$B 可替換 local.ugldapbasedn configutil 參數的值;這個值為目錄中使用者樹狀結構的基底目錄。LDAP_USER_ROOT MTA 選項可用以覆寫該 configutil 選項專用於 MTA 的值。
由此搜尋傳回的實際值無關緊要。重要的是是否傳回值。如果傳回值,則該網域被視為本機;如果未傳回值,則該網域被視為非本機。
另請注意,為尋找目錄中有效的網域項目執行了哪些步驟。這些步驟是模式層級特定的。如果是 Sun LDAP Schema 1,則步驟為:
將網域轉換成網域樹中的基底 DN。執行方法是將網域轉換成一系列元件,然後加入網域根字尾。預設字尾取自 service.dcroot configutil 參數。預設字尾為 o=internet。因此,a.b.c.d 形式的網域通常會轉換成 dc=a,dc=b,dc=c,dc=d,o=internet。 透過設定 LDAP_DOMAIN_ROOT MTA 選項,可以覆寫 service.dcroot configutil 參數。
查詢包含步驟 1 中的基底 DN 以及物件類別 inetDomain 或 inetDomainAlias 的項目。透過設定 LDAP_DOMAIN_FILTER_SCHEMA1 MTA 選項 (預設為 (|(objectclass=inetDomain)(objectclass=inetdomainalias)),可以覆寫用於此用途的搜尋篩選器。
如果找不到任何項目,則以失敗告終。
如果找到的項目之物件類別為 inetDomain,請檢查以確認該項目具有與網域項目關聯的 inetDomainBaseDn 屬性。如果它存在,則其被儲存以用於以後的使用者項目搜尋,並且處理作業將終止。如果它不存在,則假設該項目為網域別名,並且處理將繼續進行步驟 5。MTA 選項 LDAP_DOMAIN_ATTR_BASEDN 可用以覆寫 inetDomainBaseDN 的使用。
該項目必須為網域別名;請查詢由 aliasedObjectName 屬性參照的新項目,並返回步驟 4。如果存在非 aliasedObjectName 屬性,則處理會終止並顯示失敗。可由 MTA 選項 LDAP_DOMAIN_ATTR_ALIAS 來指定使用 aliasedObjectName 屬性的替代方法。
請注意,處理作業最多只能返回步驟 4 一次;不允許網域別名指向網域別名。
在 Sun LDAP Schema 2 中,所採取的動作更為簡單:在目錄中搜尋包含物件類別為 sunManagedOrganization 的項目,其中網域顯示為 sunPreferredDomain 或 associatedDomain 屬性的值。如果需要,可分別使用 MTA 選項 LDAP_ATTR_DOMAIN1_SCHEMA2 和 LDAP_ATTR_DOMAIN2_SCHEMA2 覆寫用於此用途的 sunPreferredDomain 和 associatedDomain 屬性之使用。此搜尋在 service.dcroot configutil 參數所指定的根下進行。透過設定 LDAP_DOMAIN_ROOT MTA 選項,可以覆寫 service.dcroot configutil 參數。此外,Schema 2 中的網域項目無需具有 inetDomainBaseDn 屬性﹔如果它們不具有該屬性,則假設使用者樹狀結構的基底目錄為網域項目本身。
有兩個 MTA 選項支援在使用者基底網域名稱進行更有效的網域查詢。一個是 LDAP_BASEDN_FILTER_SCHEMA1,這個字串指定執行使用者基底網域名稱搜尋時,用來識別 Schema 1 網域的篩選器。如果指定該 MTA 選項,則預設值是 LDAP_DOMAIN_FILTER_SCHEMA1 的值。如果未指定任一選項,則預設值是 (objectclass=inetDomain)。LDAP_BASEDN_FILTER_SCHEMA2 是指定執行使用者基底網域名稱搜尋時用來識別 Schema 2 網域的額外篩選器元素。如果指定該 MTA 選項,則預設值是 LDAP_DOMAIN_FILTER_SCHEMA2 的值。如果未指定任一選項,則預設值是空字串。
由於網域重寫作業執行的頻率和目錄查詢 (尤其是虛名網域檢查) 的耗用,有關網域的消極指示和積極指示都需要快取。這項作業透過記憶體中開放式鏈接的動態延伸雜湊表來實作。快取記憶體的最大容量由 DOMAIN_MATCH_CACHE_SIZE MTA 選項設定 (預設 100000),快取記憶體中項目的逾時由 DOMAIN_MATCH_CACHE_TIMEOUT MTA 選項設定 (預設 600 秒)。
必須仔細處理此程序期間發生的暫時性伺服器故障,因為當這些故障發生時,我們不可能知曉指定的網域是否為本機。在這種情況下,基本上可能有兩種結果:
傳回暫時性 (4xx) 錯誤至用戶端,告知用戶端稍後再嘗試該位址。
接受該位址,但使其在重新處理通道中排入佇列,以便稍後可以在本機重試該位址。
任何一個選項都不能適用於所有情況。例如,在與遠端 SMTP 轉送器對話時結果 1 適用。但在處理來自本機使用者的 SMTP 提交作業時結果 2 適用。
雖然在理論上可以使用具有同一式樣的多個規則來處理暫時性故障,但重複此類查詢所耗用的時間 (即使使用適當的快取記憶體) 實在難以接受。由於這些原因,網域重寫作業的這種簡單的成功/失敗至下一規則比對模型是不夠的。而在網域查詢失敗的情況下,應使用由 MTA 選項 DOMAIN_FAILURE 所指定的特殊範本。$V 作業失敗時,該範本會替代正在處理的目前重寫規則範本的剩餘項目。
需要在其他重寫規則有機會運作之前執行此網域檢查。在規則的左側使用特殊的 $* 可確保這種排序。$* 式樣在任何其他規則之前接受檢查。
如果要考量目前為止所說明的所有機制,在 imta.cnf 中需要新的重寫規則:
$* $E$F$U%$H$V$H@localhost
並且在 option.dat 檔案中 DOMAIN_FAILURE MTA 選項的值需為:
reprocess-daemon$Mtcp_local$1M$1~-error$4000000?Temporary lookup failure
在此重寫規則中,localhost 是與本機通道相關的主機名稱。此處所示的 DOMAIN_FAILURE 選項的值為預設值,因此,一般情況下不必在 option.dat 中顯示。
此處的排序尤其微妙。MTA 會在重建位址之後、增加路由之前檢查 $V。這可讓 MTA 在發生暫時性查詢故障的情況下變更路由。插入點發生變更時即會套用擱置通道相符檢查,因此第二個 $H 之後的 @ 會呼叫該檢查。如果檢查成功,則套用範本的剩餘項目並結束重寫處理。如果檢查失敗,則重寫失敗且重寫作業繼續執行下一個可套用的重寫規則。如果因暫時性失敗而導致無法執行檢查,範本處理會使用由 DOMAIN_FAILURE MTA 選項指定的值繼續進行。此範本的值首先將路由主機設定為 reprocess-daemon。然後,此範本會檢查 MTA 是否正在處理 tcp_local 或某種重新處理通道。如果 MTA 正在處理此類通道,則該規則繼續,使路由主機變為非法並指定一個暫時性故障作為結果。如果 MTA 未在處理此類通道,該規則會被截斷並成功終止,因此將位址重寫至重新處理通道。