在 Messaging Server 6 2003Q4 之前的版本中,Messaging Server 通常從由儲存在 LDAP 伺服器中的資訊編譯而來的資料庫中存取所有使用者、網域和群組資料。LDAP 伺服器中的目錄資訊更新時,資料庫資訊會透過名為 dirsync 的程式同步更新。Messaging Server MTA 現在可直接存取 LDAP 目錄。本章描述在 MTA 中使用直接 LDAP 資料存取的資料流程。本章包含以下各節:
以下各節描述直接 LDAP 處理作業。
位址轉換和路由程序首先會從 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 屬性﹔如果它們不具有該屬性,則假設使用者樹狀結構的基底目錄為網域項目本身。
由於網域重寫作業執行的頻率和目錄查詢 (尤其是虛名網域檢查) 的耗用,有關網域的消極指示和積極指示都需要快取。這項作業透過記憶體中開放式鏈接的動態延伸雜湊表來實作。快取記憶體的最大容量由 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 未在處理此類通道,該規則會被截斷並成功終止,因此將位址重寫至重新處理通道。
確定位址與本機通道關聯後,系統將自動對其進行別名擴充。別名延伸程序會檢查大量資訊來源,包括:
Alias 檔案 (已編譯配置的一部分)。
Alias 資料庫。
Alias URL。
所檢查的確切別名來源及別名檢查順序取決於 option.dat 檔案中 ALIAS_MAGIC MTA 選項的設定。對於直接 LDAP,請將此選項設定為 8764。這表示首先檢查由 ALIAS_URL0 MTA 選項指定的 URL,然後檢查由 ALIAS_URL1 MTA 選項指定的 URL, 再檢查由 ALIAS_URL2 MTA 選項指定的 URL,最後檢查 Alias 檔案。此設定在使用中時,不檢查資料庫。
對 LDAP 中別名的檢查透過指定兩個特殊的 LDAP URL 作為別名 alias URL 來實作。第一個別名 URL 處理一般使用者和群組,隨後的 alias URL 處理虛名網域。將第一個 URL 指定為 ALIAS_URL0:
ALIAS_URL0=ldap:///$V?*?sub?$R
中介字元延伸發生在 URL 查詢之前。ALIAS_URL0 值中使用的兩個中介字元為 $V 和 $R。
$V 中介字元可將位址的網域部分轉換成基底 DN。這類似於 $V 重寫規則中介字元所執行的初始步驟 (先前已在重寫規則機制小節中說明)。$V 處理包括以下步驟:
取得目前網域中使用者項目的基底 DN。
取得目前網域的關聯標準網域。在 Sun LDAP Schema 1 中,如果網域項目中存在 inetCanonicalDomainName 屬性,則標準網域名稱由該屬性指定。如果沒有該屬性,標準名稱則以簡易方式從實際網域項目的 DN 建構而成。當目前網域為別名時,標準名稱與目前網域會有所不同。用於儲存標準名稱的名稱屬性可由 option.dat 檔案中的 LDAP_DOMAIN_ATTR_CANONICAL MTA 選項來置換。
如果基底 DN 存在,將其替換為代替 $V 的URL。
現在確定適用於此項目的所有託管網域。執行方法是,將標準網域 (如果清除 DOMAIN_UPLEVEL 的位元 2 [值 = 4]) 或目前網域 (如果設定 DOMAIN_UPLEVEL 的位元 2 [ 值 = 4]) 與 service.defaultdomain 參數進行比較。如果不相符,則該項目為託管網域的成員。透過設定 option.dat 檔案中的 LDAP_DEFAULT_DOMAIN MTA 選項,可以置換 LDAP_DEFAULT_DOMAIN configutil 參數。
如果基底 DN 確定失敗請移除網域左側的一個元件並移至步驟 1。如果沒有剩餘任何元件則替換失敗。
$V 還接受選擇性數值引數。如果該引數設定為 1 (例如,$1V),則忽略解析網域樹狀結構中的網域時發生的故障,並傳回 local.ugldapbasedn configutil 選項所指定的使用者樹狀結構的基底目錄。
如果嘗試擷取網域基底 DN 成功,MTA 還會擷取數個日後將會需要的有用的網域屬性。所擷取的屬性名稱由 option.dat 檔案中的以下 MTA 選項設定:
LDAP_DOMAIN_ATTR_CATCHALL_ADDRESS (預設為 mailDomainCatchallAddress)
LDAP_DOMAIN_ATTR_REPORT_ADDRESS (預設為 mailDomainReportAddress)
LDAP_DOMAIN_ATTR_CONVERSION_TAG (預設為 mailDomainConversionTag)
在有些特殊情況下需要以其他方式執行從網域至基底 DN 的對映。為適應此類設定,URL 解析程序提供了呼叫 MTA 對映的功能。該功能透過一個中介字元序列來執行,其一般形式為:
$|/mapping-name/mapping-argument|
雙引號 (“) 可啟動和終止呼叫。緊接 $ 之後的字元為對映名稱與引數之間的分隔符號;所選擇的字元應與對映名稱或引數中使用的預期字元值不發生衝突。
$R 中介字元可為 URL 提供適當的篩選器。其目的是產生一個篩選器,用於搜尋可能包含特定使用者或群組之電子郵件位址的所有屬性。要搜尋的屬性清單來自 configutil 參數 local.imta.mailaliases。如果未設定此參數,則會檢查 local.imta.schematag configutil 參數,並根據其值選擇一組適當的預設屬性,如下所示:
nms41 mail,mailAlternateAddress
ims50 mail,mailAlternateAddress,mailEquivalentAddress
local.imta.schematag 的值可以是以逗號分隔的清單。如果支援多個模式,則可使用屬性的組合清單 (重複屬性要排除)。LDAP_SCHEMATAG MTA 選項可用於置換 local.imta.schematag 專用於 MTA 的設定。
此外,篩選器不僅搜尋最初提供的位址,還搜尋具有相同本機部分、但實際在網域樹狀結構中找到網域的位址 (儲存在$V 中介字元小節的第二步中)。網域樹查詢的反覆性意味著這兩個位址可以不同。這項附加檢查由 option.dat 檔案中 DOMAIN_UPLEVEL MTA 選項的位元 1 (值 = 2) 來控制。設定此位元會啟用額外的位址檢查。DOMAIN_UPLEVEL 的預設值為 0。
例如,假設網域 siroe.com 顯示在網域樹狀結構中。假設強制使用 Sun LDAP Schema 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))
如果 URL 為要傳回的屬性清單指定 *,則可用 MTA 可以使用的屬性清單來替代星號。此清單由指定 MTA 所使用的選項之各種 MTA 選項設定自動產生。
在此處,結果 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 選項的網域之轉換標記 (如果有) 將會附加至該位址,以在轉寄至 smarthost 之前完成轉換。如果該網域沒有 catchall 位址或智慧主機,此 alias URL 的處理作業將以失敗告終。
LDAP 搜尋傳回結果後系統將檢查該結果以驗證其中是否只有一個項目。如果有多個項目,系統會檢查每個項目是否具有用於使用者或群組的正確物件類別、非刪除狀態以及用於使用者的 UID。未通過該檢查的項目會被忽略。如果多個項目的清單透過此檢查縮減為一個項目,處理作業將繼續。如果沒有,則傳回錯誤,指明目錄重複或模糊。
ALIAS_URL0 檢查適用於普通使用者或託管網域中的使用者。如果檢查失敗,還會執行虛名網域檢查。此檢查透過以下 alias URL 完成:
ALIAS_URL1=ldap:///$B?*?sub?(&(msgVanityDomain=$D)$R)
最後,需要在 mailAlternateAddress 屬性中對 @host 形式的 catchall 位址執行檢查。在託管網域和虛名網域中均允許使用這種萬用字元形式,因此其正確的 alias URL 為:
ALIAS_URL2=ldap:///$1V?*?sub?(mailAlternateAddress=@$D)
在直接 LDAP 模式中,+* 子位址替換機制始終與 catch-all 位址配合運作,但替換的字串僅是子位址,而非整個本機部分。這種情況已經變更,因此當使用此建構時,原始位址的整個本機部分將被作為子位址插入位址中。
例如,給定形式為 foo+bar@domain.com 的位址,在 domain.com 網域中無本機使用者 foo,而且 domain.com 的 catch-all 位址形式為 bletch+*@example.com,則現在的結果位址將是 bletch+foo+bar@example.com。以前則是 bletch+bar@example.com。
LDAP 別名結果處理作業依次序分成許多階段完成。以下各節會描述這些階段。
如果別名搜尋成功,系統將檢查項目的物件類別以確定它包含用於使用者或群組的一組適當的物件類別。用於使用者和群組的所需物件類別之可能的集合通常由使用中的 schematag 來確定。即由 local.imta.schematag 設定決定。
表 9–1顯示由各種 schematag 值所產生的使用者和群組物件類別。
表 9–1 各種 schematag 值所產生的物件類別
schematag |
使用者物件類別 |
群組物件類別 |
---|---|---|
inetMailRouting+inetmailuser |
inetMailRouting+inetmailgroup |
|
mailRecipient + nsMessagingServerUser |
mailGroup |
|
inetLocalMailRecipient+inetmailuser |
inetLocalMailRecipient + inetmailgroup |
如同其餘模式標記處理一樣,本表中的資訊是程序內定的。但是,在 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 永遠不會從此選項檔案中讀取它。
接著會檢查項目的狀態。狀態屬性有兩個:一個用於一般項目,另一個專用於郵件服務。
表 9–2 顯示模式標記項目中要根據生效的模式標記進行檢查的一般屬性與郵件特定的使用者或群組屬性。
表 9–2 要檢查的屬性
schematag |
類型 |
一般 |
郵件特定 |
---|---|---|---|
sims40 |
使用者 |
inetsubscriberstatus |
mailuserstatus |
sims40 |
群組 |
無 |
inetmailgroupstatus |
nms41 |
使用者 |
無 |
mailuserstatus |
nms41 |
群組 |
無 |
無 |
Messaging Server 5.0 |
使用者 |
inetuserstatus |
mailuserstatus |
Messaging Server 5.0 |
群組 |
無 |
inetmailgroupstatus |
如有必要,可使用 option.dat 檔案中的 LDAP_USER_STATUS 和 LDAP_USER_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 的使用者項目會被忽略,並且此 alias 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 選項來設定。
表 9–3 顯示可設定擷取的磁碟配額與郵件配額屬性的 MTA 選項。
表 9–3 可設定擷取的磁碟配額與郵件配額屬性的 MTA 選項
MTA 選項 |
屬性 |
---|---|
mailMsgQuota |
接著,儲存大量屬性以供日後與中介字元替換一併使用。
表 9–4 顯示 MTA 選項、預設屬性以及中介字元。
表 9–4 MTA 選項、預設屬性以及中介字元
MTA 選項 |
預設屬性 |
中介字元 |
---|---|---|
mailProgramDeliveryInfo |
$P |
|
mailDeliveryFileURL |
$F |
|
無預設 |
$1E $1G $E |
|
無預設 |
$2E $2G $G |
|
LDAP_SPARE_3 |
無預設 |
$3E $3G |
LDAP_SPARE_4 |
無預設 |
$4E $4G |
LDAP_SPARE_5 |
無預設 |
$5E $5G |
其中包括了其他屬性的備用位置,以便您使用它們來建立自訂位址延伸工具。
接著,所有與 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=*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 處理使用的同一中介字元替換模式指定結果位址。
表 9–5 顯示可用於 DELIVERY_OPTIONS 選項的單一字元前綴。
表 9–5 用於 DELIVERY_OPTIONS MTA 選項中各選項的單一字元字首。
字元字首 |
說明 |
---|---|
@ |
設定旗標表示需要將該郵件重新導向至重新處理通道。已捨棄目前使用者/群組的處理作業。對源自重新處理通道的郵件忽略旗標。 |
* |
遞送選項適用於使用者。 |
& |
遞送選項適用於群組。 |
$ |
設定旗標表示該使用者或群組的延伸將延遲。 |
^ |
設定旗標表示應檢查休假開始和結束,時間以查看此遞送選項是否真正生效。 |
# |
設定旗標,表示此傳送選項的擴充無需發生在項目的指定郵件主機上。即,以下項目獨立於郵件主機。這會讓 MTA 檢查給定使用者或群組的所有傳送選項是否均獨立於郵件主機。如果滿足此條件,MTA 可立即處理此項目,而不必將郵件轉寄給郵件主機。 |
/ |
設定旗標可使此遞送選項產生的所有位址得以保留。包含這些收件者位址的郵件檔案將具有 .HELD 副檔名。 |
! |
設定旗標表示應該由 MTA 在內部處理自動回覆作業。僅對自動回覆遞送選項使用此字首時有意義。此選項的值應將郵件導向至 bitbucket 通道 |
如果 * 和 & 均不存在,則傳送選項既適用於使用者,又適用於群組。
已新增數個其他中介字元以支援 MTA 之 URL 範本工具的新用法。這些圖元字元包括:
表 9–6 顯示在遞送選項中使用的其他中介字元及其說明。
表 9–6 在遞送選項中使用的其他中介字元
中介字元 |
說明 |
---|---|
$\ |
強制後續文字採用小寫。 |
$^ |
強制後續文字採用大寫。 |
$_ |
不對後續文字執行大小寫轉換。 |
$nA |
插入位址的第 n 個字元。第一個字元為字元 0。如果省略 n,則將替換整個位址。這是為了用於建構自動回覆目錄路徑。 |
$D |
插入位址的網域部分。 |
$nE |
插入第 n 個備用屬性的值。如果省略 n,則使用第一個屬性。 |
$F |
插入傳送檔案 (mailDeliveryFileURL 屬性) 的名稱。 |
$nG |
插入第 n 個備用屬性的值。如果省略 n,則使用第二個屬性。 |
$nH |
從 0 數起,插入原始位址網域的第 n 個元件。如果省略 n,則預設為 0。 |
$nI |
插入與別名相關的託管網域。此中介字元接受整數參數 n,該參數語義在表 9–7 中加以說明。 |
$nJ |
從 0 數起,插入主機網域的第 n 個部分。n 預設為 0。 |
$nO |
插入於目前位址關聯的來源路由。此中介字元接受整數參數 n,該參數語義在表 9–7 中加以說明。 |
$K |
插入與使用者或群組的物件類別相符的 LDAP 篩選器。請參閱 LDAP_UG_FILTER 僅限輸出之 MTA 選項的說明。 |
$L |
插入位址的本機部分。 |
$nM |
插入 UID 的第 n 個字元。第一個字元為 0 字元。如果省略則將替換整個 UID。 |
$P |
插入程式名稱 (mailProgramDeliveryInfo 屬性)。 |
$nS |
插入與目前位址相關的子位址。此中介字元接受整數參數 n,該參數語義在表 9–7 中加以說明。 |
$nU |
插入目前位址中未加引號形式的電子信箱部分中的第 n 個字元。第一個字元為 0 字元。如果省略則將替換整個未加引號的電子信箱。 |
$nX |
插入郵件主機的第 n 個元件。如果省略 n,則插入整個郵件主機。 |
表 9–7 顯示整數參數如何修改中介字元 $nI 和 $nS 的運作方式。
表 9–7 控制 $nI 和 $nS 中介字元運作方式修改的整數
整數 |
運作方式說明 |
---|---|
0 |
如果無可用值則失敗 (預設)。 |
1 |
如果有一個值可用,則插入該值。否則不插入任何內容。 |
2 |
如果有一個值可用,則插入該值。否則不插入任何內容,並刪除前面的字元 (ims-ms 通道需要這種特殊的運作方式)。 |
3 |
如果有一個值可用,則插入該值。否則不插入任何字元,並忽略後續字元。 |
除了這些中介字元外,表 9–8 還顯示兩個特殊的範本字串。
表 9–8 特殊範本字串
特殊範本字串 |
說明 |
---|---|
* |
執行群組延伸。此值對於使用者項目無效。 |
** |
擴充由 LDAP_FORWARDING_ADDRESS MTA 選項命名的屬性。預設為 mailForwardingAddress。 |
例如,如果使用者的 mailDeliveryOption 值設定為 mailbox,透過群組擴充,可以產生新的位址,該位址由被刪除的 UID、後接託管網域 (如果適用) 的百分號、後接子位址 (如果已指定) 的加號以及 @ims-ms-daemon 組成。
如果此處使用中的遞送選項清單為空,則為使用者啟動清單上的第一個選項 (通常為電子信箱) 為群組啟動清單上的第二個選項通常為成員。
在讀取遞送選項清單之後檢查開始和結束日期。存在兩個屬性,其名稱分別由 LDAP_START_DATE (預設 vacationStartDate ) 和 LDAP_END_DATE (預設 vacationEndDate) MTA 選項控制。如果一個或多個使用中的傳送選項指定了 ^ 前綴字元,則將會對照目前日期來檢查這些選項的值。如果目前日期超出了這些選項指定的範圍,則會從使用中的集合中移除具有 ^ 前綴的傳送選項。如需更多資訊,請參閱休假自動回覆屬性。
LDAP_OPTIN MTA 選項可用於指定包含垃圾郵件篩選器 opt-in 值清單的 LDAP 屬性。如果此選項已指定並且該屬性存在,則會附加至目前垃圾郵件篩選器選擇加入清單。網域層級屬性 (由LDAP_DOMAIN_ATTR_OPTIN MTA 選項設定) 設定的所有值也會附加至該清單。
LDAP_PRESENCE MTA 選項可用於指定可以被解析以傳回使用者身份認證資訊的 URL。如果此選項已指定並且該屬性存在,其值會被儲存,以與篩選存在性測試一併使用。如果使用者項目不存在值,則使用 LDAP_DOMAIN_ATTR_PRESENCE MTA 選項設定的網域層級屬性做為此 URL 來源。
接著,檢查適用於此項目的篩選器之 mailSieveRuleSource 屬性。如果該屬性存在,此時會被剖析並儲存。此屬性的值有兩種可能的形式,即包含完整篩選程序檔的單一值和每個值都包含一段篩選程序檔的多個值。後一種形式由 Web 篩選器建構介面產生。可以使用特殊程式碼排序這些值,並將它們正確地綁定在一起。
mailSieveRuleSource 屬性可專門使用 LDAP_FILTER MTA 選項進行置換。
接著,將會檢查 mailDeferProcessing 屬性。此屬性可使用 LDAP_REPROCESS MTA 選項進行變更。如果此屬性存在且被設定為 no,處理會正常繼續。但如果該屬性設定為 yes 且目前來源通道並非重新處理通道,此項目的擴充就會中斷,而原始 user@domain 位址僅在重新處理通道中形成佇列。如果該屬性不存在,系統會檢查與遞送選項處理作業相關的延遲處理字元字首的設定。(請參閱遞送選項處理)。針對使用者的預設為 no。針對群組的預設由 MTA 選項 DEFER_GROUP_PROCESSING (預設為 1 [yes]) 控制。使用者項目的別名處理作業到此結束。
有大量附加屬性與群組擴充相關,並且必須在此處進行處理。這些屬性的名稱都可以透過各種 MTA 選項來配置。
表 9–9 中列出了預設屬性名稱、可設定屬性名稱的 MTA 選項以及 MTA 處理屬性的方 式。本表中元素的排序顯示處理各種群組屬性的次序。本排序對於正確運作十分重要。
表 9–9 群組延伸預設屬性以及要設定的 MTA Option
在群組延伸作為 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 的位址反向,從值為 4 的 USE_REVERSE_DATABASE (停用任何反向資料庫) 開始。然後在先前論述的路由工具上建立。尤其是在舊版中,它用以下形式的反向 URL 規格開頭:
REVERSE_URL=ldap:///$V?mail?sub?$Q
在 alias URL 環境中已說明了 $V 中介字元。$Q 中介字元雖然在功能上與 alias URL 中使用的 $R 中介字元十分類似,但它專門用在位址反向中。與 $R 不同,$Q 會產生一個篩選器,用於搜尋包含位址反向備選位址的屬性。要搜尋的屬性之清單來自 MTA 選項 LDAP_MAIL_REVERSES。如果未設定此選項,則會檢查 local.imta.schematag configutil 參數,並根據其值選擇一組適當的預設屬性。
表 9–10 顯示 local.imta.schematag 值以及所選的預設屬性。
表 9–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 始終為以逗號分隔的清單。如果支援多個模式,則可使用屬性的組合清單 (重複屬性要排除)。
此外,篩選器不僅搜尋最初提供的位址,還搜尋具有相同本機部分、但實際在網域樹狀結構中找到網域的位址 (儲存在重寫規則機制小節的第二步中)。網域樹查詢的反覆性意味著這兩個位址可以不同。
例如,假設網域 siroe.com 顯示在網域樹狀結構中,並且 MTA 查看位址:
u@host1.siroe.com
由 $R 的擴充和 ims50 模式標記所產生的篩選器將如下所示:
(|(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)) |
請注意,反向 URL 明確地指定包含標準化位址的屬性。通常為 mail 屬性。
建構 URL 之後會執行 LDAP 搜尋。如果搜尋成功,則傳回的第一個屬性值會取代原始位址。如果搜尋失敗或發生錯誤,則保留原始位址不變。
由於執行位址反向作業的頻率 (尤其是可以顯示在郵件標頭中的給定位址數量) 以及相關目錄查詢的耗用,正面結果和負面結果均需要快取。這項作業透過記憶體中開放式鏈接的動態延伸雜湊表來實作。快取記憶體的最大容量由 REVERSE_ADDRESS_CACHE_SIZE MTA 選項來設定 (預設 100000),而快取記憶體中項目 的逾時由 REVERSE_ADDRESS_CACHE_TIMEOUT MTA 選項來設定 (預設 600 秒)。快取記憶體實際上儲存位址本身,而非 LDAP URL 和 LDAP 結果。
非同步查詢無需在記憶體中儲存整個大型 LDAP 結果,從而避免在某些情況下導致效能問題。MTA 能夠執行由 MTA 非同步完成的各類查詢。
非同步 LDAP 查詢的使用由 MTA 選項 LDAP_USE_ASYNC 控制。該選項是位元編碼的值。每個位元 (如果設定) 都會啟用非同步 LDAP 查詢以及 MTA 中 LDAP 的特定用法。
表 9–11顯示 option.dat 檔案中 LDAP_USE_ASYNC MTA 選項的位元和值設定。
表 9–11 LDAP_USE_ASYNC MTA 選項的設定
位元 |
值 |
LDAP 的特定用法 |
---|---|---|
0 |
1 |
LDAP_GROUP_URL1 (mgrpDeliverTo) URL |
1 |
2 |
LDAP_GROUP_URL2 (memberURL) URL |
2 |
4 |
LDAP_GROUP_DN (UniqueMember) DN |
3 |
8 |
auth_list、moderator_list、sasl_auth_list 和 sasl_moderator_list 非定位清單參數 URL |
4 |
16 |
cant_list 和 sasl_cant_list 非定位清單參數 URL |
5 |
32 |
originator_reply 非定位清單參數 URL |
6 |
64 |
deferred_list、direct_list、hold_list 和 nohold_list 非定位清單參數 URL |
7 |
128 |
username_auth_list、username_moderator_list 和 username_cant_list 非定位清單參數 URL |
8 |
256 |
檔案清單 URL |
9 |
512 |
資料庫清單 URL |
10 |
1024 |
LDAP_CANT_URL (mgrpDisallowedBroadcaster) 外層 URL |
11 |
2048 |
LDAP_CANT_URL 內層 URL |
12 |
4096 |
LDAP_AUTH_URL (mgrpAllowedBroadcaster) 外層 URL |
13 |
8192 |
LDAP_AUTH_URL 內層 URL |
14 |
16384 |
LDAP_MODERATOR_URL (mgrpModerator) URL |
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 陳述式。