共用方式為


Database Mail 疑難排解的一般步驟

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

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

權限

您必須是 系統管理員 固定伺服器角色的成員,才能針對 Database Mail 的所有層面進行疑難解答。 不是 系統管理員 固定伺服器角色成員的使用者只能取得他們嘗試傳送之電子郵件的相關信息,而不是其他使用者傳送的電子郵件。

是否已啟用 Database Mail

  1. SQL Server Management Studio 中,使用查詢編輯器視窗連接到 SQL Server 的實例,然後執行下列程式代碼:

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

    在結果窗格中,確認 run_value[Database Mail XP] 的 [伺服器組態] 選項 已設定為 1

    run_value如果 不是 1,則不會啟用 Database Mail。

    為了減少惡意使用者可攻擊的功能數目,所以系統不會自動啟用 Database Mail。 如需詳細資訊,請參閱介面區設定

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

    sp_configure 'show advanced', 1; 
    GO
    RECONFIGURE;
    GO
    sp_configure 'Database Mail XPs', 1; 
    GO
    RECONFIGURE;
    GO
    

    若要將 sp_configure 程式還原為其預設狀態,但未顯示進階選項,請執行下列程式代碼:

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

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

  1. 若要傳送 Database Mail,使用者必須是 資料庫中 msdb 資料庫角色的成員。 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

當有電子郵件訊息要處理時,就會啟動 Database Mail 外部程式。 若在指定的逾時期限內沒有訊息需要傳送,程式就會結束。

  1. 若要確認 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;
    

    注意

    使用length結果集中的sysmail_help_queue_sp欄,來判斷郵件佇列中的電子郵件數目。

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

如果您已判斷部分但並非所有配置檔都可以傳送郵件,則問題配置檔所使用的 Database Mail 帳戶可能有問題。

  1. 若要判斷哪些帳戶可以成功傳送郵件,請執行以下陳述式:

    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;