共用方式為


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

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

本文說明如何解決一個問題,即從 Database Mail 成功排入佇列的電子郵件無法傳遞。

診斷問題

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

  1. 首先,若要確認 Database Mail 已啟用,請使用系統預存程式的 Database Mail XPs(伺服器組態選項),sp_configure如下列範例所示:

    EXEC sp_configure 'show advanced', 1;  
    RECONFIGURE; 
    EXEC sp_configure; 
    GO
    
  2. 然後,在 msdb 資料庫中執行下列語句來檢查郵件佇列的狀態:

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

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

  3. 請檢查 sysmail_event_log 檢視有無活動。 檢視應該包含一個項目,說明已經啟動了 Database Mail 外部程式。 如果在sysmail_event_log 檢視中沒有條目,請參閱 中的徵兆:sysmail_event_log

  4. 如果 sysmail_event_log 檢視中有錯誤,請對特定錯誤進行排除故障。 檢查sysmail_allitems檢視來查看訊息的狀態。

訊息狀態未傳送

未傳送的狀態表示 Database Mail 外部程式尚未處理電子郵件訊息。

Database Mail 外部程式在處理郵件時可能落後;外部程式處理訊息的速率取決於網路狀況、重試逾時、訊息數量,以及 SMTP 伺服器的容量。 如果問題持續存在,請考慮使用多個設定檔,將訊息散發於多個 SMTP 伺服器。 檢閱 SQL Server 中傳送的電子郵件載入,以確認傳送的電子郵件有效且預期。

檢查最近修改日期,以取得成功傳遞的訊息。 如果上次成功傳遞發生在較早之前,請檢查 sysmail_event_log 檢視,以確認 Service Broker 已成功啟動外部程式。 如果上次嘗試並未啟動外部程式,請確認 Database Mail 外部程式是否位於正確目錄,且 SQL Server 服務帳戶是否具有執行可執行檔的權限。 檢查 Windows 應用程式事件記錄檔中是否有 Database Mail 的相關錯誤。

注意

若要刪除舊的未傳送訊息,請等到無法傳遞的訊息是佇列中最舊的訊息,然後使用系統預存程式 msdb.dbo.sysmail_delete_mailitems_sp 加以刪除。

訊息狀態正在重試

重試狀態表示 Database Mail 嘗試將訊息傳遞至 SMTP 伺服器,但無法傳遞。 這通常是由網路干擾、SMTP 伺服器失敗或 Database Mail 帳戶設定不正確所造成。 訊息最終應該會成功或失敗,並將訊息張貼至 Windows 應用程式事件記錄檔。

訊息狀態已傳送

狀態為已傳送表示 Database Mail 外部程式已順利地將電子郵件訊息傳遞至 SMTP 伺服器。

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

訊息狀態失敗

狀態為失敗,表示 Database Mail 外部程式無法將訊息傳遞至 SMTP 伺服器。

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

後續步驟