共用方式為


Database Mail 疑難排解的一般步驟

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

Database Mail 疑難排解牽涉到檢查下列 Database Mail 系統的一般區域。 這些程序雖然是以邏輯順序來呈現,但可以使用任何順序來評估。

權限

您必須是系統管理員固定伺服器角色的成員,才能針對 Database Mail 的各個方面進行疑難排解。 如果使用者不是 sysadmin 固定伺服器角色的成員,則只能取得他們嘗試傳送的電子郵件資訊,而無法取得由其他使用者傳送的電子郵件資訊。

是否已啟用 Database Mail

  1. 在 SQL Server Management Studio 中,使用查詢編輯器視窗連接至 SQL Server 的執行個體,然後執行下列程式碼:

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

    在結果窗格中,確認 Database Mail XPs 的 run_value 設為 1。 如果 run_value 不是 1,則不會啟用 Database Mail。 為了減少惡意使用者可攻擊的功能數目,所以系統不會自動啟用 Database Mail。 如需詳細資訊,請參閱了解介面區設定

  2. 如果您覺得這是適合啟用 Database Mail 的時機,請執行下列程式碼:

    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    
  3. 若要將 sp_configure 程序還原為預設狀態 (不顯示進階選項),請執行下列程式碼:

    sp_configure 'show advanced', 0; 
    GO
    RECONFIGURE;
    GO
    

是否已正確設定使用者以傳送郵件

  1. 若要傳送 Database Mail,使用者必須是 msdb 資料庫中 DatabaseMailUserRole 資料庫角色的成員。 sysadmin 固定伺服器角色和 msdbdb_owner 角色的成員會自動歸屬為 DatabaseMailUserRole 角色成員。 若要列出 DatabaseMailUserRole 的所有其他成員,請執行下列陳述式:

    EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
    
  2. 若要將使用者新增至 DatabaseMailUserRole 角色,請使用下列陳述式:

    USE msdb;
    GO
    
    sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<database user>';
    
  3. 若要傳送 Database Mail,使用者必須至少擁有一個 Database Mail 設定檔的存取權。 若要列出使用者 (主體) 和他們可存取的設定檔,請執行以下陳述式。

    EXEC msdb.dbo.sysmail_help_principalprofile_sp;
    
  4. 使用「Database Mail 組態精靈」可建立設定檔,並授與使用者對設定檔的存取權。

是否已啟動 Database Mail

  1. 當有電子郵件訊息要處理時,就會啟動 Database Mail 外部程式。 若在指定的逾時期限內沒有訊息需要傳送,程式就會結束。 若要確認 Database Mail 是否已啟動,請執行下列陳述式:

    EXEC msdb.dbo.sysmail_help_status_sp;
    
  2. 如果 Database Mail 啟用未啟動,請執行以下陳述式來進行啟動:

    EXEC msdb.dbo.sysmail_start_sp;
    
  3. 如果 Database Mail 外部程式已啟動,請使用以下陳述式檢查郵件佇列的狀態:

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

    郵件佇列應該為 RECEIVES_OCCURRING 狀態。 狀態佇列會隨時間而變動。 如果郵件佇列狀態不是 RECEIVES_OCCURRING,請嘗試重新啟動佇列。 使用下列陳述式停止佇列:

EXEC msdb.dbo.sysmail_stop_sp;

然後,使用下列陳述式啟動佇列:

EXEC msdb.dbo.sysmail_start_sp;

注意

使用 sysmail_help_queue_sp 結果集中的長度資料行,來判斷郵件佇列中的電子郵件數目。

問題影響部分或所有的帳戶

  1. 如果您判斷只有部分設定檔可以傳送郵件,那麼可能是有問題的設定檔使用的 Database Mail 帳戶出問題。 若要判斷哪些帳戶可以成功傳送郵件,請執行以下陳述式:

    SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
    
  2. 如果無法運作的設定檔並未使用任何列出的帳戶,則可能是該設定檔的所有可用帳戶都無法正常運作。 若要測試個別帳戶,請使用 [Database Mail 設定精靈] 建立一個含單一帳戶的設定檔,然後使用新的帳戶從 [傳送測試電子郵件] 對話方塊來傳送電子郵件。

  3. 若要檢視 Database Mail 傳回的錯誤訊息,請執行以下陳述式:

    SELECT * FROM msdb.dbo.sysmail_event_log;
    

    注意

    當郵件成功傳遞到 SMTP 郵件伺服器之後,Database Mail 即會將該郵件視為已傳送。 接下來所發生的錯誤,例如收件者的電子郵件地址無效,可能會使得郵件沒有傳遞出去,但是不會包含在 Database Mail 的記錄檔中。

重試郵件傳遞

  1. 如果您判斷 Database Mail 是因為無法正確連接 SMTP 伺服器而失敗,您可以增加 Database Mail 嘗試傳送每則訊息的次數,來提高郵件成功傳遞的比率。 請開啟 [Database Mail 設定精靈],並選取 [檢視] 或變更系統參數選項。 或者,也可以將多個帳戶與設定檔相關聯,讓主要帳戶具有容錯移轉的機制,Database Mail 就可以使用容錯移轉帳戶來傳送電子郵件。

  2. 在 [設定系統參數] 頁面上,[帳戶重試嘗試] 的預設值是五次,[帳戶重試延遲] 的預設值是 60 秒,這表示如果無法在 5 分鐘內連接 SMTP 伺服器,訊息傳遞就會失敗。 請增加這些參數,以延長訊息傳遞失敗前的時間。

    注意

    傳送大量訊息時,較大的預設值會增加可靠性,不過很多訊息一直重複嘗試傳遞,也會大幅增加使用的資源。 請解決導致 Database Mail 無法正常連絡 SMTP 伺服器的網路或 SMTP 伺服器問題,來處理根本的問題。

確認 msdb 已啟用 Service Broker

資料庫郵件需要為 msdb 資料庫啟用 Service Broker。 使用下列 T-SQL 指令碼,確認是否已在 msdb 上啟用 Service Broker:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb' ; -- should be 1

如果未啟用,則必須啟用 Service Broker。 不過,下列樣本指令碼需要 msdb 系統資料庫的專屬存取權,因此可能無法在一般上班時間執行。 如需詳細資訊,請參閱 ALTER DATABASE ... SET ENABLE_BROKER

ALTER DATABASE msdb SET ENABLE_BROKER;

下一步