Database Mail 疑難排解:一般步驟
Database Mail 疑難排解牽涉到檢查下列 Database Mail 系統的一般區域。這些程序雖然是以邏輯順序來呈現,但可以使用任何順序來評估。
判斷是否已啟用 Database Mail
在 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。如需詳細資訊,請參閱<了解介面區組態>。
如果您決定適合啟用 Database Mail,請執行下列程式碼:
sp_configure 'Database Mail XPs', 1; GO RECONFIGURE; GO
若要將 sp_configure 程序還原為預設狀態 (不顯示進階選項),請執行下列程式碼:
sp_configure 'show advanced', 0; GO RECONFIGURE; GO
判斷是否已正確設定使用者,使其可以傳送 Database Mail
若要傳送 Database Mail,使用者必須是 DatabaseMailUserRole 的成員。系統管理員 (sysadmin) 固定伺服器角色和 msdbdb_owner 角色的成員自動為 DatabaseMailUserRole 角色的成員。若要列出 DatabaseMailUserRole 的所有其他成員,請執行以下陳述式:
EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
若要將使用者加入 DatabaseMailUserRole 角色,請使用以下陳述式:
sp_addrolemember @rolename = 'DatabaseMailUserRole' ,@membername = '<database user>';
若要傳送 Database Mail,使用者必須至少擁有一個 Database Mail 設定檔的存取權。若要列出使用者 (主體) 和他們可存取的設定檔,請執行以下陳述式。
EXEC msdb.dbo.sysmail_help_principalprofile_sp;
使用「Database Mail 組態精靈」可建立設定檔,並授與使用者對設定檔的存取權。
確認已啟動 Database Mail
當有電子郵件訊息要處理時,Database Mail 外部程式就會啟動。若在指定的逾時期限內沒有訊息需要傳送,程式就會結束。若要確認 Database Mail 是否已啟動,請執行以下陳述式。
EXEC msdb.dbo.sysmail_help_status_sp;
如果 Database Mail 未啟動,請執行以下陳述式來啟動它:
EXEC msdb.dbo.sysmail_start_sp;
如果 Database Mail 外部程式已啟動,請使用以下陳述式檢查郵件佇列的狀態:
EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'mail';
郵件佇列應該為 RECEIVES_OCCURRING 狀態。狀態佇列會隨時間而變動。如果郵件佇列狀態不是 RECEIVES_OCCURRING,請試著使用 sysmail_stop_sp 停止佇列,然後再使用 sysmail_start_sp 啟動佇列。
[!附註]
使用 sysmail_help_queue_sp 結果集的 length 資料行可判斷 Mail 佇列中的電子郵件數目。
判斷 Database Mail 的問題是否會影響設定檔中的所有帳戶或只影響部分帳戶
如果您判斷是只有部分設定檔可以傳送郵件,那麼可能是有問題的設定檔使用的 Database Mail 帳戶出問題。若要判斷哪些帳戶可以成功傳送郵件,請執行以下陳述式:
SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
如果不能使用的設定檔沒有使用任何列出的帳戶,則可能是該設定檔的所有可用帳戶都無法正常使用。若要測試個別帳戶,請使用「Database Mail 組態精靈」建立一個含有單一帳戶的設定檔,然後使用新的帳戶從 [傳送測試電子郵件] 對話方塊來傳送電子郵件。
若要檢視 Database Mail 傳回的錯誤訊息,請執行以下陳述式:
SELECT * FROM msdb.dbo.sysmail_event_log;
[!附註]
當 Database Mail 將郵件傳遞到 SMTP 郵件伺服器之後,它會視為郵件已傳送。接下來所發生的錯誤,例如收件者的電子郵件地址無效,可能會使得郵件沒有傳遞出去,但是不會包含在 Database Mail 的記錄檔中。
設定 Database Mail 重試郵件傳遞
如果您判斷 Database Mail 是因為無法正確連接 SMTP 伺服器而失敗,您可以增加 Database Mail 嘗試傳送每則訊息的次數,來提高郵件成功傳遞的比率。請開啟「Database Mail 組態精靈」,並選取 [檢視或變更系統參數] 選項。或者,也可以將多個帳戶與設定檔關聯,讓主要帳戶具有容錯移轉的機制,Database Mail 就可以使用容錯移轉帳戶來傳送電子郵件。
在 [設定系統參數] 頁面上,[帳戶重試嘗試] 的預設值是 5 次,[帳戶重試延遲] 的預設值是 60 秒,表示如果無法在 5 分鐘內連接 SMTP 伺服器,訊息傳遞就會失敗。增加這些參數可延長訊息傳遞失敗前的時間。
[!附註]
傳送大量訊息時,較大的預設值會增加可靠性,不過很多訊息一直重複嘗試傳遞,也會大幅增加使用的資源。請解決導致 Database Mail 無法正常連絡 SMTP 伺服器的網路或 SMTP 伺服器問題,來處理根本的問題。
安全性
您必須是系統管理員 (sysadmin) 固定伺服器角色的成員,才能對 Database Mail 各方面進行疑難排解。不是系統管理員 (sysadmin) 固定伺服器角色成員的使用者,只能取得他們嘗試傳送之電子郵件,而無法取得由其他使用者傳送之電子郵件的相關資訊。