Sun ONE Messaging Server 6.0 管理員指南 |
第 7 章
使用直接 LDAP 進行位址轉譯和路由在版次 6.0 之前的版次中,Messaging Server 通常從由儲存在 LDAP 伺服器中的資訊編譯而來的資料庫中存取所有使用者、網域和群組資料。LDAP 伺服器中的目錄資訊更新時,資料庫資訊會透過名為 dirsync 的程式同步更新。Sun ONE Messaging Server MTA 現在可直接存取 LDAP 目錄。本章描述在 MTA 中使用直接 LDAP 資料存取的資料流程。本章包含以下各節:
直接 LDAP 演算法與實施以下各節描述直接 LDAP 處理作業。
確定網域位置
位址轉譯和路由程序首先會從 user@domain 形式的位址開始檢查「domain」是否為本地。
重寫規則機制
MTA 重寫規則機制中新增了一項功能,可用於檢查給定字串是否為需要在本地進行處理的網域。這項新功能由 $V 或 $Z 圖元字元啟動。這些新的圖元字元在語法結構上類似於現有的 $N、$M、$Q 以及 $C 圖元字元,也就是說,它們後面都跟有型樣字串。如果是 $N、$M、$Q 以及 $C,型樣要符合來源通道或目標通道。如果是 $V 和 $Z,型樣要為一個網域,並且系統會檢查該網域是否為本地。$V 會導致用於非本地網域的規則失敗,而 $Z 會導致用於本地網域的規則失敗。
這些圖元字元的處理按照以下程序進行:
- 使用目前網域作為引數呼叫 dmap_locate_domain。如果呼叫成功,則該網域為本地。請注意,呼叫的實際結果無關緊要,我們只需要關心該網域對於我們是否已知。
- 如果基本 DN 確定成功,則擷取由 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 選項列出的第一個值組成的來源路徑會置於位址之前。
- 如果基本 DN 確定失敗,請移除網域左側的一個元件並移至步驟 1。如果沒有剩餘任何元件,請繼續執行步驟 4。
這種向上回溯網域樹的結果是,如果 domain.com 被識別為本地,則 domain.com 的任何子網域都將被識別為本地。您有時可能不希望發生這種情況,因此我們提供 MTA 選項 DOMAIN_UPLEVEL 來控制這種運作方式。具體來說,DOMAIN_UPLEVEL 的位元 0 (值 = 1) (如果清除) 可停用使用已移除網域元件進行重試。DOMAIN_UPLEVEL 的預設值為 0。
- 現在需要執行虛名網域檢查。執行方法是,使用 DOMAIN_MATCH_URL MTA 選項指定的 LDAP URL 來執行 LDAP 搜尋。該選項的值應設定為:
確定網域位置的網域對映
另請注意,哪些特定的步驟是由 domainMap_get_namespace 或 dmap_locate_domain 呼叫所執行的。這些步驟是綱目級別特定的。如果是 Sun ONE LDAP Schema v.1,步驟為:
- 將網域轉換成網域樹中的基本 DN。執行方法是,將網域轉換成一系列 dc 元件,然後加入網域根字尾。預設字尾取自 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 屬性的值。網域對映 API 會檢查 inetDomainBaseDn 屬性是否存在。如果存在,則使用該屬性;如果不存在,則將該項目假定為網域別名。MTA 選項 LDAP_DOMAIN_ATTR_BASEDN 可用於置換 inetDomainBaseDN 的使用。
- 如果找到的項目之物件類別為 inetDomainAlias,請查找由 aliasedObjectName 屬性參考的項目。這一新項目必須具有 inetDomainBaseDN 屬性的物件類別。替代 aliasedObjectName 屬性的使用可由 MTA 選項 LDAP_DOMAIN_ATTR_ALIAS 來指定。
- 如果別名項目查找成功,則為新項目傳回 inetDomainBaseDn 屬性的值。
dmap_locate_domain 呼叫還支援 Sun ONE LDAP Schema v.2。在 Sun ONE LDAP Schema v.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 參數。
網域位置資訊的快取
由於網域重寫作業執行的頻率和目錄查詢 (尤其是虛名網域檢查) 的耗用,有關網域的消極指示和積極指示都需要快取。這項作業透過記憶體中開放式鏈接的動態延伸雜湊表來實施。快取記憶體的最大容量由 DOMAIN_MATCH_CACHE_SIZE MTA 選項設定 (預設 100000),快取記憶體中項目的逾時由 DOMAIN_MATCH_CACHE_TIMEOUT MTA 選項設定 (預設 600 秒)。
錯誤處理
必須仔細處理此程序期間發生的暫時性伺服器故障,因為當這些故障發生時,我們不可能知曉給定的網域是否為本地。在這種情況下,基本上可能有兩種結果:
任何一個選項都不能適用於所有情況。例如,在與遠端 SMTP 中繼器對話時結果 1 適用。但在處理來自本地使用者的 SMTP 提交作業時結果 2 適用。
雖然在理論上可以使用具有同一型樣的多個規則來處理暫時性故障,但重複此類查詢所耗用的時間 (即使使用適當的快取記憶體) 實在難以接受。由於這些原因,網域重寫作業的這種簡單的成功/失敗至下一規則匹配模型是不夠的。在網域查找發生故障的情況下,應使用由 MTA 選項 DOMAIN_FAILURE 指定的特殊範本。當 $V 作業失敗時,該範本會取代正在處理的目前重寫規則範本的剩餘項目。
除了 $V 和 $Z 之外,重寫規則功能中還新增了其他數個新的圖元字元:
網域檢查重寫規則的型樣
需要在其他重寫規則有機會運作之前執行此網域檢查。在規則的左側使用特殊的 $* 可確保這種排序。$* 型樣在任何其他規則之前接受檢查。
綜合全部
如果要考量目前為止所述的全部機制,在 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 未在處理此類通道,該規則會被截斷並成功終止,因此將位址重寫至重新處理通道。
本地位址的別名延伸
當某個位址被確定為與本地通道關聯後,系統將自動對其進行別名延伸。別名延伸程序會檢查大量資訊來源,包括:
所檢查的確切別名來源以及檢查的次序取決於 option.dat 檔案中 ALIAS_MAGIC MTA 選項的設定。對於直接 LDAP,請將此選項設定為 8764。這意味著首先檢查由 ALIAS_URL0 MTA 選項指定的 URL,然後檢查由 ALIAS_URL1 MTA 選項指定的 URL,再檢查由 ALIAS_URL2 MTA 選項指定的 URL,最後檢查別名檔案。此設定在作用中時,不檢查別名資料庫。
使用 LDAP URL 檢查別名
對 LDAP 中別名的檢查透過指定兩個特殊的 LDAP URL 作為別名 URL 來實施。第一個別名 URL 處理一般使用者和群組,隨後的別名 URL 處理虛名網域。指定第一個 URL 為 ALIAS_URL0:
ALIAS_URL0=ldap:///$V?*?sub?$R
$V 圖元字元
圖元字元延伸發生在 URL 查找之前。ALIAS_URL0 的值中使用的兩個圖元字元分別為 $V 和 $R。
$V 圖元字元可將位址的網域部分轉換成基本 DN。這類似於 $V 重寫規則圖元字元所執行的初始步驟 (先前已在「重寫規則機制」一節中描述)。$V 處理作業包括以下步驟:
- 透過呼叫 dmap_locate_domain/dmap_get_base_dn 取得目前網域的基本 DN。
- 透過呼叫 dmap_get_canonical_name 取得與目前網域相關的標準網域。在 Sun ONE LDAP Schema v.1 中,如果網域項目具有 inetCanonicalDomainName 屬性,則標準網域名稱由該屬性提供。如果沒有該屬性,標準名稱則以簡易方式從實際網域項目的 DN 建構而成。當目前網域為別名時,標準名稱與目前網域會有所不同。用於儲存標準名稱的名稱屬性可由 option.dat 檔案中的 LDAP_DOMAIN_ATTR_CANONICAL MTA 選項來置換。
在 Sun ONE LDAP Schema v.2 中,標準名稱即為 SunPreferredDomain 屬性的值。
- 如果基本 DN 存在,將其替換為代替 $V 的 URL。
- 現在確定適用於此項目的所有託管網域。執行方法是,比較標準網域 (如果清除 DOMAIN_UPLEVEL 的位元 2 [值 = 4]) 或目前網域 (如果設定 DOMAIN_UPLEVEL 的位元 2 [值 = 4]) 與 service.defaultdomain configutil 參數。如果不相符,則該項目為託管網域的成員。透過設定 option.dat 檔案中的 LDAP_DEFAULT_DOMAIN MTA 選項,可以置換 service.defaultdomain configutil 參數。
- 如果基本 DN 確定失敗,請移除網域左側的一個元件並移至步驟 1。如果沒有剩餘任何元件,則替換失敗。
$V 還接受可選的數值引數。如果該引數設定為 1 (例如,$1V),則忽略解析網域樹中的網域時發生的故障,並傳回使用者樹的基本目錄。
如果嘗試擷取網域基本 DN 成功,MTA 還會擷取數個日後將會需要的有用的網域屬性。此作業透過呼叫 domainMap_get_value 來完成。所擷取的屬性名稱由 option.dat 檔案中的以下 MTA 選項設定:
- LDAP_DOMAIN_ATTR_UID_SEPARATOR (預設為 domainUidSeparator)
- LDAP_DOMAIN_ATTR_SMARTHOST (預設為 mailRoutingSmartHost)
- LDAP_DOMAIN_ATTR_CATCHALL_ADDRESS (預設為 mailDomainCatchallAddress)
- LDAP_DOMAIN_ATTR_BLOCKLIMIT (預設為 mailDomainMsgMaxBlocks)
- LDAP_DOMAIN_ATTR_REPORT_ADDRESS (預設為 mailDomainReportAddress)
- LDAP_DOMAIN_ATTR_STATUS (預設為 inetDomainStatus)
- LDAP_DOMAIN_ATTR_MAIL_STATUS (預設為 mailDomainStatus)
- LDAP_DOMAIN_ATTR_CONVERSION_TAG (預設為 mailDomainConversionTag)
- LDAP_DOMAIN_ATTR_FILTER (預設為 mailDomainSieveRuleSource)
- LDAP_DOMAIN_ATTR_DISK_QUOTA (無預設)
- LDAP_DOMAIN_ATTR_MESSAGE_QUOTA (無預設)
- LDAP_DOMAIN_ATTR_AUTOREPLY_TIMEOUT (無預設)
- LDAP_DOMAIN_ATTR_OPTIN (無預設)
- LDAP_DOMAIN_ATTR_PRESENCE (無預設)
- LDAP_DOMAIN_ATTR_AUTOSECRETARY (無預設)
- LDAP_DOMAIN_ATTR_RECIPIENTLIMIT (無預設)
- LDAP_DOMAIN_ATTR_RECIPIENTCUTOFF (無預設)
- LDAP_DOMAIN_ATTR_SOURCEBLOCKLIMIT (無預設)
從 URL 呼叫對映
在有些特殊情況下,需要以其他方式執行從網域至基本 DN 的對映。為適應此類設定,URL 解析程序提供了呼叫 MTA 對映的功能。該功能透過一個圖元字元序列來執行,其一般形式為:
$|/mapping-name/mapping-argument|
雙引號 (") 可啟動和終止呼叫。緊接 $ 之後的字元為對映名稱與引數之間的分隔符號;所選擇的字元應與對映名稱或引數中使用的預期字元值不發生衝突。
$R 圖元字元
$R 圖元字元可為 URL 提供適當的過濾器。其目的是產生一個過濾器,用於搜尋可能包含特定使用者或群組之電子郵件位址的所有屬性。要搜尋的屬性清單來自 configutil 參數 local.imta.mailaliases。如果未設定此參數,則會檢查 local.imta.schematag configutil 參數,並根據其值選擇一組適當的預設屬性,如下所示:
sims401mail, rfc822mailalias
nms41mail,mailAlternateAddress
ims50mail,mailAlternateAddress,mailEquivalentAddress
local.imta.schematag 的值可以是一個以逗號分隔的清單。如果支援多個綱目,則可使用屬性的組合清單 (重複屬性要排除)。LDAP_SCHEMATAG MTA 選項可用於置換 local.imta.schematag 專用於 MTA 的設定。
此外,過濾器不僅搜尋最初提供的位址,還搜尋具有同一本地部分但網域實際在網域樹中找到的位址 (在「$V 圖元字元」一節的步驟 2 中儲存)。網域樹查找的反覆性意味著這兩個位址可以不同。這項額外的檢查由 option.dat 檔案中 DOMAIN_UPLEVEL MTA 選項的位元 1 (值 = 2) 來控制。設定此位元會啟用額外的位址檢查。DOMAIN_UPLEVEL 的預設值為 0。
例如,假定網域 siroe.com 顯示在網域樹中。假定強制使用 Sun ONE LDAP Schema v.1,查找位址
u@host1.siroe.com
由 $R 的延伸和 ims50 schematag 所產生的過濾器如下所示:
(|(mail=u@siroe.com)
(mail=u@host1.siroe.com)
(mailAlternateAddress=u@siroe.com)
(mailAlternateAddress=u@host1.siroe.com)
(mailEquivalentAddress=u@siroe.com)
(mailEquivalentAddress=u@host1.siroe.com))另一方面,如果 DOMAIN_UPLEVEL 設定為 1 而非 3,則過濾器如下所示:
(|(mail=u@host1.siroe.com)
(mailAlternateAddress=u@host1.siroe.com)
(mailEquivalentAddress=u@host1.siroe.com))ALLOW_UNQUOTED_ADDRS_VIOLATE_RFC2798 MTA 選項
有些 MTA 對於位址加引號和標準化極為寬鬆。尤其是,它們允許使用 a..b@siroe.com 之類的非法位址。更糟的是,在目錄中搜尋該位址之前,它們無法加入必要的引號,使該位址轉換成合法位址 "a..b"@siroe.com。
option.dat 檔案中的 ALLOW_UNQUOTED_ADDRS_VIOLATE_RFC2798 MTA 選項可適應這種違反標準的特殊情況。如果設定為 1,該選項會新增額外的過濾器項目,以搜尋加引號的位址中在語法結構上無效的未加引號形式。例如,搜尋 "a..b"@siroe.com 位址可以產生以下形式的過濾器:
(|(mail=”a..b”@siroe.com)
(mail=a..b@siroe.com)
(mailAlternateAddress=”a..b”@siroe.com)
(mailAlternateAddress=a..b@siroe.com)
(mailEquivalentAddress=”a..b”@siroe.com)
(mailEquivalentAddress=a..b@siroe.com))該選項並不解決因使用非法位址而導致的問題。相關電子郵件和目錄標準依位址的本地部分中允許使用的內容而定。當各個郵件傳送元件都以語法結構上非法的位址形式呈現時,這些元件可以不同的方式運作。它們可以為此類位址加上引號,使其合法;可以通過此類位址且不採用任何變更;可以拒絕此類位址,或者執行完全難以預料的作業。因此,如果為一般使用者提供此類非法位址,他們可能會發現,在其他供應商提供的郵件傳送系統上,該位址不起作用。
確定要取回的屬性
如果 URL 為要傳回的屬性清單指定 *,則可使用 MTA 能夠使用的屬性清單來取代星號。
處理 LDAP 錯誤
在此處,結果 URL 可用於執行 LDAP 搜尋。如果發生某種 LDAP 錯誤,處理作業會終止,並顯示暫時性故障的指示 (SMTP 中的 4xx 錯誤)。如果 LDAP 作業成功但無法產生結果,系統會檢查從 LDAP_DOMAIN_ATTR_CATCHALL_ADDRESS MTA 選項擷取的網域之 catchall 位址屬性。如果已設定該屬性,其值會取代目前位址。
如果沒有設定 catchall 位址屬性,系統會檢查從 LDAP_DOMAIN_ATTR_SMARTHOST MTA 選項擷取的網域之 smarthost 屬性。如果已設定該屬性,則建立
@smarthost:user@domain
形式的位址,而別名處理作業會成功終止並顯示此結果。此外,取自 LDAP_DOMAIN_ATTR_CONVERSION_TAG MTA 選項的網域之轉換標記 (如果有) 將會附加至該位址,以在轉寄給智慧主機之前完成轉換。如果該網域沒有 catchall 位址或智慧主機,此別名 URL 的處理作業將以失敗告終。
對 LDAP 結果的正常性檢查
LDAP 搜尋傳回結果後,系統將檢查該結果,以驗證其中是否只有一個項目。如果有多個項目,系統會檢查每個項目是否具有用於使用者或群組的正確物件類別、非刪除狀態以及用於使用者的 UID。未通過該檢查的項目會被忽略。如果多個項目的清單透過此檢查縮減為一個項目,處理作業將繼續。如果沒有,則傳回錯誤,指明目錄重複或模糊。
支援虛名網域
ALIAS_URL0 檢查適用於普通使用者或託管網域中的使用者。如果檢查失敗,還會執行虛名網域檢查。此檢查透過以下別名 URL 完成:
ALIAS_URL1=ldap:///$B?*?sub?(&(msgVanityDomain=$D)$R)
支援 Catchall 位址
最後,需要在 mailAlternateAddress 屬性中對 @host 形式的 catchall 位址執行檢查。在託管網域和虛名網域中均允許使用這種萬用字元形式,因此其正確的別名 URL 為:
ALIAS_URL2=ldap:///$1V?*?sub?(mailAlternateAddress=@$D)
處理 LDAP 結果
LDAP 別名結果處理作業依次序分成許多階段完成。以下各節會描述這些階段。
物件類別檢查
如果別名搜尋成功,系統將檢查項目的物件類別,以確定它包含用於使用者或群組的一組適當的物件類別。用於使用者和群組的所需物件類別之可能的集合通常由作用中的 schematag 來確定。即由 local.imta.schematag 設定來確定。
表格 7-1 顯示由各種 schematag 值所確定的使用者和群組物件類別。
如同其餘綱目標記處理一樣,本表中的資訊是程序內定的。但是,在 option.dat 檔案中還有兩個 MTA 選項,即 LDAP_USER_OBJECT_CLASSES 和 LDAP_GROUP_OBJECT_CLASSES,設定這兩個選項可分別為使用者和群組指定不同的物件類別集合。
例如,綱目標記設定 ims50,nms41 等效於以下選項設定:
LDAP_USER_OBJECT_CLASSES=inetLocalMailRecipient+inetmailuser, mailRecipient+nsMessagingServerUser
LDAP_GROUP_OBJECT_CLASSES=inetLocalMailRecipient+inetmailgroup,mailGroup
如果 LDAP 結果不具有適用於使用者或群組的一組正確的物件類別,則會被忽略。MTA 還會確定它是否正在處理使用者或群組,並儲存該資訊。以後會多次用到這項儲存的資訊。
請注意,此處所述的物件類別設定還可用於建構實際 LDAP 搜尋過濾器,以用於檢查項目是否具有用於使用者或群組的正確物件類別。此過濾器可透過 $K 圖元字元來存取。它還被內部儲存在 MTA 的配置中,以供通道程式使用,並會在使用指令 imsimta cnbuild -option 時作為 LDAP_UG_FILTER 選項寫入 MTA 選項檔案 option.dat 中。該選項僅被寫入此檔案。MTA 永遠不會從此選項檔案中讀取它。
項目狀態檢查
接著會檢查項目的狀態。狀態屬性有兩個,一個用於一般項目,另一個專用於郵件服務。
表格 7-2 顯示 schematag 項目中根據生效的 schematag 要進行檢查的一般與郵件特定的使用者或群組屬性
如有必要,可使用 option.dat 檔案中的 LDAP_USER_STATUS 和 LDAP_GROUP_STATUS MTA 選項分別為使用者和群組選取替代一般狀態屬性。郵件特定的使用者和群組狀態屬性由 LDAP_USER_MAIL_STATUS 和 LDAP_GROUP_MAIL_STATUS MTA 選項來控制。
此處起作用的另一個因素是網域自身的狀態 (LDAP_DOMAIN_ATTR_STATUS 和 LDAP_DOMAIN_ATTR_MAIL_STATUS)。總的來說有四個狀態屬性。它們按以下次序進行組合:
第一項指定「active」以外的其他狀態,它的優先度最高。其他允許的狀態值為「inactive」、「deleted」、「removed」、「disabled」、「hold」以及「overquota」。「Hold」、「disabled」以及「removed」狀態僅可指定給郵件網域、郵件使用者或郵件群組。「Overquota」狀態僅可作為郵件網域狀態或郵件使用者狀態指定。
如果特定的狀態屬性不存在,所有狀態都預設為「active」。未知狀態值被解譯為「inactive」。
當這四個狀態組合時,使用者或群組可能有以下狀態:「active」、「inactive」、「deleted」、「removed」、「disabled」、「hold」以及「overquota」。作用中狀態會使別名處理作業繼續。非作用中或超配額狀態會導致位址立即被拒絕,並產生 4xx (暫時性) 錯誤。已刪除、已移除以及已停用狀態會導致位址立即被拒絕,並產生 5xx (永久性) 錯誤。就狀態處理而言,暫停狀態會被視為作用中,但它設定內部旗標,因此以後考量遞送選項時,其中的所有選項都會由包含單一「hold」項目的選項清單來置換。
UID 檢查
下一個步驟為考量項目的 UID。UID 用於多種用途,它必須為所有使用者項目的一部分,並且可以包括在群組項目中。沒有 UID 的使用者項目會被忽略,並且此別名 URL 的處理會以失敗告終。託管網域中項目的 UID 可由真實 UID、分隔字元以及網域組成。MTA 只需要真實 UID,因此,如果使用取自 option.dat 檔案中的 LDAP_DOMAIN_ATTR_UID_SEPARATOR MTA 選項的網域分隔字元的剩餘部分存在,則會被移除。
在使用 uid 之外的屬性儲存 UID 這種不太可能發生的情況下,可使用 LDAP_UID MTA 選項強制使用其他屬性。
郵件捕獲
接著,檢查用於指定一個或多個郵件捕獲位址的 LDAP 屬性。用於此目的的屬性必須透過 LDAP_CAPTURE MTA 選項來指定。此選項沒有預設。此屬性的值會被作為位址來處理,特殊的「捕獲」通知會產生並被作為附件傳送至這些包含目前郵件的位址。此外,在捕獲位址隨後將顯示為訊息封 from: 位址這種可能發生的情況下,該位址可用於植入位址反向快取記憶體。
植入反向快取記憶體
接著考量主要位址和附加至使用者項目的所有別名。此資訊用於植入位址反向快取記憶體。它在目前位址轉譯程序中不起作用。首先,考量主要位址、個人名稱、收件者限制、收件者截止以及來源區塊限制。主要位址通常儲存在「mail」屬性中,其他屬性可以透過適當設定 LDAP_PRIMARY_ADDRESS MTA 選項來指定。(當然,主要位址反向成其自身。)所有其他屬性都沒有預設屬性。如果您要使用它們,必須透過 LDAP_PERSONAL_NAME、LDAP_RECIPIENTLIMIT、LDAP_RECIPIENTCUTOFF 以及 LDAP_SOURCEBLOCKLIMIT MTA 選項進行指定。此處還考量相應的網域級收件者限制、收件者截止以及來源區塊限制屬性。使用者級設定可完全置換任何網域級設定。
接著,考量所有次要位址並為每個次要位址產生快取記憶體項目。次要位址有兩種:即接受位址反向的次要位址和不接受位址反向的次要位址。兩者均需要加以考量,以便正確植入位址反向快取記憶體,因為需要檢查各種情況下的郵件捕獲請求。
接受反向的次要位址通常儲存在 mailAlternateAddress 屬性中。透過設定 LDAP_ALIAS_ADDRESSES MTA 選項,可以指定其他屬性。不接受反向的次要位址通常儲存在 mailEquivalentAddress 屬性中。透過設定 LDAP_EQUIVALENCE_ADDRESSES MTA 選項,可以指定其他屬性。
郵件主機和路由位址
現在要考量 mailhost 和 mailRoutingAddress 屬性。考量的實際屬性可分別由 LDAP_MAILHOST 和 LDAP_ROUTING_ADDRESS MTA 選項來置換。這些屬性協同工作,以確定此時是執行該位址還是將其轉寄至另一系統。
第一個步驟為確定 mailhost 對於此項目是否有意義。對作用於項目的遞送選項執行預先檢查,以查看該項目是否為郵件主機特定的。如果不是,則省略 mailhost 檢查。請參閱遞送選項處理的描述,尤其是 # 旗標,以瞭解如何執行本檢查。
對於使用者項目,mailhost 屬性必須標識本地系統,以便於執行。mailhost 屬性會與 local.hostname configutil 參數的值進行比較,並與 local.imta.hostnamealiases configutil 參數所指定的值清單進行對照。如果其中任何一個相符,即認為 mailhost 屬性標識本地主機。
相符成功意味著可以在本地執行別名,並且別名處理會繼續。相符不成功則意味著需要將郵件轉寄至郵件主機以執行。新位址形式
@mailhost:user@domain
會建構出來,並成為別名延伸作業的結果。
遺漏的 mailhost 屬性的處理會依該項目是使用者還是群組而有所不同。對於使用者,郵件主機十分重要。因此,如果 mailhost 屬性不存在,則新的位址形式
@smarthost:user@domain
會使用 LDAP_DOMAIN_ATTR_SMARTHOST MTA 選項所確定的網域之智慧主機建構出來。如果該網域不存在智慧主機,則報告錯誤。
另一方面,群組不需要郵件主機。因此遺漏的郵件主機會被解譯為該群組可在任何位置延伸。因此,別名處理會繼續。
mailRoutingAddress 屬性增加了一個最終的難題。_如果它存在,別名處理會終止,結果為 mailRoutingAddress。但是,如果郵件主機存在,它會作為來源路徑加入 mailRoutingAddress 中。
其他屬性支援
接著,考量 mailMsgMaxBlocks 屬性。首先它會透過 LDAP_DOMAIN_ATTR_BLOCKLIMIT MTA 選項傳回的網域區塊限制最小化。如果已知目前郵件大小超過限制,別名處理會終止,並顯示表明超出大小的錯誤。如果大小未知或未超過限制,該限制仍然儲存,稍後檢查郵件本身時,將重新檢查該限制。mailMsgMaxBlocks 的使用可由 LDAP_BLOCKLIMIT MTA 選項來置換。
接著會存取並儲存大量屬性。最終這些屬性將被寫入佇列檔案項目中,供 ims_master 通道程式使用,然後該程式將使用它們來更新儲存的使用者資訊快取記憶體。如果找不到個別使用者的這些屬性,可使用網域級屬性設定預設。
如果 LDAP 項目適用於群組而非使用者,或 LDAP 項目來自別名快取記憶體而非 LDAP 目錄,則跳過本步驟。後一準則的邏輯是,沒有必要頻繁更新該資訊,使用別名快取記憶體可為何時應進行更新提供合理的準則。擷取的這些屬性的名稱都可以透過各種 MTA 選項來設定。
表格 7-3 顯示可設定擷取的磁碟配額與郵件配額屬性的 MTA 選項。
表格 7-3 可設定擷取的磁碟配額與郵件配額屬性的 MTA 選項
MTA 選項
屬性
LDAP_DISK_QUOTA
mailQuota
LDAP_DOMAIN_ATTR_DISK_QUOTA
mailQuota
LDAP_DOMAIN_ATTR_MESSAGE_QUOTA
mailMsgQuota
LDAP_MESSAGE_QUOTA
mailMsgQuota
接著,儲存大量屬性,以供日後與圖元字元替換一併使用。
表格 7-4 顯示 MTA 選項、預設屬性以及圖元字元。
其中包括了其他屬性的備用位置,以便您使用它們來建立自訂位址延伸工具。
接著,所有與 mailConversionTag 屬性相關的值會新增至轉換標記的目前集合中。該屬性的名稱可使用 LDAP_CONVERSION_TAG MTA 選項來變更。如果有任何值與網域的 mailDomainConversionTag 屬性相關,也會被附加。
遞送選項處理
接著,檢查 mailDeliveryOption 屬性。該屬性的名稱可使用 LDAP_DELIVERY_OPTION MTA 選項來變更。這是一個多值選項,其值可確定別名轉譯程序所產生的位址。此外,允許的值對於使用者和群組不同。共用的允許值為 program、forward 和 hold。僅針對使用者的值為 mailbox、native、unix 和 autoreply。僅針對群組的值為 members、members_offline 和 file。
mailDeliveryOption 屬性至適當位址的轉換由 DELIVERY_OPTIONS MTA 選項來控制。該選項不僅指定每個允許的 mailDeliveryOption 值會產生哪些位址,還指定允許的 mailDeliveryOption 值有哪些,以及每個值是否適用於使用者、群組或兩者。
該選項的值由 deliveryoption=template 對清單組成,各對之間以逗號分隔,每對都具有一個或多個可選的單一字元字首。
DELIVERY_OPTIONS 選項的預設值為:
DELIVERY_OPTIONS=*mailbox=$M%$\\$2I$_+$2S@ims-ms-daemon,
&members=*,
*native=$M@native-daemon,
/hold=@hold-daemon:$A,
*unix=$M@native-daemon,
&file=+$F@native-daemon,
&@members_offline=*,
program=$M%$P@pipe-daemon,
#forward=**,
*^!autoreply=$M+$D@bitbucket每個遞送選項都對應於可能的 mailDeliveryOption 屬性值,相應的範本可使用 URL 處理所使用的同一圖元字元替換綱目指定結果位址。
表格 7-5 顯示用於 DELIVERY_OPTIONS 選項的單一字元字首。
如果 * 和 & 均不存在,則遞送選項既適用於使用者,又適用於群組。
在遞送選項中使用的其他圖元字元
已新增數個其他圖元字元以支援 MTA 之 URL 範本工具的新用法。這些圖元字元包括:
表格 7-6 顯示在遞送選項中使用的其他圖元字元及其描述。
表格 7-6 在遞送選項中使用的其他圖元字元
圖元字元
描述
$\\
強制後續文字採用小寫。
$^
強制後續文字採用大寫。
$_
不對後續文字執行大小寫轉換。
$nA
插入位址的第 n 個字元。第一個字元為字元 0。如果省略 n,則將替換整個位址。這是為了用於建構自動回覆目錄路徑。
$D
插入位址的網域部分。
$nE
插入第 n 個備用屬性的值。如果省略 n,則使用第一個屬性。
$F
插入遞送檔案的名稱 (mailDeliveryFileURL 屬性)。
$nG
插入第 n 個備用屬性的值。如果省略 n,則使用第二個屬性。
$nH
從 0 數起,插入原始位址網域的第 n 個元件。如果省略 n,預設為 0。
$nI
插入與別名相關的託管網域。此圖元字元接受整數參數 n,其語義在表格 7-7 中描述。
$nJ
從 0 數起,插入託管網域的第 n 個部分。n 預設為 0。
$K
插入與使用者或群組的物件類別相符的 LDAP 過濾器。請參閱 LDAP_UG_FILTER MTA 僅輸出選項的描述。
$L
插入位址的本地部分。
$M
插入與目前別名相關的 UID。
$P
插入程式名稱 (mailProgramDeliveryInfo 屬性)。
$nS
插入與目前位址相關的子位址。此圖元字元接受整數參數 n,其語義在表格 7-7 中描述。
$nU
插入目前位址中未加引號形式的電子信箱部分中的第 n 個字元。第一個字元為字元 0。如果省略 n,則將替換整個未加引號的電子信箱。
$nX
插入郵件主機的第 n 個元件。如果省略 n,則插入整個郵件主機。
表格 7-7 顯示整數參數如何修改 $nI 和 $nS 圖元字元的運作方式。
表格 7-7 控制 $nI 和 $nS 圖元字元運作方式修改的整數
整數 運作方式描述
0
如果無可用值,則失敗 (預設)。
1
如果有一個值可用,則插入該值。否則不插入任何內容。
2
如果有一個值可用,則插入該值。否則不插入任何內容,並刪除前面的字元 (ims-ms 通道需要這種特殊的運作方式)。
3
如果有一個值可用,則插入該值。否則不插入任何字元並忽略後續字元。
除了圖元字元以外,表格 7-8 還顯示兩個特殊範本字串。
表格 7-8 特殊範本字串
特殊範本字串
描述
*
執行群組延伸。此值對於使用者項目無效。
**
延伸由 LDAP_FORWARDING_ADDRESS MTA 選項指定的屬性。預設為 mailForwardingAddress。
例如,如果使用者的 mailDeliveryOption 的值設定為 mailbox,透過群組延伸,我們可以產生一個新的位址,該位址由被刪除的 UID、百分號後接託管網域 (如果適用)、加號後接子位址 (如果已指定) 以及 @ims-ms-daemon 組成。
遞送選項預設
如果此處作用中的遞送選項清單為空,則為使用者啟動清單上的第一個選項 (通常為電子信箱),為群組啟動清單上的第二個選項 (通常為成員)。
開始和結束日期檢查
在讀取遞送選項清單之後檢查開始和結束日期。有兩個屬性,其名稱分別由 LDAP_START_DATE (預設 vacationStartDate) 和 LDAP_END_DATE (預設 vacationEndDate) MTA 選項控制。如果一個或多個作用中的遞送選項指定了 ^ 字首字元,則對照目前日期檢查這些選項的值。如果目前日期超出了這些選項指定的範圍,則從作用中的集合中移除具有 ^ 字首的遞送選項。
選擇加入、存在性以及自動記錄屬性
LDAP_OPTIN MTA 選項可用於指定包含垃圾郵件過濾器選擇加入值清單的 LDAP 屬性。如果此選項已指定並且該屬性存在,則會附加至目前垃圾郵件過濾器選擇加入清單。LDAP_DOMAIN_ATTR_OPTIN MTA 選項所設定的網域級屬性設定的所有值也會附加至該清單。
LDAP_PRESENCE MTA 選項可用於指定能夠被解析以傳回使用者存在性資訊的 URL。如果此選項已指定並且該屬性存在,其值會被儲存,以與篩選存在性測試一併使用。如果使用者項目不存在值,則使用 LDAP_DOMAIN_ATTR_PRESENCE MTA 選項設定的網域級屬性作為此 URL 來源。
LDAP_AUTOSECRETARY MTA 選項可用於指定控制自動記錄資訊儲存位置的 URL。如果此選項已指定並且該屬性存在,其值會被儲存,以與 Messaging Server 自動記錄功能一併使用。如果使用者項目不存在值,則使用 LDAP_DOMAIN_ATTR_AUTOSECRETARY MTA 選項設定的網域級屬性作為此 URL 來源。
篩選過濾器處理
接著,檢查套用於此項目的篩選過濾器的 mailSieveRuleSource 屬性。如果該屬性存在,此時會被剖析並儲存。此屬性的值有兩種可能的形式,即包含完整篩選程序檔的單一值和每個值都包含一段篩選程序檔的多個值。後一種形式由 Web 過濾器建構介面產生。可以使用特殊程式碼排序這些值,並將它們正確地綁定在一起。
mailSieveRuleSource 屬性的使用更可以使用 LDAP_FILTER MTA 選項來置換。
延遲處理控制
接著,檢查 mailDeferProcessing 屬性。該屬性可透過 LDAP_REPROCESS MTA 選項來變更。如果該屬性存在且被設定為 no,處理作業通常會繼續。但如果該屬性設定為 yes 且目前來源通道並非重新處理通道,此項目的延伸就會中斷,而原始 user@domain 位址只會在重新處理通道中形成佇列。如果該屬性不存在,系統會檢查與遞送選項處理作業相關的延遲處理字元字首的設定。(請參閱遞送選項處理一節,以取得範例。)如果設定該屬性,處理作業會延遲。如果未設定該屬性,針對使用者的預設為 no。針對群組的預設由 MTA 選項 DEFER_GROUP_PROCESSING 控制,預設為 1 (yes)。使用者項目的別名處理作業到此結束。
群組延伸屬性
有大量附加屬性與群組延伸相關,並且必須在此處進行處理。這些屬性的名稱都可以透過各種 MTA 選項來配置。
表格 7-9 列出預設屬性名稱、可設定屬性名稱的 MTA 選項以及 MTA 處理屬性的方式。本表中元素的排序顯示處理各種群組屬性的次序。本排序對於正確運作十分重要。
在群組延伸作為 SMTP EXPN 指令的一部分這種特殊情況下,會檢查最後一個屬性:mgmanMemberVisibility 或可延伸屬性。LDAP_EXPANDABLE MTA 選項可用於選取要檢查的不同屬性。可能的值為:anyone (表示任何人都可以延伸該群組)、all 或 true (表示在允許延伸之前使用者需要透過 SASL 成功認證) 以及 none (表示不允許延伸)。無法識別的值會被解譯為 none。如果該屬性不存在,EXPANDABLE_DEFAULT MTA 選項控制是否允許延伸。
別名項目的快取方式與網域項目類似。控制別名快取記憶體的 MTA 選項為 ALIAS_ENTRY_CACHE_SIZE (預設為 1000 個項目) 和 ALIAS_ENTRY_CACHE_TIMEOUT (預設為 600 秒)。給定別名的整個 LDAP 傳回值會保留在快取記憶體中。
別名項目的負數快取由 ALIAS_ENTRY_CACHE_NEGATIVE MTA 選項來控制。非零值會啟用遇到故障的別名快取。零值則會停用它。依預設,停用別名項目的負數快取。其原理是,無效位址的重複規格在實際中不太可能經常發生。此外,負數快取可能會干擾新增至目錄的新使用者的及時識別。但是,站點應該考量在大量使用虛名網域的情況下重新啟用別名的負數快取。在 ALIAS_URL0 中指定的 URL 所執行的搜尋不大可能會成功。
位址反向使用直接 LDAP 的位址反向從 USE_REVERSE_DATABASE 的值為 4 (停用任何反向資料庫) 開始。然後,在先前論述的路由工具上建立。尤其是在舊版中,它用以下形式的反向 URL 規格開頭:
REVERSE_URL=ldap:///$V?mail?sub?$Q
$V 圖元字元已在別名 URL 環境中描述。但 $Q 圖元字元,雖然在功能上與別名 URL 中使用的 $R 圖元字元十分類似,但它專門用在位址反向中。與 $R 不同,$Q 會產生一個過濾器,用於搜尋包含位址反向備選位址的屬性。要搜尋的屬性清單來自 MTA 選項 LDAP_MAIL_REVERSES。如果未設定此選項,則會檢查 local.imta.schematag configutil 參數,並根據其值選擇一組適當的預設屬性。
表格 7-10 顯示 local.imta.schematag 的值和選擇的預設屬性。
表格 7-10 local.imta.schematag 的值和屬性
綱目標記值
屬性
sims40
mail,rfc822mailalias
nms41
mail,mailAlternateAddress
ims50
mail,mailAlternateAddress
但是,不再適合使用 $Q。為使郵件捕獲和其他工具正常運作,已增強位址反向功能,除了關注存在相符項目這個事實之外,還關注相符的屬性。這意味著應使用 $R 而非 $Q 來指定過濾器。此外,已新增 $N 圖元字元,它會傳回與位址反向相關的屬性清單。選項值結果為:
REVERSE_URL=ldap:///$V?$N?sub?$R
local.imta.schematag 通常可以是一個以逗號分隔的清單。如果支援多個綱目,則可使用屬性的組合清單 (重複屬性要排除)。
此外,過濾器不僅搜尋最初提供的位址,還搜尋具有同一本地部分但網域實際在網域樹中找到的位址 (在步驟 2 中儲存)。網域樹查找的反覆性意味著這兩個位址可以不同。
例如,假定網域 siroe.com 顯示在網域樹中,並且 MTA 查看位址:
u@host1.siroe.com
由 $R 的延伸和 ims50 schematag 所產生的過濾器將如下所示:
(|(|(mail=u@siroe.com)(mail=u@host1.siroe.com))
(|(mailAlternateAddress=u@siroe.com)
(mailAlternateAddress=u@host1.siroe.com)))請注意,反向 URL 明確地指定包含標準化位址的屬性。通常為 mail 屬性。
建構 URL 之後,會執行 LDAP 搜尋。如果搜尋成功,則傳回的第一個屬性值會取代原始位址。如果搜尋失敗或發生錯誤,則保留原始位址不變。
由於執行位址反向作業的頻率,尤其是可以顯示在郵件標頭中的給定位址數量以及相關目錄查詢的耗用,正面結果和負面結果均需要快取。這項作業透過記憶體中開放式鏈接的動態延伸雜湊表來實施。快取記憶體的最大容量由 REVERSE_ADDRESS_CACHE_SIZE MTA 選項來設定 (預設 100000),而快取記憶體中項目的逾時由 REVERSE_ADDRESS_CACHE_TIMEOUT MTA 選項來設定 (預設 600 秒)。快取記憶體實際上儲存位址本身,而非 LDAP URL 和 LDAP 結果。
非同步 LDAP 作業非同步查找無需在記憶體中儲存整個大型 LDAP 結果,從而避免在某些情況下導致效能問題。MTA 能夠執行由 MTA 非同步完成的各類查找。
非同步 LDAP 查找的使用由 MTA 選項 LDAP_USE_ASYNC 來控制。該選項是位元編碼的值。每個位元 (如果設定) 都會啟用非同步 LDAP 查找以及 MTA 中 LDAP 的特定用法。
表格 7-11 顯示 option.dat 檔案中 LDAP_USE_ASYNC MTA 選項的位元和值設定。
LDAP_USE_ASYNC MTA 選項的預設值為 0,這意味著依預設停用非同步 LDAP 查找。
設定摘要為啟用直接 LDAP,需要設定以下 MTA 選項:
ALIAS_MAGIC=8764
ALIAS_URL0=ldap:///$V?*?sub?$R
USE_REVERSE_DATABASE=4
USE_DOMAIN_DATABASE=0
REVERSE_URL=ldap:///$V?mail?sub?$Q如果要支援虛名網域,必須設定以下附加選項:
DOMAIN_MATCH_URL=ldap:///$B?msgVanityDomain?sub?(msgVanityDomain=$D)
ALIAS_URL1=ldap:///$B?*?sub?(&(msgVanityDomain=$D)$R)
ALIAS_URL2=ldap:///$1V?*?sub?(mailAlternateAddress=@$D)請注意,最後一個選項還會處理託管網域以及虛名網域中萬用字元形式的本地部分之大小寫。如果需要支援萬用字元形式的本地部分,但不需要支援虛名網域,則應使用以下選項:
ALIAS_URL1=ldap:///$V?*?sub?&(mailAlternateAddress=@$D)
需要從 MTA 配置檔案 (imta.cnf) 內的 ims-ms 通道定義中移除 filter ssrd:$A 子句。