SMTP 服務設計

 

上次修改主題的時間: 2006-07-19

核心 SMTP 通訊協定引擎是以 SMTPSvc.dll (位於 \WINDOWS\system32\inetsrv 目錄) 的形式實作。此通訊協定引擎是以 IIS Inetinfo 處理程序中不受管理程式碼的形式執行,它會在工作階段層處理傳入及外寄的郵件。下圖根據國際標準組織 (ISO) 的開放系統互相連線 (OSI) 模型,說明 SMTP 服務是位於工作階段層、展示層及應用程式層上。

85ff238c-4cd4-447d-ae68-f648fbf0cac7

note附註:
不受管理程式碼是指在 Microsoft .NET Framework Common Language Runtime (CLR) 之外,由作業系統直接執行的程式碼。不受管理程式碼有自己的記憶體管理、類型檢查及安全性支援。受管理程式碼從 Common Language Runtime 接收這些服務。

網際網路資訊服務 (IIS) 整合

SMTP 服務在 Inetinfo 處理程序中執行的這項事實,表示 Exchange Server 2003 傳輸子系統與其他同樣在 IIS 中執行的服務 (如「郵局通訊協定,第 3 版 (POP3)」服務、「網際網路訊息存取通訊協定,第 4 版 (IMAP4)」服務,及「Exchange 路由引擎服務 (RESvc)」) 會一起共用 IIS 資源。Inetinfo.exe 是核心 IIS 處理程序,而 IIS Admin 服務則可控制 Inetinfo.exe。Exchange Server 2003 服務依存性中會加以說明。

非同步執行執行緒

SMTP 服務與 Inetinfo 處理程序中所有其他服務所共用的其中一項重要資源,就是非同步執行緒佇列 (ATQ)。這是個執行緒集區,IIS 會使用此集區中的執行緒,來處理所有傳入的網路連線要求。執行緒是程式碼在處理程序內執行時所產生的執行個體。處理程序是由一個虛擬位址空間、處理器內容,以及至少一個執行緒所構成。執行緒是使用作業系統的 CreateThread() 方法來建立,並在呼叫它的處理程序 (即 IIS Inetinfo 處理程序) 的虛擬位址空間內執行。

在非同步處理中,每個執行緒不會等待其他執行緒完成處理,就開始在 Inetinfo 處理程序中執行。而在同步處理中,執行緒是以同步方式相繼執行 (呼叫函數時,程式碼必須等到函數完成才能執行)。為了能同步處理非同步的執行緒 (例如,為了避免因同時存取特殊資源而導致衝突),作業系統提供了同步物件。其中一個特殊資源的同步物件範例,就是 Windows 通訊端的事件物件。SMTP 服務使用事件物件來接收有關傳入 SMTP 連線的通知。而 Windows 通訊端則是結合了通訊埠號碼的 IP 位址。SMTP 通訊協定引擎的預設通訊埠是 TCP 通訊埠 25。此通訊埠號碼前面再加上執行 SMTP 服務的 Exchange 伺服器 IP 位址,便構成了預設 SMTP 虛擬伺服器的通訊端,例如: 192.168.1.100:25.

note附註:
Exchange 伺服器上僅有預設 SMTP 虛擬伺服器。預設 SMTP 虛擬伺服器透過 TCP 通訊埠 25 接受來自所有 IP 位址伺服器的傳入連線。您可以在 Exchange 系統管理員中,在 [一般] 索引標籤的 [預設 SMTP 虛擬伺服器] 內容中,變更此組態。

處理傳入 SMTP 連線

Inetinfo 處理程序依下列步驟處理傳入的 SMTP 連線:

  1. 啟動 SMTP 服務時,Inetinfo 處理程序在 TCP/IP 中初始化 SMTP 虛擬伺服器的通訊端,以便接聽傳入的連線要求。為了讓同一虛擬伺服器能夠同時支援多個連線,通訊端會以非封鎖模式初始化,以進行重疊的 I/O 作業。SMTP 虛擬伺服器預設可接受幾近無數個傳入網絡連線 (儘管實際實體限制大約為 5000)。

    note附註:
    在 Microsoft Windows Server 2003 中,伺服器僅可處理大約 2,000 個同時連線。在 Windows Server 2003 Service Pack 1 中,此預設值從 2,000 增加到 5,000。如果修改 Metabase 中的設定,則還可以增加更多。
  2. Inetinfo 處理程序建立同步物件,以通知作業系統當通訊端上有傳入連線時,它要收到網路事件通知。ATQ 會與此同步物件相關聯,以便在同步物件發出傳入網路連線信號時,通知此執行緒集區中的執行緒。

  3. TCP/IP 傳輸堆疊接收傳入的 SMTP 連線,並針對此事件向 Inetinfo 處理程序發出信號。現在可以執行 ATQ 內的執行緒,以從 SMTP 通訊端讀取資料。

    note附註:
    Inetinfo 處理程序可以在 ATQ 中建立其他執行緒,以確保有足夠數量的執行緒可用於接聽傳入的連線要求。若要調整 IIS 效能,您可以使用下列登錄參數,指定系統中可建立的執行緒數目上限。

    位置

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters

    PoolThreadLimit

    類型

    REG_DWORD

    值資料

    0 - 4,294,967,295 (unlimited)

    描述

    PoolThreadLimit 是一個硬性限制,範圍涵蓋所有的 IIS 集區執行緒。

  4. IIS 執行緒執行 SMTPSvc.dll 中的程式碼,並以伺服器問候 (稱為 SMTP 橫幅) 來回應傳入的用戶端要求,例如:[220 server01.TailspinToys.com Microsoft ESMTP MAIL Service, Version:6.0.3790.0 ready at Sun, 21 Mar 2004 23:48:47 +0100]。

  5. SMTP 主機傳輸郵件,並進行 SMTP 交談。每次一收到 SMTP 命令,ATQ 中就會有一個執行緒執行 SMTPSvc.dll 中的 SMTP 通訊協定程式碼,並觸發 SMTP 服務中會導致其他 DLL 程式碼執行的事件。例如,NTFS 儲存區驅動程式會將郵件以檔案的形式,寫入該檔案系統上虛擬 SMTP 伺服器的 \Queue 資料夾中。

  6. 處理完目前的 SMTP 命令後,Inetinfo 處理程序將剛才用來執行 SMTP 處理的執行緒放回 ATQ 中,以便接聽新的傳入命令或新的連線要求。IIS 會重複使用現有的執行緒,以避免每次收到新命令或連線要求,就額外建立新的執行緒。

  7. 遠端主機發出 Quit 命令使 SMTP 服務釋放連線。

    note附註:
    非作用中執行緒在 ATQ 的存留時間 (TTL) 為 24 小時。不過,無論何時,Inetinfo 處理程序在 ATQ 中都至少會有兩個執行緒來回應傳入的連線要求。

限制 SMTP 執行緒數目

SMTP 服務預設可以使用 ATQ 中 90% 的可用執行緒。因為此執行緒集區會共用給其他可能在同一伺服器上執行的 IIS 服務 (如檔案傳輸通訊協定 (FTP)、POP3、RESvc 及 IMAP4 服務),所以高額的 SMTP 負載可能會導致 Inetinfo 處理程序出現效能瓶頸。這可以導致 FTP、POP3、RESvc 或 IMAP4 服務失敗。

若要避免此情況,您可以為其他 IIS 服務保留適當數量的執行緒,方法是限制 SMTP 服務可使用的執行緒百分比。您可使用下列登錄參數,完成此操作。

位置

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SMTPSVC\Queuing

MaxPercentPoolThreads

類型

REG_DWORD

值資料

預設值為 0x5A (90%)

描述

限制 SMTP 服務可以使用的 ATQ 執行緒百分比。建議的設定為:

MaxPercentPoolThreads = 90/( 2*SMTP 虛擬伺服器執行個體數目 )

如果還有足夠的可用記憶體可供其他執行緒使用,您可以使用下列登錄參數,增加 Inetinfo 處理程序中的執行緒總數。

位置

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SMTPSVC\Queuing

AdditionalPoolThreadsPerProc

類型

REG_DWORD

值資料

預設值為 0x5A (90%)

描述

決定了當啟動 SMTP 服務時,Inetinfo 處理程序會為每個處理器額外建立的集區執行緒數目。建議的設定為:

AdditionalPoolThreadsPerProc = ((9/(MaxPercentPoolThreads/100))-4)/2

note附註:
如果 AdditionalPoolThreadsPerProc 的值大於 200,您就必須提高 HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services\InetInfo\Parameters\PoolThreadLimit 參數的值。請將 PoolThreadLimit 設為至少與 AdditionalPoolThreadsPerProc 相同的值。

根據元件物件模型的 SMTP 延伸

SMTP 通訊協定可支援在單一工作階段中傳送多封郵件。這表示在傳遞或轉送一封郵件時,就可以傳輸下一封郵件。每封郵件的 SMTP「郵件資料結尾」指示器 (亦即,換行符號之後跟隨句點,其後再跟隨另一個換行符號) 或最後的 BDAT 區塊會通知接收的 SMTP 服務,要去處理該郵件的收件者及資料。由於此處理會將郵件傳遞至本機 Exchange 儲存區,或如果收件者的信箱不在本機伺服器,就將郵件轉寄至收件者的主伺服器,所以此處理又稱為傳輸處理。SMTP 服務也可以將郵件轉送給外部收件者。例如,當使用網際網路用戶端的 Exchange 使用者將郵件傳送給外部收件者時,就會執行郵件轉送。

透過 SMTP 接收郵件後,該郵件就會被傳送至進階佇列引擎 (Phatq.dll)。隨後,SMTP 服務就會把剛才用來將郵件傳送至進階佇列引擎的執行緒,放回 ATQ。這是因為進階佇列引擎會使用自己的執行緒集區來處理佇列郵件。此執行緒集區與用來處理 SMTP 通訊協定作業的執行緒集區互不干涉。進階佇列引擎提供了有關進階佇列引擎的更多資訊。

SMTP 傳輸子系統中的事件

當執行緒執行 Smtpsvc.dll 中的通訊協定程式碼,或是執行 Phatq.dll 中的傳輸程式碼時,會觸發導致其他 DLL 程式碼執行的事件。此事件結構完全以 COM 為基礎。SMTP 是使用 Microsoft Server Extension Object COM Library (Seo.dll) 來觸發 SMTP 事件,並使用 COM 啟用,對註冊以接收每個特殊事件的事件接收器予以執行個體化。SMTP 事件可以指出 SMTP 通訊協定命令的狀態是正在傳輸還是已到達,或是郵件已提交給 SMTP 傳輸子系統。事件接收器 (如 SMTP 通訊協定延伸、分類程式及路由引擎) 會註冊來接收 SMTP 服務中的特殊事件。

Exchange 2003 的 SMTP 傳輸子系統中可能發生下列類型的事件:

  • SMTP 通訊協定事件   這些事件是 SMTP 所特有,可讓事件接收器修改、停用或是新增輸入及輸出命令以及對這些命令的回應,藉此修改 SMTP 通訊協定引擎的行為。例如,Exchange Server 2003 的 X-LSA Sink 通訊協定事件接收器會實作其他 SMTP 命令 (X-LINK2STATE),以在路由群組之間傳輸連結狀態資訊,如郵件路由結構所述。通訊協定事件接收器也可用於修改標準 SMTP 及 ESMTP 命令 (如 EHLO),以便擴充 SMTP 通訊協定的能力。SMTP 通訊協定延伸中會論及通訊協定事件接收器。
  • SMTP 儲存區事件   這些事件可讓儲存區事件接收器 (即實作的儲存區驅動程式) 將郵件內容保留在檔案系統目錄或 Exchange 儲存區中。例如,在 Exchange Server 2003 的傳輸子系統中,儲存區事件是用來執行到 Exchange 收件者的本機傳遞。SMTP 服務儲存區驅動程式中會論及儲存區驅動程式。
  • SMTP 傳輸事件   當郵件到達伺服器、通過核心傳輸子系統、並傳遞至 Exchange 收件者或轉送至其他 SMTP 主機時,就會發生這些事件。在 Exchange Server 2003 中,傳輸事件是用來執行郵件分類及郵件路由傳送。郵件路由結構中會論及路由引擎。SMTP 傳輸元件中會論及分類程式事件接收器。
  • SMTP 系統事件   這些事件會轉為對系統元件角色之接收器的呼叫。例如,SMTP Eventlog 接收器是系統元件,它是註冊來接收系統事件,以便將內部處理資訊寫入應用程式事件日誌。

63542692-4837-4238-9e02-d0bc7583ff71

note附註:
非 Microsoft 廠商可以利用 SMTP 事件接收器實作 SMTP 傳輸子系統的自訂延伸,如郵件篩選及防毒掃描程式。SMTP 事件接收器不支援 COM+ 應用程式。

事件發送程式與事件通知

事件發生時,SMTP 服務中扮演事件發送程式角色的執行緒會檢查事件註冊 (在 IIS Metabase 中儲存為事件繫結),以判定該事件是否有任何相關的接收器。事件發送程式可判定所有已註冊執行的事件接收器,以及它們的執行時間。該順序視事件繫結資訊中所指定的接收器優先順序而定。發生事件時,這些事件接收器會依此順序收到通知。優先順序數字最小的接收器會最先執行。

每個接收器均會發生下列處理程序:

  1. 事件發送程式比較接收器的事件註冊與事件條件。如果滿足條件,則執行接收器。

    note附註:
    某些 SMTP 事件 (如儲存區事件) 不具備事件條件。
  2. 必要的話,事件發送程式使用事件接收器 COM 類別的類別識別碼 (CLSID),來建立接收器的執行個體。

    note附註:
    可以快取接收器,以避免在後續事件中重複此步驟。
  3. 事件發送程式呼叫 COM 的 IUnknown::QueryInterface 方法,以為事件接收器取得適當的事件通知介面。大部份接收器使用 Active Template Library (ATL) 來實作接收器介面。

  4. 事件發送程式在接收器介面上呼叫適當的事件方法來執行接收器。若是傳輸事件,則事件發送程式會以 MailMsg 物件的形式,將郵件傳遞至事件接收器。這個物件包含整封郵件,還有傳輸信封欄位。接收器可以修改郵件及信封欄位。

  5. 接收器完成處理後,將事件狀態旗標傳回事件發送程式。事件發送程式檢查此旗標,以決定是否要通知後續的接收器。例如,事件接收器可能指示事件發送程式跳過所有剩餘的接收器,以停止所有後續的郵件處理作業。
    事件接收器是使用下列傳回碼,來指示是否通知後續接收器:

    • S_OK   呼叫其他優先順序相同或更低的接收器。
    • S_FALSE   不呼叫其他優先順序相同或更低的接收器。
      note附註:
      SMTP 通訊協定事件接收器亦可能傳回 MAILTRANSPORT_S_PENDING 值,此值表示會呼叫 NotifyAsyncCompletion 方法,以便用非同步方式完成處理。通訊協定事件接收器可呼叫 NotifyAsyncCompletion 方法,來通知輸入通訊協定事件發送程式非同步處理已經完成,並傳送處理結果。
  6. 若是傳輸事件,則在通知每個接收器,或某個接收器指示要跳過剩餘接收器後,事件發送程式會檢查郵件的狀態信封欄位,以決定下一個動作。這個動作可能是將郵件傳遞到適當的位置、捨棄郵件,或將郵件置於檔案系統上 SMTP 虛擬伺服器的 \Badmail 資料夾。

note附註:
在 SMTP 服務中,通訊協定引擎及進階佇列引擎扮演著事件發送程式的角色。通訊協定引擎會發送通訊協定事件。進階佇列引擎會發送傳輸事件。通訊協定引擎及進階佇列引擎皆可調派儲存區及系統事件。

系統管理介面

在執行 Exchange Server 2003 的伺服器上管理 SMTP 通訊協定設定及 SMTP 虛擬伺服器的主要工具是 Exchange 系統管理員。更確切的說,是 Exchange SMTP 嵌入式管理單元 (\Programme\Exchsrvr\bin\SMTPMgr.dll)。您可以在 Exchange 系統管理員中找到此嵌入式管理單元,其位於每個伺服器物件之 [通訊協定] 下的 [SMTP] 容器中。您可以控制大部份套用於輸入郵件傳輸的 SMTP 設定,以及少部份輸出郵件設定。使用 Exchange 系統管理員,您還可以在 Exchange 伺服器上建立其他 SMTP 虛擬伺服器。每個 SMTP 虛擬伺服器均代表一個 SMTP 服務執行個體,而定義方式是用 IP 位址及 TCP 通訊埠號碼的唯一組合。每個 SMTP 虛擬伺服器均會觸發自己的事件,並管理自己的一組事件接收器。如需設定虛擬 SMTP 伺服器的相關資訊,請參閱《Exchange Server 2003 傳輸及路由手冊》。

note附註:
在執行 Exchange Server 2003 的伺服器上建立多個 SMTP 虛擬伺服器並不會提高系統效能。每個 SMTP 虛擬伺服器均具有多個執行緒,可以同時處理大量連線。例如,每個 SMTP 網域同時傳出連線的數目上限預設是 100,而同時傳出連線的上限總數則可達 1,000。

組態設定與事件繫結

Exchange Server 2003 的 SMTP 傳輸子系統仰賴下列三個存放庫來儲存組態資訊:

  • Active Directory   Exchange 系統管理員主要在 Active Directory 中儲存及擷取組態資訊。例如,收件者內容及限制,以及 Exchange 組織的路由拓撲 (包括所有路由群組及郵件連接器),都在 Active Directory 中定義。SMTP 傳輸子系統中的元件會與 Active Directory 進行通訊,以取得此資訊,如 Exchange Server 2003 與 Active Directory 中的說明。
  • IIS Metabase   Windows Server 2003 所隨附之 SMTP 服務的核心元件無法偵測到 Active Directory。例如,所有您對 SMTP 虛擬伺服器套用的設定都必須從 Active Directory 傳輸至 IIS Metabase。此為 Metabase 更新服務的工作。Metabase 更新服務會在 Exchange Server 2003 使用的組態網域控制站中註冊,以便接收任何 Exchange 組態變更的通知。此通知會在變更發生後 15 秒鐘內送出。變更複寫到組態網域控制站之後,IIS Metabase 更新服務會立即將變更複寫到 IIS Metabase。
  • 登錄   大部份您可以為 SMTP 傳輸子系統設定的組態設定,都是儲存在 Active Directory 或 IIS Metabase 中。不過,有幾個會影響 SMTP 服務的系統參數 (如 MaxPercentPoolThreads or AdditionalPoolThreadsPerProc) 會儲存在下列機碼的登錄資料庫中: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SMTPSVC.
    另一個重要機碼是:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo,其包含主控 SMTP 服務的 Inetinfo 處理程序之組態參數。本節先前已介紹數個重要的登錄參數。
    因為所有 SMTP 事件接收器都是 COM 元件,所以它們必須在登錄中的 HKEY_CLASSES_ROOT Hive 下登錄。您可以使用 Regsvr32.exe,手動登錄或取消登錄 COM 元件。

Active Directory 中的組態資訊

Exchange 系統管理員將 SMTP 虛擬伺服器的組態設定儲存在 Active Directory 的組態目錄磁碟分割中。每個虛擬伺服器均由不同組態物件代表。此物件的位置與 Exchange 系統管理員中所顯示的組態物件階層相符,且一般名稱對應到虛擬伺服器在 IIS Metabase 中的數字。例如,預設的 SMTP 虛擬伺服器是 IIS 中的第一個 SMTP 虛擬伺服器,因此在 Active Directory 中,預設的 SMTP 虛擬伺服器組態物件所對應的一般名稱 (CN) 為 1 (例如 CN=1,CN=SMTP,CN=Protocols,CN=SERVER01,CN=Servers,CN=First administrative Group,CN=Administrative Groups,CN=TailspinToys,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=TailspinToys,DC=com)。

下表列出 Exchange Server 2003 為 SMTP 虛擬伺服器在 Active Directory 中儲存的重要組態資訊。若要瞭解如何以程式設計方式管理 Active Directory 中的 SMTP 虛擬伺服器設定,請參閱<使用 ADSI 在 SMTP 虛擬伺服器上設定郵件限制>(英文)。

SMTP 虛擬伺服器的重要 Active Directory 屬性

Active Directory 屬性 描述

msExchServerBindings

指定安全通訊端層 (SSL) 連線的網際網路通訊協定 (IP) 通訊埠繫結。

msExchAuthenticationFlags

指示此 SMTP 虛擬伺服器接受何種類型的驗證。

msExchMaxIncomingConnections

指定此 SMTP 虛擬伺服器可以接受的輸入連線數目上限。

msExchLogType

指定此 SMTP 虛擬伺服器所使用的通訊協定記錄格式。

msExchAccessSSLFlags

識別此 SMTP 虛擬伺服器所支援的加密通道類型。

msExchServerAutoStart

指定何時啟動虛擬伺服器。如果值為 True,則在作業系統啟動時啟動虛擬伺服器。

msExchNTAuthenticationProviders

指定可用於驗證此 SMTP 虛擬伺服器的安全性支援提供者介面 (SSPI) 套件清單。Exchange Server 2003 支援透過一般安全性服務應用程式發展介面 (GSSAPI) 進行 Kerberos 驗證,以及傳統的 Microsoft Windows NT LAN Manager 驗證通訊協定 (NTLM)。

msExchIncomingConnectionTimeout

指定連入連線的閒置時間上限,超過此上限便取消連線。

msExchSmtpMaxOutgoingConnections

指定此 SMTP 虛擬伺服器所發出的輸出連線數目上限。

msExchSmtpOutgoingConnectionTimeout

指定輸出連線的閒置時間上限,超過此上限便取消連線。

msExchSmtpMaxOutgoingConnectionsPerDomain

指定從此 SMTP 虛擬伺服器到特定網域的輸出連線數目上限。

msExchSmtpOutgoingPort

指定 SMTP 虛擬伺服器用於連絡遠端 SMTP 主機的輸出連線通訊埠號碼。

msExchSmtpOutgoingSecurePort

指定使用傳輸層安全性 (TLS) 保護傳輸通道時,SMTP 虛擬伺服器用來連絡遠端 SMTP 主機的輸出連線通訊埠號碼。

msExchSmtpMaxHopCount

指定此 SMTP 虛擬伺服器要使傳輸的郵件到達最終目的地時,可採用的躍點數目上限。

msExchSmtpMaxMessageSize

指定此 SMTP 虛擬伺服器所傳遞的郵件中,每封郵件的大小上限。

msExchSmtpMaxSessionSize

指定一個 SMTP 工作階段可以傳輸的最大資料量 (KB)。

msExchSmtpMaxRecipients

指定在此 SMTP 虛擬伺服器所傳輸的每封郵件中,可以存在的收件者數目上限。

msExchSmtpLocalQueueExpirationTimeout

指定此 SMTP 虛擬伺服器上,本機未傳遞郵件過期的時間。

msExchSmtpLocalQueueDelayNotification

指定此 SMTP 虛擬伺服器必須產生傳遞狀態通知,以通知寄件者本機郵件未到達目的地的時機。

msExchSmtpRemoteQueueExpirationTimeout

指定此 SMTP 虛擬伺服器上,未傳遞輸出郵件過期的時間。

msExchSmtpRemoteQueueDelayNotification

指定此 SMTP 虛擬伺服器必須產生傳遞狀態通知,以通知寄件者輸出郵件未傳輸的時機。

msExchSmtpSmartHost

為此 SMTP 虛擬伺服器所發出的輸出郵件,指定智慧主機路由。

msExchSmtpSmartHostType

指定智慧主機類型。

msExchSmtpMaxOutboundMsgPerDomain

指定此 SMTP 虛擬伺服器在一個工作階段中可為每個網域傳輸的輸出郵件數目上限。

msExchSmtpOutboundSecurityFlag

指定從此 SMTP 虛擬伺服器發出輸出連線時所使用的驗證。

msExchSmtpInboundCommandSupportOptions

控制進行連入連線時支援哪些 SMTP 命令。可變更此值,來停用 8BITMIME、BDAT、CHUNKING 及 PIPELINING 等功能。

msExchSmtpRelayForAuth

決定郵件轉送是否需要驗證。

msExchSmtpPerformReverseDnsLookup

指定是否對傳遞作業執行反向網域名稱系統 (DNS) 查閱。

msExchSmtpDoMasquerade

指定是否讓未傳遞回報 (NDR) 使用偽裝網域。如果設定,則使用偽裝網域。此後,NDR 便會傳回至指定的替代網域,而非該電子郵件的來源網域。

msExchSmtpBadMailDirectory

指定錯誤郵件 (BadMail 資料夾中包含的電子郵件) 在檔案系統上的儲存位置。

msExchSmtpSendBadmailTo

指定錯誤郵件所傳送到的地址。

msExchSmtpFullyQualifiedDomainName

指定此 SMTP 虛擬伺服器的完整網域名稱 (FQDN)。

msExchSmtpPickupDirectory

指定郵件的取得目錄。

msExchSmtpQueueDirectory

指定郵件的佇列目錄。

msExchSmtpRemoteQueueRetries

指定進行遠端郵件傳遞時,是否進行第一次、第二次、第三次及後續重試。

msExchSmtpRelayIpList

指定轉送的 IP 位址清單限制。

msExchBridgeheadedLocalConnectorsDNBL

在此 SMTP 虛擬伺服器是本機 Bridgehead 的路由群組中,指定連接器清單。

msExchBridgeheadedRemoteConnectorsDNBL

在此 SMTP 虛擬伺服器是遠端 Bridgehead 的遠端路由群組中,指定連接器清單。

note附註:
Metabase 更新服務會將所有這些組態設定複寫至 IIS Metabase。

Metabase 中的 SMTP 組態設定

IIS Metabase 是一個階層式的組態及架構資訊儲存庫,可用於設定 IIS 資源。IIS 4.0 及 IIS 5.0 的 Metabase 組態及架構儲存於不易讀取或編輯的二進位檔案 (MetaBase.bin) 中。您必須使用 MetaEdit 工具來檢視及編輯 IIS 4.0 及 IIS 5.0 的 Metabase。MetaEdit 2.2 可從 https://go.microsoft.com/fwlink/?LinkId=47942 下載。

在 IIS 6.0 中,可延伸標記語言 (XML) 格式的檔案 (MetaBase.xml 及 MBSchema.xml) 取代了先前的二進位檔案。IIS 組態資訊儲存於 MetaBase.xml 檔案中,而 MetaBase 的架構則儲存於 MBSchema.xml 檔案中。啟動 IIS 時,MetaBase 儲存層會讀取這些檔案,然後透過 Admin Base Objects (ABO) 將資料寫入記憶體中的 Metabase,如下圖所示。

6584201d-0104-4f3a-ba55-5103964c2762

SMTP 組態機碼

本機 Administrators 群組成員可以檢視並修改 MetaBase.xml 檔案。此為純文字檔案,位於 \Windows\System32\Inetsrv 資料夾中。套用於 SMTP 服務及其 SMTP 虛擬伺服器的 Metabase 項目均以 IisSmtp 作為開頭。

組態項目中的 Location 屬性定義了組態物件的階層。例如,在 Location ="/LM/SmtpSvc/1" 中,LM 代表本機電腦,SmtpSvc 代表一般的 SMTP 服務,數字 (1) 則代表預設 SMTP 虛擬伺服器。列舉值 "1" 對應到 Active Directory 中預設 SMTP 虛擬伺服器物件的 CN 屬性。

下圖根據每個 IIsSmtp Metabase 項目的 Location 屬性,說明 SMTP 虛擬伺服器的組態項目階層。

cdea405a-905c-4da1-bc76-d6101615e059

套用於一般 SMTP 服務的參數是註冊於 SmtpSvc 節點的 Metabase 中。搜尋 Location ="/LM/SmtpSvc" 時,您可以找到此節點。下面是此機碼的簡短清單:

<IIsSmtpService Location ="/LM/SmtpSvc"

    ConnectionTimeout="600"

    DefaultDomain="server01.TailspinToys.com"

    DomainRouting=""

    EnableReverseDnsLookup="FALSE"

    FullyQualifiedDomainName="server01.TailspinToys.com"

    ...

    SmtpRemoteProgressiveRetry="15,30,60,240"

    SmtpRemoteRetryThreshold="3"

    >

    <Custom

        Name="AuthFlags"

        ID="6000"

        Value="AuthBasic | AuthAnonymous | AuthNTLM"

        Type="DWORD"

        UserType="IIS_MD_UT_SERVER"

        Attributes="INHERIT"

    />

    ...

    <Custom

        Name="UnknownName_61537"

        ID="61537"

        Value="0"

        Type="DWORD"

        UserType="IIS_MD_UT_SERVER"

        Attributes="NO_ATTRIBUTES"

    />

</IIsSmtpService>

在 SmtpSvc 節點下,您會找到在執行 Exchange Server 2003 之伺服器上所建立的每個 SMTP 虛擬伺服器的組態設定。SMTP 虛擬伺服器會繼承在 SMTP 服務中設定的一般設定,並可以覆寫這些設定。下面以架構性的方式,列出預設 SMTP 虛擬伺服器的組態區段。請注意 Location 資訊。

<IIsSmtpServer Location ="/LM/SmtpSvc/1"

    ... property definitions that apply only to the

      particular virtual server ...

    >

    <Custom

        ... custom property defintion...

    />

</IIsSmtpServer>

note附註:
當您對 IIS Metabase 中 SMTP 虛擬伺服器的參數名稱與 Active Directory 中 SMTP 虛擬伺服器的屬性進行比較時,會發現它們非常相似。例如,Metabase 參數 PickupDirectory 對應於 Active Directory 屬性 msExchSmtpPickupDirectory。

直接 Metabase 編輯

因為 MetaBase.xml 為文字檔,所以 Administrators 群組成員可以使用一般文字工具 (如 [記事本]) 直接編輯 IIS 6.0 Metabase。不過,在 IIS 執行時,此檔案保持為開啟且鎖定狀態。若要支援直接編輯,您必須啟用 IIS 管理員中的 [啟用直接 Metabase 編輯] 功能。如需如何直接編輯 IIS Metabase 的詳細指示,請參閱如何啟用 IIS 管理員中的啟用直接 Metabase 編輯功能

本機網域註冊

在 Metabase 的每個 SMTP 虛擬伺服器節點下,您都會找到重要的子節點,如 Domain (Location ="/LM/SmtpSvc/1/Domain") 及 EventManager (Location ="/LM/SmtpSvc/1/EventManager") 節點。網域節點內包含網域定義,決定了 SMTP 虛擬伺服器應當執行的路由動作。例如,依照收件者原則的定義,SMTP 服務必須接受所有本機 SMTP 網域的郵件,但可能必須拒絕將郵件轉送至非本機網域。Metabase 更新服務會為所有 SMTP 虛擬伺服器,將收件者原則中的網域資訊複寫到 IIS Metabase。

note附註:
網域定義亦包含參照到 Active Directory 站台的項目。網域名稱的範例如下:705260ab-46c4-454d-bfdd-96b9c605364c._msdcs.fabrikam.com。對這些項目執行路由傳送,會導致 SMTP 虛擬伺服器將郵件放到 \Drop 目錄中,讓 Active Directory 可以從這個目錄擷取。請勿變更或移除這些網域項目,以避免發生目錄複寫問題。Active Directory 會使用 SMTP 服務,在站台間複寫目錄變更。

事件接收器註冊

EventManager 節點下的項目是事件註冊。若要讓 SMTP 服務使用事件接收器,就必須在 IIS Metabase 中註冊事件接收器,以便在發生相關事件時,SMTP 服務可以建立及執行這些接收器。IIsConfigObject 會在 IIS Metabase 中定義事件繫結。例如:

<IIsConfigObject    Location ="/LM/SmtpSvc/1/EventManager/

EventTypes/{283430C9-1850-11D2-9E03-00C04FA322BA}/

Bindings/{A928AD15-1610-11D2-9E02-00C04FA322BA}/

SinkClass"

>

<Custom

Name="MD_0"

ID="0"

Value="Exchange.Router"

Type="STRING"

UserType="UNKNOWN_UserType"

Attributes="NO_ATTRIBUTES"

/>

</IIsConfigObject>

此繫結會將特殊事件的 GUID (如 283430C9-1850-11D2-9E03-00C04FA322BA),與事件接收器 (如 Exchange Router 接收器) 相關聯。繫結資訊中的第二個 GUID 項目 {A928AD15-1610-11D2-9E02-00C04FA322BA} 是此特殊事件繫結項目的識別碼 (ID)。事件繫結識別碼在 Metabase 中必須是唯一的,但一個特殊事件可以有多個相關的事件接收器,如本節前面的圖 6.4 所示。

事件繫結參數是定義於 Metabase 階層的每個事件接收器節點下。目前的清單定義了 SinkClass 值,該值會將 SMTP 傳輸 OnGetMessageRouter 事件與 Exchange.Router 接收器類別相關聯。還有其他繫結項目,這些項目會定義事件接收器的顯示名稱 (如 Exchange Router),並定義其他參數 (如事件接收器的優先順序)。下表列出可為事件繫結指定的參數。

事件繫結資訊

屬性描述 屬性描述

ID

用來以唯一方式識別繫結的 GUID。此為必要資訊。

DisplayName

讓使用者容易記憶的繫結名稱。

SinkClass

事件接收器類別的程式設計識別碼 (ProgID)。

Enabled

指出目前是否要啟用繫結的旗標。如果不指定此旗標,則會啟用事件接收器。此為選用參數。

MaxFirings

接收器可接收的事件通知數目上限,超過此上限就停用繫結。此為選用參數。

EventBindingProperties

為整個繫結所定義之其他屬性的字典 (或雜湊)。此為選用參數。

SinkProperties

接收器屬性是為實作特殊接收器而保留的。當接收器收到事件的通知時,事件發送程式會將接收器屬性集合傳送至事件接收器。例如,用於將免責聲明新增至郵件的事件接收器,可能會透過接收器屬性收到免責聲明文字。

SourceProperties

來源屬性的定義是透過實作特殊事件發送程式而來。例如,輸入及輸出通訊協定事件發送程式使用 Rule 及 Priority 屬性,來判定何時通知接收器接收事件。除了 OnTransportSubmission 事件外,大部份傳輸事件接收器不使用 Rule 來源屬性。所有通訊協定及傳輸事件支援使用 Priority 來源屬性。

下列來源屬性用於通訊協定及傳輸事件的事件繫結:

  • Rule   識別接收器繫結所用之通訊協定篩選的字串。發送程式使用該規則作為決定是否通知接收器的單一條件或一組條件。這些規則是 SMTP 通訊協定命令規則,如 EHLO。規則可能包含條件,如 EHLO=*.contoso.com。多個規則以分號區隔。
  • Priority   接收器的通知優先順序 (與註冊用於接收同一事件通知的其他接收器相比較而言)。值的範圍是從 0 (最高) 到 32767 (最低)。此為選用屬性。預設優先順序為 24575。具有相同優先順序的接收器會以隨機順序執行。

伺服器延伸物件

事件繫結中的 GUID 保證事件類型與事件接收器之間唯一關聯,但是由於這些識別碼邏輯上並不清楚,因而可能會有問題。例如,如果您要瞭解何種事件對應於上表中列出的事件接收器,則必須在登錄中的 [HKEY_CLASSES_ROOT\Component Categories] 下搜尋 GUID 283430C9-1850-11D2-9E03-00C04FA322BA。然後,您會發現此 GUID 識別 SMTP 傳輸 OnGetMessageRouter 事件類型。此繫結定義範例中的第二個 GUID (A928AD15-1610-11D2-9E02-00C04FA322BA) 是 Reapi.dll 中實作之 Exchange Router 類別的 CLSID。此 COM 元件的登錄機碼是 HKEY_CLASSES_ROOT\CLSID\{A928AD15-1610-11d2-9E02-00C04FA322BA}。不過,此 CLSID 僅用於在 Metabase 中建立事件繫結的唯一識別碼。重要的是 SinkClass 值,它定義事件類型與事件接收器類別之間的關聯。

幸運的是,您不必使用 GUID 來管理事件接收器繫結。而可以使用 Seo.dll 中實作的伺服器延伸物件。Microsoft 開發了一種指令碼,它可示範如何使用伺服器延伸物件來管理 SMTP 服務的事件繫結。此指令碼稱為 SMTPReg.vbs,您可在<smtpreg.vbs 事件管理指令碼>(英文) 上找到它。例如,您可以將 SMTPReg.vbs 與下列命令搭配使用,即可將所有 SMTP 事件繫結從 IIS Metabase 寫入名為 Event_Bindings.txt 的檔案:cscript smtpreg.vbs /enum > Event_Bindings.txt。下列清單顯示 Exchange Router 繫結項目的輸出:

    ---------

    | Binding |

    ---------

        Event: SMTP Transport OnGetMessageRouter

        ID: {A928AD15-1610-11D2-9E02-00C04FA322BA}

        Name: Exchange Router

        SinkClass: Exchange.Router

        Enabled: True

        SourceProperties: {

            priority = 8192

        }