首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET SmtpClient PickupDirectoryFromIis 無法取得 IIS 拾取目錄完整排查

     編輯:ASP.NET 基礎

錯誤現象

System.Net.Mail.SmtpException: 無法取得 IIS 拾取目錄 (Cannot get IIS pickup directory)
   at System.Net.Mail.SmtpClient.InitializePickupDirectory()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)

程式碼使用 `DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis`,本機開發正常,部署至 Windows Server 2008/2012/2016+ 失敗。

根本原因

`PickupDirectoryFromIis` 要求:

  1. 本機已安裝並啟動 **SMTP 服務 (IIS 6.0 相容層)**。
  2. 執行身分 (AppPool Identity) 有權限讀取 IIS Metabase 中的 `PickupDirectory` 路徑。
  3. 該目錄實際存在且可寫入。

缺一不可。

逐步排查清單

1. 確認 SMTP 服務已安裝並啟動

// PowerShell 以管理員執行
Get-WindowsFeature SMTP-Server | Install-WindowsFeature
Set-Service SMTPSVC -StartupType Automatic
Start-Service SMTPSVC

GUI:伺服器管理員 → 功能 → 添加功能 → SMTP Server。

2. 確認 SMTP 服務設定正確

  • 開啟 **IIS 6.0 管理員** (inetmgr6) → 本機 SMTP 虛擬伺服器 → 內容 → **傳遞** 索引標籤 → **進階** → 確認 **完全合格網域名稱 (FQDN)** 已正確設定 (如 `mail.example.com`),不可留空或為 `localhost`。
  • 同頁面確認 **智慧主機** 若有填寫需可連通。
  • **存取** 索引標籤 → **連線控制** / **轉送限制** → 允許本機 IP (127.0.0.1) 及 Web 伺服器 IP。

3. 防火牆開放連接埠

TCP 25 (SMTP)、TCP 443/587 (若用 SSL/TLS)、UDP 53 (DNS 解析)。
測試:`telnet localhost 25` → 輸入 `HELO localhost` `MAIL FROM:...` `RCPT TO:...` `DATA` `Subject:test` `.` `QUIT`。

4. 關鍵:Metabase 權限 (最常見原因)

ASP.NET 執行身分 (通常為 `IIS_IUSRS` 或自訂 AppPool Identity) **無權讀取 IIS Metabase** 中的 `SmtpSvc` 節點以取得 Pickup 目錄路徑。

解決步驟

  1. 下載 **IIS 6.0 Resource Kit Tools** (含 `metaacl.vbs`)。
  2. 執行 **Metabase Explorer** (安裝後在 `Program Files (x86)\IIS Resources\Metabase Explorer`)。
  3. 展開 `LM` → `SmtpSvc` → 右鍵 → **Permissions**。
  4. 加入 `IIS_IUSRS` (或特定 AppPool Identity `IIS AppPool\YourPoolName`),勾選 **Read** 權限。
  5. 套用並重啟 IIS (`iisreset`)。

5. Pickup 目錄寫入權限

預設 Pickup 目錄:`C:\inetpub\mailroot\Pickup`。
確認 `IIS_IUSRS` / AppPool Identity 對此資料夾具備 **寫入/修改** 權限。

替代方案:指定明確 Pickup 目錄 (繞過 Metabase)

var client = new SmtpClient
{
    DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory,
    PickupDirectoryLocation = @"C:\EmailPickup", // 自訂目錄,需預先建立並給權限
    UseDefaultCredentials = true
};
client.Send(mail);

優點:不依賴 IIS SMTP 服務設定、不需 Metabase 權限、部署簡單 (XCOPY 部署友善)。
缺點:需自行確保目錄被郵件伺服器 (或背景服務) 定期處理,或改用 `SpecifiedPickupDirectory` 搭配本地 SMTP 服務 (如 hMailServer、Postfix Windows 版) 監聽該目錄。

現代化建議:棄用 PickupDirectory,改用 SMTP 直接發送或郵件佇列

總結

`PickupDirectoryFromIis` 失敗 90% 是 **Metabase 讀取權限** 問題。最快修復:給 `IIS_IUSRS` 讀取 `LM/SmtpSvc` 權限。長遠最佳實務:**改用外部 SMTP 服務 (API 金鑰認證) + 非同步佇列發送**,徹底擺脫本機 SMTP 服務設定地獄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點
SmtpClient + 遠端 SMTP (SendGrid, Mailgun, Azure Communication Services, 企業 Exchange)無本機服務依賴、高送達率、統計追蹤、API 金鑰認證需網路連通、可能有費用
本機 hMailServer / Postal / Papercut (開發測試)完整 SMTP/IMAP/WebAdmin、支援 Pickup 目錄、免費需安裝維護
背景佇列 + MailKit 發送非阻塞、重試策略、連線池、跨平台程式碼較多