使用 Database Mail 的常見錯誤

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

本文描述使用 Database Mail 及其解決方案時會發生的一些常見錯誤。

找不到預存程序 'sp_send_dbmail'

sp_send_dbmail 預存程序已安裝在 msdb 資料庫。 您必須從 msdb 資料庫執行 sp_send_dbmail,或為預存程序指定三段式名稱。

範例:

EXEC msdb.dbo.sp_send_dbmail ...

或:

USE msdb;
GO
EXEC dbo.sp_send_dbmail ...

使用 Database Mail 設定精靈啟用及設定 Database Mail。

設定檔無效

此訊息有兩個可能原因。 指定的設定檔不存在,或執行 sp_send_dbmail (Transact-SQL) 的使用者無權存取設定檔。

若要檢查設定檔的權限,請使用設定檔名稱執行預存程序 sysmail_help_principalprofile_sp (Transact-SQL)。 使用預存程序 sysmail_add_principalprofile_sp (Transact-SQL)Database Mail 設定精靈授與 msdb 使用者或群組存取設定檔的權限。

sp_send_dbmail 拒絕權限

此主題描述如何針對嘗試傳送 Database Mail 之使用者沒有權限執行 sp_send_dbmail 的錯誤訊息進行疑難排解。

錯誤文字是:

EXECUTE permission denied on object 'sp_send_dbmail', 
database 'msdb', schema 'dbo'.

若要傳送 Database Mail,使用者必須是 msdb 資料庫中的使用者,且為 msdb 資料庫中 DatabaseMailUserRole 資料庫角色的成員。 若要將 msdb 使用者或群組新增至此角色,請使用 SQL Server Management Studio 或對需要傳送 Database Mail 的使用者或角色執行下列陳述式。

EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<user or role name>';
GO

如需詳細資訊,請參閱 sp_addrolemembersp_droprolemember

Database Mail 已排入佇列,sysmail_event_log 或 Windows 應用程式事件記錄檔中沒有項目

Database Mail 依賴 Service Broker 佇列電子郵件訊息。 如已停止 Database Mail,或如果未在 msdb 資料庫中啟動 Service Broker 訊息傳遞,則 Database Mail 會將訊息佇列於資料庫中,但無法傳遞訊息。 在此情況下,Service Broker 訊息會保留在 Service Broker 郵件佇列中。 Service Broker 不啟動外部程式,因此 sysmail_event_log 中沒有項目,且 sysmail_allitems 與相關檢視中的項目狀態不會更新。

執行下列陳述式,檢查 msdb 資料庫中是否啟用 Service Broker:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';

0 值表示 msdb 資料庫未啟動 Service Broker 訊息傳遞。 若要修正此問題,請使用下列 TRANSACT-SQL 命令在資料庫中啟動 Service Broker:

USE master ;
GO

ALTER DATABASE msdb SET ENABLE_BROKER ;
GO

Database Mail 仰賴許多內部預存程序。 為降低介面區,安裝新的 SQL Server 時會停用這些預存程序。 若要啟用這些預存程序,請使用 sp_configure 系統預存程序的 Database Mail XP 選項,如下例所示:

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

Database Mail 可能會在 msdb 資料庫中停止。 若要檢查 Database Mail 的狀態,請執行下列陳述式:

EXECUTE dbo.sysmail_help_status_sp;

若要在郵件主機資料庫中啟動 Database Mail,請在 msdb 資料庫中執行下列命令:

EXECUTE dbo.sysmail_start_sp;

Service Broker 會在啟動時檢查訊息的對話存留時間,因此任何已在 Service Broker 傳輸佇列的訊息,只要其存留時間比設定的對話存留時間還要長,就會立即失敗。 Database Mail 會更新 sysmail_allitems 與相關檢視中的失敗訊息狀態。 您必須判斷是否再次傳送電子郵件訊息。 如需設定 Database Mail 使用的對話方塊存留時間詳細資訊,請參閱 sysmail_configure_sp (Transact-SQL)

另請參閱