Database Mail 疑難排解的一般步驟
適用於:SQL Server Azure SQL 受控執行個體
Database Mail 疑難排解牽涉到檢查下列 Database Mail 系統的一般區域。 這些程序雖然是以邏輯順序來呈現,但可以使用任何順序來評估。
權限
您必須是系統管理員固定伺服器角色的成員,才能針對 Database Mail 的各個方面進行疑難排解。 如果使用者不是 sysadmin 固定伺服器角色的成員,則只能取得他們嘗試傳送的電子郵件資訊,而無法取得由其他使用者傳送的電子郵件資訊。
是否已啟用 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,使用者必須是
msdb
資料庫中 DatabaseMailUserRole 資料庫角色的成員。 sysadmin 固定伺服器角色和msdb
db_owner 角色的成員會自動歸屬為 DatabaseMailUserRole 角色成員。 若要列出 DatabaseMailUserRole 的所有其他成員,請執行下列陳述式:EXEC msdb.sys.sp_helprolemember 'DatabaseMailUserRole';
若要將使用者新增至 DatabaseMailUserRole 角色,請使用下列陳述式:
USE msdb; GO 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
,請嘗試重新啟動佇列。 使用下列陳述式停止佇列:
EXEC msdb.dbo.sysmail_stop_sp;
然後,使用下列陳述式啟動佇列:
EXEC msdb.dbo.sysmail_start_sp;
注意
使用 sysmail_help_queue_sp
結果集中的長度資料行,來判斷郵件佇列中的電子郵件數目。
問題影響部分或所有的帳戶
如果您判斷只有部分設定檔可以傳送郵件,那麼可能是有問題的設定檔使用的 Database Mail 帳戶出問題。 若要判斷哪些帳戶可以成功傳送郵件,請執行以下陳述式:
SELECT sent_account_id, sent_date FROM msdb.dbo.sysmail_sentitems;
如果無法運作的設定檔並未使用任何列出的帳戶,則可能是該設定檔的所有可用帳戶都無法正常運作。 若要測試個別帳戶,請使用 [Database Mail 設定精靈] 建立一個含單一帳戶的設定檔,然後使用新的帳戶從 [傳送測試電子郵件] 對話方塊來傳送電子郵件。
若要檢視 Database Mail 傳回的錯誤訊息,請執行以下陳述式:
SELECT * FROM msdb.dbo.sysmail_event_log;
注意
當郵件成功傳遞到 SMTP 郵件伺服器之後,Database Mail 即會將該郵件視為已傳送。 接下來所發生的錯誤,例如收件者的電子郵件地址無效,可能會使得郵件沒有傳遞出去,但是不會包含在 Database Mail 的記錄檔中。
重試郵件傳遞
如果您判斷 Database Mail 是因為無法正確連接 SMTP 伺服器而失敗,您可以增加 Database Mail 嘗試傳送每則訊息的次數,來提高郵件成功傳遞的比率。 請開啟 [Database Mail 設定精靈],並選取 [檢視] 或變更系統參數選項。 或者,也可以將多個帳戶與設定檔相關聯,讓主要帳戶具有容錯移轉的機制,Database Mail 就可以使用容錯移轉帳戶來傳送電子郵件。
在 [設定系統參數] 頁面上,[帳戶重試嘗試] 的預設值是五次,[帳戶重試延遲] 的預設值是 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;