一、 SQL Server發郵件原理和元件介紹:
資料庫郵件有4個元件:配置檔案、郵件處理元件、可執行檔案以及“日誌記錄和稽核元件”。
l 配置元件包括:
1)資料庫郵件帳戶包含諸如SMTP伺服器名、身份驗證型別和電子郵件地址等。
2)資料庫郵件配置檔案是資料庫郵件帳戶的集合。
l 郵件處理元件
要的資料庫郵件元件就是剛才所說的資料庫郵件主機資料庫,預設是msdb。
l 資料庫郵件可執行檔案
資料庫郵件使用一個外部可執行檔案來處理郵件,降低了對SQL Server的影響。當有郵件要處理時,資料庫郵件使用Service Broker啟用外部程式(DataMail90.exe)傳送郵件。
l 日誌記錄和稽核元件
可以通過資料庫郵件日誌或查詢sysmail_log系統檢視來檢視相關日誌記錄。
跟我們傳送郵件一樣,需要使用者名稱和密碼通過 SMTP(Simple Message Transfer Protocol) 去連線郵件伺服器。我們想讓SQL Server 來傳送郵件,首先要告訴它使用者名稱稱,密碼, 伺服器地址,網路傳送協議,郵件伺服器的埠。。。等資訊
二、 啟用 SQL Server 2005 郵件功能
方法1:開啟Sql Server外圍應用配置器:
點選【功能外圍應用配置】,在開啟的頁面中選擇“資料庫郵件”,選中“啟用資料庫郵件儲存過程”
方法2:執行啟用語句
use master
go
exec sp_configure 'show advanced options',1
go
reconfigure
go
exec sp_configure 'Database mail XPs',1
go
reconfigure
go
三、 啟用資料庫郵件主機資料庫上的service broker
預設的資料庫主機資料庫是msdb,其service broker預設是啟用的。您可以通過如下指令碼來檢視msdb是否啟用了Service Broker:
SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb'
如果未啟用,則返回“0”,如果啟用,則返回1.你可以通過下面指令碼來啟用Service Broker:
ALTER DATABASE msdb SET ENABLE_BROKER
四、 配置資料庫郵件
1)開啟SSMS(SQL Server Management Studio),在物件瀏覽器中依次展開伺服器、管理節點,在資料庫郵件上點選右鍵,如圖:
2)選擇“配置資料庫郵件”,將出現“資料庫郵件配置嚮導”對話方塊。如圖:
3)點選“下一步”,如果資料庫郵件尚未啟動,則彈出一個對話方塊,詢問是否啟用資料庫郵件,選擇“是”。
4)在“配置檔名”文字框中輸入“worklogmial”,並單擊“新增”以加入一個SMTP帳戶。
5)在“新建資料庫郵件帳戶”對話方塊中,輸入相關資訊,確定。
6)點選下一步,在“管理配置檔案安全性”頁面上將“worklogmial”配置為公共配置檔案,並單擊下一步。
7)這時將出現“配置引數”頁面,我們保持預設,單擊下一步,再單擊完成。
五、 傳送測試郵件
1)再次右鍵物件瀏覽器中的“資料庫郵件”節點,選擇“傳送測試電子郵件”,出現如下:
2)在資料配置檔案的下拉框中選擇我們剛才建立的“worklogmail”,填寫收件人地址(如:jsyhello@gmail.com),點選“傳送……”出現下圖:(注意:傳送電子郵件後面的數字"16"是測試郵件的ID,可以通過此唯一ID在日誌中查詢該郵件的狀態。)
或者您可以通過如下指令碼來傳送一封測試郵件:
exec msdb.dbo.sp_send_dbmail
@profile_name=' worklogmail ',
@recipients='jsyhello@gmail.com',
@body='這是一封測試郵件',
@subject='測試'
六、 常見問題
1)ExternalMailQueue 接收到無效的 XML 訊息格式。conversation_handle……
解決:至少為SQL Server安裝SP1
2)由於郵件伺服器故障,無法將郵件傳送給收件人。 (使用帳戶 1 (2007-12-06T10:08:32) 傳送郵件。 異常郵件: 無法將郵件傳送到郵件伺服器。 (不允許使用郵箱名稱。 伺服器響應為: You are not authorized to send mail, authentication is required)。
解決:你的SMTP郵件伺服器要求認證,而你沒有提供正確的帳戶密碼或者是錯誤地選擇了匿名身份認證。
3)使用帳戶 1 (2007-12-06T11:17:08) 傳送郵件。 異常郵件: 無法將郵件傳送到郵件伺服器。 (不是本地使用者;請嘗試不同的路徑。伺服器響應為: auth error.)。
解決:部分免費的公共郵箱的SMTP伺服器不允許此項服務,請選擇其他的SMTP。
七、 建立傳送郵件的儲存過程
--傳送郵件模板儲存過程
Create PROCEDURE [dbo].[MyMail]
@mailto varchar(max),
@mailsubject nvarchar(255),
@mailbody nvarchar(max)
AS
BEGIN
set @mailbody=replace(replace(@mailbody,'<','<'),'>','>')
+N'<br/>謝謝!<br/>祝您工作愉快!<br/>發件人:研發管理平臺'
exec msdb.dbo.sp_send_dbmail
@profile_name = 'worklogmail',
@recipients = @mailto,
@subject = @mailsubject,
@body = @mailbody,
@body_format = 'HTML'
END
--日誌提醒儲存過程
Create proc [dbo].[MailUnWirte]
@days int=2
as
if EXISTS(select * from WorkWeek where datediff(day,WorkDay,getdate())=0 and Iflag=1)
begin
declare @calcDate datetime
select @calcDate=max(workday) from WorkWeek where datediff(day,WorkDay,getdate())>@days and Iflag=1
declare @username varchar(50)
declare @mailto varchar(max)
declare @depid varchar(20)
declare @mailbody nvarchar(max)
declare mailto cursor for
select S_User.Name,S_User.EMail,S_user.DepID
from S_User
inner join s_UserTransfer ut on ut.userid=S_User.id and ut.StartDate<=@calcDate
left join ProjectWorkLog l on l.EffortState=1 and S_User.id=l.worker and l.workday<=@calcDate
where S_User.Iflag='1' and S_User.IsEffort=1
group by S_User.Name,S_User.EMail,S_user.DepID
having isnull(sum(l.Effort),0)<8
- open mailto
fetch next from mailto into @username,@mailto,@depid
while @@fetch_status=0
begin
set @mailbody=@username+'您好:<br/> 您截至到'+convert(varchar(10),@calcDate,20)+',尚有工作日誌未填寫完畢,請儘快填寫'
exec MyMail @mailto,N'日誌未填寫提醒',@mailbody
select @mailto=isnull(email,'') from s_user inner join s_dep on s_dep.Manager=s_user.id where s_dep.id=depid
if @mailto!=''
begin
set @mailbody='您好:<br/> '+@username+'截至到'+convert(varchar(10),@calcDate,20)+',尚有工作日誌未填寫完畢,請督促其按時填寫'
exec MyMail @mailto,N'日誌未填寫提醒',@mailbody
end
fetch next from mailto into @username,@mailto,@depid
end
close mailto
deallocate mailto
end
八、 配置計劃任務
1、新建作業
2、新建作業-常規:
步驟:常規設定完成,點選【步驟】選項,點選【新建】按鈕進入
點選【確認】返回,可以看到步驟中增加了一條。
計劃:步驟設定完成,點選【計劃】選項,點選【新建】按鈕進入
點選【確認】返回。可以看到計劃中增加了一條。
其它選項可以不設定。
點選【確認】完成計劃任務的新增。