Database Mail:郵件已排入佇列中,未傳遞

適用於:SQL ServerAzure SQL 受控執行個體

本主題說明如何對電子郵件訊息已成功排入佇列但訊息並未傳遞的問題,進行疑難排解。

診斷問題

Database Mail 外部程式會將電子郵件活動記錄在 msdb 資料庫中。

首先,若要確認是否已啟用 Database Mail,請使用 sp_configure 系統預存程序的 Database Mail XP 選項,如下例所示:

EXEC sp_configure 'show advanced', 1;  
RECONFIGURE; 
EXEC sp_configure; 
GO

接著,請在 msdb 資料庫中執行下列陳述式,以便檢查郵件佇列的狀態:

EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'Mail';

如需資料行的詳細說明,請參閱 sysmail_help_queue_sp (Transact-SQL)

檢查 sysmail_event_log 檢視中是否有活動。 檢視應該包含一個項目,說明已經啟動了 Database Mail 外部程式。 如果 sysmail_event_log 檢視中沒有項目,請參閱徵兆訊息已排入佇列,但 sysmail_event_log 中沒有項目。 如果 sysmail_event_log 檢視中有錯誤,請針對特定錯誤進行疑難排解。

如果 sysmail_event_log 檢視中有項目,請檢查 sysmail_allitems 檢視以取得訊息的狀態。

訊息狀態未傳送

狀態為未傳送表示 Database Mail 外部程式尚未處理電子郵件訊息。 Database Mail 外部程式可能已經在處理訊息時落後;外部程式處理訊息的速率取決於網路狀況、重試逾時、訊息量,以及 SMTP 伺服器的容量。 如果問題持續存在,請考慮使用多個設定檔,將訊息散發於多個 SMTP 伺服器。

檢查最近修改日期,以取得成功傳遞的訊息。 如果上次的成功傳遞已經過好一陣子,請檢查 sysmail_event_log 檢視,驗證 Service Broker 是否成功啟動外部程式。 如果上次嘗試並未啟動外部程式,請確認 Database Mail 外部程式是否位於正確目錄,且 SQL Server 服務帳戶是否具有執行可執行檔的權限。

注意

若要刪除舊的未傳送訊息,請先等到無法傳遞的訊息成為佇列中最舊訊息後,再使用 sysmail_delete_mailitems_sp 刪除它們。

訊息狀態正在重試

狀態為「正在重試」表示 Database Mail 已嘗試,但無法將訊息傳遞至 SMTP 伺服器。 這通常是由網路干擾、SMTP 伺服器失敗或 Database Mail 帳戶設定不正確所造成。 不論訊息最後傳遞成敗與否,都會張貼一份訊息至事件記錄檔中。

訊息狀態已傳送

狀態為已傳送表示 Database Mail 外部程式已順利地將電子郵件訊息傳遞至 SMTP 伺服器。 如果訊息並未到達目的地,SMTP 伺服器會接受來自 Database Mail 的訊息,但是沒有將訊息傳遞給最終收件者。 檢查 SMTP 伺服器的記錄檔,或連絡 SMTP 伺服器的系統管理員。 您也可以使用其他用戶端 (如 Outlook Express) 來測試 SMTP 郵件伺服器。

訊息狀態失敗

狀態為失敗,表示 Database Mail 外部程式無法將訊息傳遞至 SMTP 伺服器。 在此情況下,sysmail_event_log 檢視會包含來自外部程式的詳細資訊。 如需聯結 sysmail_faileditemssysmail_event_log 以擷取詳細錯誤訊息的範例查詢,請參閱檢查使用 Database Mail 傳送之電子郵件訊息的狀態。 最常見的失敗原因是目的地位址不正確,或網路發生問題而使外部程式無法到達一或多個容錯移轉帳戶。 SMTP 伺服器的問題也會導致該伺服器拒絕郵件。 請使用 [Database Mail 設定精靈],將 [記錄層級] 變更為 [詳細資訊],然後傳送測試郵件來調查失敗點。

另請參閱