向指定的收件人發(fā)送郵件和查詢結(jié)果集附件。
xp_sendmail {[@recipients =] 'recipients [;...n]'
}
[,[@message =] 'message']
[,[@query =] 'query']
[,[@attachments =] 'attachments [;...n]']
[,[@copy_recipients =] 'copy_recipients [;...n]'
[,[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,[@subject =] 'subject']
[,[@type =] 'type']
[,[@attach_results =] 'attach_value']
[,[@no_output =] 'output_value']
[,[@no_header =] 'header_value']
[,[@width =] width]
[ , [ @separator = ] 'separator' ]
[,[@echo_error =] 'echo_value']
[ , [ @set_user = ] 'user' ]
[,[@dbuse =] 'database']
[@recipients =] 'recipients [;...n]'
是以分號(hào)分隔的郵件收件人列表。
n
是表示可以指定多個(gè) recipient、copy_recipient 或 blind_copy_recipient 的占位符。
[@message =] 'message'
是要發(fā)送的郵件。message 最大可達(dá) 8.000 個(gè)字節(jié)。
[@query =] 'query'
是有效的 Microsoft® SQL Server™ 查詢,其結(jié)果將通過(guò)郵件送出。xp_sendmail 對(duì) query 參數(shù)使用綁定連接。SQL 郵件建立的 query 連接不會(huì)被發(fā)出 xp_sendmail 請(qǐng)求的客戶端所控制的鎖阻塞。這使 xp_sendmail 更易于在觸發(fā)器中使用。但是,query 語(yǔ)句不能引用僅在觸發(fā)器中可用的邏輯 inserted 表和 deleted 表。query 最大可達(dá) 8,000 個(gè)字節(jié)。
[@attachments =] 'attachments [;...n]'
是以分號(hào)分隔的附加到郵件上的文件列表。
[@copy_recipients =] 'copy_recipients [;...n]'
是以分號(hào)分隔的列表,標(biāo)識(shí)郵件復(fù)本收件人(抄送人)。
[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
是可選的以分號(hào)分隔的列表,標(biāo)識(shí)郵件密件復(fù)本收件人(密件抄送人)。
[@subject =] 'subject'
是指定郵件主題的可選參數(shù)。如果未指定 subject,則默認(rèn)值為"SQL Server 消息"。
[@type =] 'type'
是基于以下 MAPI 郵件定義的輸入郵件類型:
IP[M | C].Vendorname.subclass
如果 type 為 NULL,則以 IPM 打頭的郵件類型出現(xiàn)在郵件客戶端的收件箱中,并由 xp_findnextmsg 查找或閱讀。以 IPC 打頭的郵件類型不出現(xiàn)在郵件客戶程序的收件箱中,并且必須設(shè)置 type 參數(shù)才能查找或閱讀。默認(rèn)設(shè)置為 NULL。
有關(guān)使用自定義郵件類型的更多信息,請(qǐng)參見(jiàn)獨(dú)立提供的《Microsoft Windows NT Resource Kit》或《Microsoft Mail Technical Reference》。
[@attach_results =] 'attach_value'
是可選參數(shù),指定查詢結(jié)果集應(yīng)作為郵件中的附件文件發(fā)送,而不是追加到郵件中發(fā)送。如果 attachments 不為 NULL,并且 attach_results 為 true,則 attachments 中的第一個(gè)文件名將作為結(jié)果集的文件名。如果 attachments 為 NULL,則生成帶 .txt 擴(kuò)展名的文件名。默認(rèn)值為 FALSE,這意味著結(jié)果集將追加到郵件中。
[@no_output =] 'output_value'
是可選參數(shù),用來(lái)發(fā)送郵件但不向發(fā)送郵件的客戶端會(huì)話返回任何輸出。默認(rèn)值為 FALSE,這意味著 SQL Server 客戶端會(huì)話將接收輸出。
[@no_header =] 'header_value'
是可選參數(shù),表示通過(guò)郵件發(fā)送查詢結(jié)果,但不隨查詢結(jié)果發(fā)送列標(biāo)題信息。默認(rèn)值為 FALSE,即列標(biāo)題信息隨查詢結(jié)果一起發(fā)送。
[@width =] width
是可選參數(shù),設(shè)置查詢的輸出文本行寬。此參數(shù)與 isql 實(shí)用工具中的 /w 參數(shù)相同。對(duì)于產(chǎn)生長(zhǎng)輸出行的查詢,應(yīng)結(jié)合使用 attach_results 與 width 以發(fā)送行中無(wú)換行符的輸出。默認(rèn)寬度為 80 個(gè)字符。
[@separator =] 'separator'
是結(jié)果集中每列的列分隔符字符串。默認(rèn)情況,列分隔符為空格。使用列分隔符可以使訪問(wèn)電子表格和其它應(yīng)用程序中的結(jié)果集更容易。例如,結(jié)合使用 attach_results 與 separator 以發(fā)送用逗號(hào)分隔值的文件。
[@echo_error =] 'echo_value'
值為 true 時(shí),SQL 郵件將捕獲運(yùn)行查詢時(shí)遇到的任何服務(wù)器消息或 DB-Library 錯(cuò)誤,并將其追加到郵件中而不是寫(xiě)入錯(cuò)誤日志。同時(shí)也將返回行/受影響行的計(jì)數(shù)追加到郵件中。
說(shuō)明 echo_error 為 true 時(shí),即使出現(xiàn) DB-Library 錯(cuò)誤或消息,或查詢沒(méi)有返回結(jié)果,只要郵件成功發(fā)送,xp_sendmail 就返回狀態(tài) 0(成功)。
[@set_user =] 'user'
是應(yīng)在其中運(yùn)行查詢的安全上下文。如果沒(méi)有指定 user,安全上下文默認(rèn)為執(zhí)行 xp_sendmail 的用戶的安全上下文。
[@dbuse =] 'database'
是應(yīng)在其中運(yùn)行查詢的數(shù)據(jù)庫(kù)上下文。默認(rèn)值為 NULL,這意味著將用戶置于默認(rèn)數(shù)據(jù)庫(kù)中。
0(成功)或 1(失?。?/P>
xp_sendmail 返回下列消息:
Mail sent.
必須在執(zhí)行 xp_sendmail 前啟動(dòng) SQL 郵件會(huì)話。會(huì)話可以自動(dòng)啟動(dòng),也可以使用 xp_startmail 啟動(dòng)。有關(guān)自動(dòng)設(shè)置 SQL 郵件會(huì)話的更多信息,請(qǐng)參見(jiàn)配置郵件配置文件。一個(gè) SQL 郵件會(huì)話支持 SQL Server 上的所有用戶,但每次只有一個(gè)用戶可以發(fā)送郵件。其他發(fā)送郵件的用戶自動(dòng)排隊(duì)等候,直到第一個(gè)用戶的郵件發(fā)送出去。
如果指定 query,則 xp_sendmail 作為客戶端登錄到 SQL Server,并執(zhí)行指定的查詢。SQL 郵件建立與 SQL Server 之間的單獨(dú)的連接;它不與發(fā)出 xp_sendmail 的原始客戶端連接共享同一連接。
說(shuō)明 發(fā)出 xp_sendmail 的客戶端連接所控制的鎖會(huì)阻塞 query。例如,如果要在事務(wù)中更新表,并且為更新創(chuàng)建了觸發(fā)器,而該觸發(fā)器試圖選擇的更新行信息與 query 參數(shù)所選擇的相同,則 SQL 郵件連接將被初始客戶端連接所控制的行排它鎖阻塞。
xp_sendmail 在 SQL Server 的安全上下文(默認(rèn)為本地管理員帳戶)中運(yùn)行。有效 xp_sendmail 用戶可以在管理員安全上下文中訪問(wèn)郵件的附件文件。如果非系統(tǒng)管理員用戶必須訪問(wèn) xp_sendmail,而您希望阻止對(duì)附件文件的不安全訪問(wèn),則系統(tǒng)管理員可以創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,該過(guò)程調(diào)用 xp_sendmail 并提供所需的功能,但不表現(xiàn) attachments 參數(shù)。此存儲(chǔ)過(guò)程必須在 master 數(shù)據(jù)庫(kù)中定義。然后系統(tǒng)管理員可向必要的用戶授予該存儲(chǔ)過(guò)程的執(zhí)行權(quán)限,但不授予基礎(chǔ) xp_sendmail 過(guò)程的權(quán)限。
xp_sendmail 向指定收件人發(fā)送郵件、查詢結(jié)果集或附件,并對(duì) query 參數(shù)使用綁定連接。SQL 郵件建立的 query 連接不會(huì)被發(fā)出 xp_sendmail 請(qǐng)求的客戶端所控制的鎖阻塞。這使 xp_sendmail 更易于在觸發(fā)器中使用。但是,query 語(yǔ)句不能引用僅在觸發(fā)器中可用的邏輯 inserted 和 deleted 表。
說(shuō)明 當(dāng)郵局和通訊簿位于 MSSQLServer 服務(wù)因無(wú)足夠權(quán)限而無(wú)法訪問(wèn)的文件共享位置時(shí),試圖執(zhí)行 xp_sendmail 將導(dǎo)致違規(guī)訪問(wèn)。
有關(guān)使用存儲(chǔ)過(guò)程調(diào)用 xp_sendmail 的更多信息,請(qǐng)參見(jiàn)如何使用 SQL 郵件(Transact-SQL)。
xp_sendmail 的執(zhí)行權(quán)限默認(rèn)授予 master 數(shù)據(jù)庫(kù)中的 db_owner 固定數(shù)據(jù)庫(kù)角色成員以及 sysadmin 固定服務(wù)器角色成員,但可以授予其他用戶。
下例向用戶 Robert King(電子郵件地址是 robertk)發(fā)送郵件,告知該用戶 master 數(shù)據(jù)庫(kù)已滿。
EXEC xp_sendmail 'robertk', 'The master database is full.'
下例向用戶 Robert King 和 Laura Callahan(電子郵件地址是 laurac)發(fā)送郵件,并將復(fù)本發(fā)送給 Anne Dodsworth(電子郵件地址是 anned)和 Michael Suyama(電子郵件地址是 michaels)。下例還指定了郵件的主題行。
EXEC xp_sendmail @recipients = 'robertk;laurac',
@message = 'The master database is full.',
@copy_recipients = 'anned;michaels',
@subject = 'Master Database Status'
下例將 sp_configure 的結(jié)果發(fā)送給 Robert King。
EXEC xp_sendmail 'robertk', @query = 'sp_configure'
下例將查詢 SELECT * FROM INFORMATION_SCHEMA.TABLES 的結(jié)果作為文本文件附件發(fā)送給 Robert King。下例包含郵件的主題行以及將在附件之前出現(xiàn)的郵件正文。@width 參數(shù)用于防止在輸出行中換行。
EXEC xp_sendmail @recipients = 'robertk',
@query = 'SELECT * FROM INFORMATION_SCHEMA.TABLES',
@subject = 'SQL Server Report',
@message = 'The contents of INFORMATION_SCHEMA.TABLES:',
@attach_results = 'TRUE', @width = 250
下例顯示如何發(fā)送大于 7,990 個(gè)字符的郵件。由于 message 受 varchar 長(zhǎng)度的限制(這樣每行開(kāi)銷較小,像所有存儲(chǔ)過(guò)程參數(shù)一樣),下例將長(zhǎng)消息寫(xiě)入由單個(gè)文本列組成的全局臨時(shí)表中。然后使用 @query 參數(shù)通過(guò)郵件發(fā)送該臨時(shí)表的內(nèi)容。
相關(guān)文章CREATE TABLE ##texttab (c1 text)
INSERT ##texttab values ('Put your long message here.')
DECLARE @cmd varchar(56)
SET @cmd = 'SELECT c1 FROM ##texttab'EXEC master.dbo.xp_sendmail 'robertk',
@query = @cmd, @no_header= 'TRUE'DROP TABLE ##texttab