sp_send_dbmail (Transact-SQL)

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

將電子郵件訊息傳送給指定的收件者。 訊息可能包含查詢結果集、檔案附件,或兩者皆有。 成功將郵件放在Database Mail佇列中時,sp_send_dbmail會傳回訊息的mailitem_id。 這個預存程式位於 msdb 資料庫中。

Transact-SQL 語法慣例

語法

  
sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]  
    [ , [ @recipients = ] 'recipients [ ; ...n ]' ]  
    [ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ]  
    [ , [ @blind_copy_recipients = ] 'blind_copy_recipient [ ; ...n ]' ]  
    [ , [ @from_address = ] 'from_address' ]  
    [ , [ @reply_to = ] 'reply_to' ]   
    [ , [ @subject = ] 'subject' ]   
    [ , [ @body = ] 'body' ]   
    [ , [ @body_format = ] 'body_format' ]  
    [ , [ @importance = ] 'importance' ]  
    [ , [ @sensitivity = ] 'sensitivity' ]  
    [ , [ @file_attachments = ] 'attachment [ ; ...n ]' ]  
    [ , [ @query = ] 'query' ]  
    [ , [ @execute_query_database = ] 'execute_query_database' ]  
    [ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]  
    [ , [ @query_attachment_filename = ] query_attachment_filename ]  
    [ , [ @query_result_header = ] query_result_header ]  
    [ , [ @query_result_width = ] query_result_width ]  
    [ , [ @query_result_separator = ] 'query_result_separator' ]  
    [ , [ @exclude_query_output = ] exclude_query_output ]  
    [ , [ @append_query_error = ] append_query_error ]  
    [ , [ @query_no_truncate = ] query_no_truncate ]   
    [ , [ @query_result_no_padding = ] @query_result_no_padding ]   
    [ , [ @mailitem_id = ] mailitem_id ] [ OUTPUT ]  

引數

[ @profile_name = ] 'profile_name' 這是要從中傳送訊息的設定檔名稱。 profile_name的類型為sysname,預設值為 Null。 profile_name必須是現有Database Mail設定檔的名稱。 未指定 任何profile_name 時, sp_send_dbmail 會使用目前使用者的預設私人設定檔。 如果使用者沒有預設的私人設定檔, sp_send_dbmail 會使用 msdb 資料庫的預設公用設定檔。 如果使用者沒有預設的私人設定檔,而且資料庫沒有預設的公用設定檔,則必須指定 @profile_name

[ @recipients = ] 'recipients' 這是要傳送郵件的電子郵件地址以分號分隔的清單。 收件者清單的類型為 Varchar (max) 。 雖然這個參數是選擇性的,但至少必須指定其中一個 @recipients@copy_recipients@blind_copy_recipients ,或 sp_send_dbmail 傳回錯誤。

[ @copy_recipients = ] 'copy_recipients' 這是以分號分隔的電子郵件地址清單,可複製郵件至其中。 複製收件者清單的類型為 Varchar (max) 。 雖然這個參數是選擇性的,但至少必須指定其中一個 @recipients@copy_recipients@blind_copy_recipients ,或 sp_send_dbmail 傳回錯誤。

[ @blind_copy_recipients = ] 'blind_copy_recipients' 這是以分號分隔的電子郵件地址清單,可盲目複製郵件。 盲目複製收件者清單的類型為 Varchar (max) 。 雖然這個參數是選擇性的,但至少必須指定其中一個 @recipients@copy_recipients@blind_copy_recipients ,或 sp_send_dbmail 傳回錯誤。

[ @from_address = ] 'from_address' 這是電子郵件訊息的「寄件者位址」值。 這是選擇性參數,用來覆寫郵件設定檔中的設定。 此參數的類型為 Varchar (MAX) 。 SMTP 安全性設定會決定是否要接受這些覆寫。 如果沒有指定參數,預設值為 NULL。

[ @reply_to = ] 'reply_to' 這是電子郵件訊息的「回復位址」值。 它只接受一個電子郵件地址做為有效的值。 這是選擇性參數,用來覆寫郵件設定檔中的設定。 此參數的類型為 Varchar (MAX) 。 SMTP 安全性設定會決定是否要接受這些覆寫。 如果沒有指定參數,預設值為 NULL。

[ @subject = ] 'subject' 這是電子郵件訊息的主旨。 主旨的類型為 Nvarchar (255) 。 如果未指定主旨,預設值便是「SQL Server 訊息」。

[ @body = ] 'body' 這是電子郵件訊息的本文。 訊息本文的類型為 Nvarchar (max) ,預設值為 Null。

[ @body_format = ] 'body_format' 這是訊息本文的格式。 參數的類型為 Varchar (20) ,預設值為 Null。 當指定這個選項時,會設定外寄訊息的標頭來表示訊息主體有指定的格式。 參數可包含下列各值之一:

  • TEXT

  • HTML

預設值是 TEXT。

[ @importance = ] 'importance' 這是訊息的重要性。 參數的類型為 Varchar (6) 。 參數可包含下列各值之一:

  • 正常

預設值是 Normal。

[ @sensitivity = ] 'sensitivity' 這是訊息的敏感度。 參數的類型為 Varchar (12) 。 參數可包含下列各值之一:

  • 正常

  • 個人

  • 私人

  • 機密

預設值是 Normal。

[ @file_attachments = ] 'file_attachments' 這是要附加至電子郵件訊息的以分號分隔的檔案名清單。 清單中的檔案必須指定為絕對路徑。 附件清單的類型為 Nvarchar (max) 。 根據預設,Database Mail 會將檔案附件限制為每個檔案 1 MB。

重要

Azure SQL 受控執行個體中無法使用此參數,因為它無法存取本機檔案系統。

[ @query = ] 'query' 這是要執行的查詢。 查詢的結果可以附加成一個檔案,也可以包含在電子郵件訊息的主體中。 查詢的類型為 Nvarchar (max) ,而且可以包含任何有效的 Transact-SQL 語句。 請注意,查詢是在個別的會話中執行,因此呼叫 sp_send_dbmail 腳本中的區域變數不適用於查詢。

注意

使用 @query 參數時,執行 sp_send_dbmail 的使用者必須是 SQL 登入,或直接對應至 Azure AD 或 AD 的主體 (登入) 。 如果使用者是 Azure AD 群組或 AD 群組的成員,將無法執行查詢。 這是因為Azure SQL 受控執行個體模擬和 EXECUTE AS限制

[ @execute_query_database = ] 'execute_query_database' 這是預存程式執行查詢的資料庫內容。 參數的類型為 sysname,預設值為目前資料庫。 只有在指定 @query 時,此參數才適用。

[ @attach_query_result_as_file = ] attach_query_result_as_file 指定查詢的結果集是否以附加檔案的形式傳回。 attach_query_result_as_file 的類型為 bit,預設值為 0。

當值為 0 時,查詢結果會包含在電子郵件訊息的本文中,並在 @body 參數的內容之後。 當值是 1 時,會以附加檔案的方式傳回結果。 只有在指定 @query 時,此參數才適用。

[ @query_attachment_filename = ] query_attachment_filename 指定要用於查詢附件結果集的檔案名。 query_attachment_filename 類型為 Nvarchar (255) ,預設值為 Null。 當 attach_query_result 為 0 時,會忽略此參數。 當attach_query_result為 1 且此參數為 Null 時,Database Mail會建立任意檔案名。

[ @query_result_header = ] query_result_header 指定查詢結果是否包含資料行標頭。 query_result_header值的類型為 bit。 當值是 1 時,查詢結果會包含資料行標頭。 當值是 0 時,查詢結果不會包含資料行標頭。 此參數預設為 1。 只有在指定 @query 時,此參數才適用。

注意

將 @query_result_header 設為 0 並將 @query_no_truncate 設為 1 時,可能會發生下列錯誤:
訊息 22050,層級 16,狀態 1,行 12:無法初始化 sqlcmd 程式庫,錯誤號碼為 -2147024809。

[ @query_result_width = ] query_result_width 這是用於格式化查詢結果的行寬,以字元為單位。 query_result_width的類型為int,預設值為 256。 提供的值必須介於 10 和 32767 之間。 只有在指定 @query 時,此參數才適用。

[ @query_result_separator = ] 'query_result_separator' 這是用來分隔查詢輸出中資料行的字元。 分隔符號的類型為 char (1) 。 預設值是 ' ' (空白)。

[ @exclude_query_output = ] exclude_query_output 指定是否要在電子郵件訊息中傳回查詢執行的輸出。 exclude_query_output 為 bit,預設值為 0。 當此參數為 0 時, 執行sp_send_dbmail 預存程式會列印在主控台上執行查詢結果所傳回的訊息。 當此參數為 1 時, sp_send_dbmail 預存程式的執行不會在主控台上列印任何查詢執行訊息。

[ @append_query_error = ] append_query_error 指定當錯誤從 @query 引數中指定的查詢傳回時,是否要傳送電子郵件。 append_query_errorbit,預設值為 0。 當這個參數是 1 時,Database Mail 會傳送電子郵件,且會在電子郵件的主體中包含查詢錯誤訊息。 當此參數為 0 時,Database Mail不會傳送電子郵件訊息,且sp_send_dbmail以傳回碼 1 結尾,表示失敗。

[ @query_no_truncate = ] query_no_truncate 指定是否要使用 選項來執行查詢,以避免截斷大型可變長度資料類型 (Varchar (max ) 、 Nvarchar (max) Varbinary (max ) 、 xmltextNtextimage和使用者定義資料類型) 。 若有設定,查詢結果不包含資料行標頭。 query_no_truncate值的類型為bit。 當此值是 0 或未指定時,查詢中的資料行會截斷為 256 個字元。 當此值是 1 時,不會截斷查詢中的資料行。 這個參數的預設值是 0。

注意

搭配大量資料使用時,@query_no_truncate 選項會耗用額外的資源,而且可能會降低伺服器效能。

[ @query_result_no_padding ] @query_result_no_padding 類型為 bit。 預設值是 0。 當您設定為 1 時,不會填補查詢結果,因此可能會減少檔案大小。如果您將 @query_result_no_padding 設定為 1,而且設定了 @query_result_width 參數,@query_result_no_padding 參數就會覆寫 @query_result_width 參數。

在此情況下,不會發生任何錯誤。

注意

將 @query_result_no_padding 設定為 1 並提供參數給 @query_no_truncate 時,可能會發生下列錯誤:
訊息 22050、層級 16、狀態 1、第 0 行:無法執行查詢,因為@query_result_no_append和@query_no_truncate選項互斥。

如果您將 @query_result_no_padding 設定為 1,而且設定了 @query_no_truncate 參數,就會引發錯誤。

[ @mailitem_id = ] mailitem_id [ OUTPUT ] 選擇性輸出參數會傳回訊息 的mailitem_idmailitem_id的類型為int

傳回碼值

傳回碼為 0 表示成功。 其他任何值都表示失敗。 失敗語句的錯誤碼會儲存在 @@ERROR 變數中。

結果集

成功時,傳回「郵件已列入佇列」訊息。

備註

使用之前,必須使用 Database Mail 組態精靈或sp_configure來啟用Database Mail。

sysmail_stop_sp停止外部程式所使用的 Service Broker 物件,以停止Database Mail。 sp_send_dbmail在使用 sysmail_stop_sp 停止Database Mail時仍接受郵件。 若要開始Database Mail,請使用sysmail_start_sp

未指定 @profile 時, sp_send_dbmail 會使用預設設定檔。 如果傳送電子郵件訊息的使用者有預設私人設定檔,Database Mail 會使用這個設定檔。 如果使用者沒有預設的私人設定檔, sp_send_dbmail 會使用預設的公用設定檔。 如果使用者沒有預設的私人設定檔,而且沒有預設的公用設定檔, sp_send_dbmail 會傳回錯誤。

sp_send_dbmail 不支援沒有內容的電子郵件訊息。 若要傳送電子郵件訊息,您必須至少指定其中一個 @body@query@file_attachments@subject。 否則, sp_send_dbmail 傳回錯誤。

Database Mail使用目前使用者的 Microsoft Windows 安全性內容來控制檔案的存取。 因此,使用 SQL Server 驗證進行驗證的使用者無法使用@file_attachments附加檔案。 Windows 不允許SQL Server將認證從遠端電腦提供給另一部遠端電腦。 因此,Database Mail在命令從執行SQL Server的電腦以外的電腦執行時,可能無法從網路共用連結檔案。

如果 同時指定@query@file_attachments ,而且找不到檔案,則仍會執行查詢,但不會傳送電子郵件。

當指定查詢時,結果集會格式化為內嵌文字。 結果中的二進位資料會以十六進位格式傳送。

參數 @recipients@copy_recipients@blind_copy_recipients 都是以分號分隔的電子郵件地址清單。 至少必須提供其中一個參數,或 sp_send_dbmail 傳回錯誤。

在沒有交易內容的情況下執行sp_send_dbmail時,Database Mail啟動並認可隱含交易。 從現有交易內執行sp_send_dbmail時,Database Mail依賴使用者認可或復原任何變更。 它並不會啟動內部交易。

權限

執行sp_send_dbmail的許可權預設為msdb資料庫中DatabaseMailUser資料庫角色的所有成員。 不過,當傳送訊息的使用者沒有許可權使用要求的設定檔時, sp_send_dbmail 會傳回錯誤,而且不會傳送訊息。

範例

A. 傳送電子郵件訊息

本範例會使用電子郵件地址 myfriend@Adventure-Works.com ,將電子郵件訊息傳送給您的朋友。 訊息的主旨是 Automated Success Message。 訊息的主體包含 'The stored procedure finished successfully' 這個句子。

EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'Adventure Works Administrator',  
    @recipients = 'yourfriend@Adventure-Works.com',  
    @body = 'The stored procedure finished successfully.',  
    @subject = 'Automated Success Message' ;  

B. 利用查詢結果傳送電子郵件訊息

本範例會使用電子郵件地址 yourfriend@Adventure-Works.com ,將電子郵件訊息傳送給您的朋友。 訊息的主旨是 Work Order Count,且會執行查詢來顯示在 2004 年 4 月 30 日之後 DueDate 小於兩天的工作訂單數目。 Database Mail 會將結果附加為一個文字檔。

EXEC msdb.dbo.sp_send_dbmail  
    @profile_name = 'Adventure Works Administrator',  
    @recipients = 'yourfriend@Adventure-Works.com',  
    @query = 'SELECT COUNT(*) FROM AdventureWorks2012.Production.WorkOrder  
                  WHERE DueDate > ''2004-04-30''  
                  AND  DATEDIFF(dd, ''2004-04-30'', DueDate) < 2' ,  
    @subject = 'Work Order Count',  
    @attach_query_result_as_file = 1 ;  

C. 傳送 HTML 電子郵件訊息

本範例會使用電子郵件地址 yourfriend@Adventure-Works.com ,將電子郵件訊息傳送給您的朋友。 訊息的主旨是 Work Order List,且包含一份 HTML 文件,其中顯示在 2004 年 4 月 30 日之後 DueDate 小於兩天的工作訂單。 Database Mail 會使用 HTML 格式來傳送訊息。

DECLARE @tableHTML  NVARCHAR(MAX) ;  
  
SET @tableHTML =  
    N'<H1>Work Order Report</H1>' +  
    N'<table border="1">' +  
    N'<tr><th>Work Order ID</th><th>Product ID</th>' +  
    N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' +  
    N'<th>Expected Revenue</th></tr>' +  
    CAST ( ( SELECT td = wo.WorkOrderID,       '',  
                    td = p.ProductID, '',  
                    td = p.Name, '',  
                    td = wo.OrderQty, '',  
                    td = wo.DueDate, '',  
                    td = (p.ListPrice - p.StandardCost) * wo.OrderQty  
              FROM AdventureWorks.Production.WorkOrder as wo  
              JOIN AdventureWorks.Production.Product AS p  
              ON wo.ProductID = p.ProductID  
              WHERE DueDate > '2004-04-30'  
                AND DATEDIFF(dd, '2004-04-30', DueDate) < 2   
              ORDER BY DueDate ASC,  
                       (p.ListPrice - p.StandardCost) * wo.OrderQty DESC  
              FOR XML PATH('tr'), TYPE   
    ) AS NVARCHAR(MAX) ) +  
    N'</table>' ;  
  
EXEC msdb.dbo.sp_send_dbmail @recipients='yourfriend@Adventure-Works.com',  
    @subject = 'Work Order List',  
    @body = @tableHTML,  
    @body_format = 'HTML' ;  

另請參閱

Database Mail
Database Mail 組態物件
Database Mail 預存程序 (Transact-SQL)
sp_addrolemember (Transact-SQL)