數據庫郵件的設計基於使用 Service Broker 技術的排隊體系結構。
當用戶執行 sp_send_dbmail 時,存儲過程將向郵件隊列中插入一項,並創建一條包含該電子郵件信息的記錄。
在郵件隊列中插入新項將啟動數據庫郵件外部進程 (DatabaseMail.exe)。該外部進程會讀取電子郵件的信息並將電子郵件發送到相應的一台或多台電子郵件服務器。發送后,該外部進程還會在狀態隊列中插入一項,來指示發送操作的結果。在狀態隊列中插入新項將啟動內部存儲過程,該過程將更新電子郵件信息的狀態。
除存儲已發送(或未發送)的電子郵件信息外,數據庫郵件還在系統表中記錄所有電子郵件的附件。
只有 msdb 數據庫中的 DatabaseMailUserRole 的成員可以執行 sp_send_dbmail。
如下圖所示:
一、啟用數據庫郵件
手動啟用數據庫郵件功能,需執行以下腳本:
exec sp_configure 'show advanced options',1
RECONFIGURE
exec sp_configure 'Database Mail XPs',1
RECONFIGURE With Override
二、郵件服務器設置
1.郵箱啟用設置-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務,開啟時有提示有授權碼,記錄下,后面配置需要錄入
QQ郵箱為例:
三、配置數據庫郵件向導設置
1.連接上數據庫,管理-數據庫郵件-右鍵-配置數據庫郵件
2.在選擇配置任務中,如果是新增選擇【通過執行以下任務來安裝數據庫郵件】,如果是修改,可選擇【管理數據庫郵件賬戶和配置文件】
3.配置文件名就是對應系統存儲過程-——msdb.dbo.sp_send_dbmail 的 @profile_name,配置SMTP賬戶,如果已有SMTP賬戶,可在下方列表中看到;如果沒有,點擊添加即可。
4.點擊添加,新增SMT郵件賬戶(QQ郵箱可以登陸郵箱官網進行配置)
a. 賬戶名:可根據實際情況設置,對應的是發送郵件的發件人名稱
b. 電子郵件地址:填寫發件人的郵箱地址,且需要是開通POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務的郵箱
c. 顯示名稱:可根據實際情況新增
d. 服務器名稱:如果電子郵件地址是QQ郵箱,服務器名稱為:smtp.qq.com 端口分為兩種: 勾選SSL—— 465,不勾選SSL—— 25
如果電子郵件地址是139郵箱,服務器名稱為:smtp.139.com 端口分為兩種: 勾選SSL—— 465,不勾選SSL—— 25
f. 基本身份驗證:用戶名為發件人電子郵箱地址;密碼為授權碼。
5.接下來需要選擇安全公共配置,選中剛才配置的文件名,然后后面默認為配置文件,建議選“否”,可根據實際情況配置。<然后點下一步完成配置>
6.測試數據庫郵件。
6.1 在數據庫界面管理-數據庫郵件-右鍵-發送測試電子郵件,如下圖
6.2 使用T-SQL發送郵件(詳細語法見sp_send_dbmail 存儲過程說明)。
Exec msdb.dbo.sp_send_dbmail @profile_name='YJFS', --配置文件名
@recipients='XX@qq.com', --收件email地址
@subject='項目執行進度表', --郵件主題
@body='這是從 數據庫郵件發出的測試電子郵件!' , --郵件正文內容
@file_attachments ='F:/xxx.doc' --用於在電子郵件中發送附件
@query = 'SELECT * FROM [Test].[dbo].[employee]', --要執行有效的 Transact-SQL 語句(也可是存儲過程 @query = ' EXEC [數據庫名稱].[dbo].[存儲過程名稱] ''參數'',''參數'',''...'',''...'' ',
@attach_query_result_as_file = 1 ; --把 @query 的執行語句所返回消息寫入.doc文檔(或者txt文檔)中以附件形式發送
@query_attachment_filename= 'my_test.doc' --設置附件文件的名稱和類型為doc文檔,如是文本則是.txt格式
*其他參數:
- [ @query_result_header= ] query_result_header
-
指定查詢結果是否包含列標題。query_result_header 值的數據類型為 bit。如果該值為 1,則查詢結果包含列標題。如果該值為 0,則查詢結果不包含列標題。該參數的默認值為 1。只有在指定 @query 時,此參數才適用。
- [ @query_result_width = ] query_result_width
-
用於設置查詢結果的格式的線條寬度(字符)。query_result_width 的數據類型為 int,默認值為 256。提供的值必須介於 10 和 32767 之間。只有在指定 @query 時,此參數才適用。
實現JOB任務運行狀態的檢測
使用SQL Server時,很多情況下都需要自定義Job進行部分功能的實現,而大部分時間是采取凌晨或者非業務期進行工作。
因而Job的運行結果的檢測便形成了一個需要跟蹤的問題,比如有時候N個Job的運行,只有幾個出現問題,並且不確定的此Job發生在那個機器上,所以自動化運維的重要性就不言而喻了。
對於上面問題的解決,通過SQL Server的警報配置便可以實現檢測JOB工作是否運行成功,如果SQL Server 代理的作業任務沒有執行成功則通過該作業里的警報配置觸發數據庫郵件發送到對應的操作員的郵箱。大體配置流程如下:
一、設置SQL Server 代理的警報郵件發送配置,SQL Server 代理 -- 右鍵 -- 屬性
警報系統 a.郵件系統 選擇 數據庫郵件
b.郵件配置文件 選擇對應的數據庫郵件的 @profile_name 名稱
一、定義郵件的接收人員,SQL Server 代理 -- 操作員 -- 右鍵 -- 新建操作員
常規: a. 姓名:操作員的姓名,可以是別名。(在警報里的響應需要配置)
b. 電子郵件名稱:郵箱的地址。
c. 尋呼值班計划:可根據實際情況設置時間
通知:選擇對應 的定義警報內容(需要先定義警報后些處才能選擇到)
二、定義警報屬性等,SQL Server 代理 -- 警報 -- 右鍵 -- 新建警報
常規:a. 名稱:在JOB屬性設置時會用到。
b. 數據庫名稱
這里面的嚴重性選項其實是一個很重要的功能,一些簡單的問題警告有時候是不需要及時關注的,或者說不需要暫時處理的。但是有些問題則需要里面去解決,比如服務器宕等。
響應:a. 執行作業:需選擇對應的具體作業 (需要新建好作業后這里才能選擇到)
b. 通知操作員:選擇需通知的操作員,可多個。
三、設置SQL Server 代理的警報郵件發送配置,SQL Server 代理 -- 右鍵 -- 屬性
警報系統 --勾選啟用郵件配置文件
a.郵件系統 選擇 數據庫郵件
b.郵件配置文件 選擇對應的數據庫郵件的 @profile_name 名稱
--勾選 啟用防故障操作員
c.操作員 選擇對應新建的操作員,勾選電子郵件
一、SQL Server 代理 -- 作業 -- 右鍵 -- 新建作業
步驟:新建打開作業步驟屬性,選擇對應的數據庫名稱 ,在命令處輸入執行存儲過程檢測,
計划:定義該作業的執行周期與時間點
警報:這里顯示的內容對應是定義警報里的響應選擇作業內容
通知: 勾選 電子郵件,選擇對應 操作員及觸發通知條件