Sql2005數據庫郵件功能
在SQL Server 2005 中配置數據庫郵件
在公司的OA系統中,報警和提醒功能很弱,爲了彌補這一點,考慮利用SQL的數據庫郵件功能實現報警,但SQL的數據庫郵件配置較複雜,公司採用Exchange作爲郵件服務器,域環境也比較複雜,在這樣的情況下,嘗試了很久都沒解決,終於在網上看到下面這篇文章,豁然開朗,所有問題迎刃而解。
這是我在網上找到的最好的一篇關於數據庫郵件配置的文章:
SQL Server:在 SQL Server 2005 中配置數據庫郵件。
對於真正的 DBA 來說,數據庫郵件是必不可少的。 例如,數據庫發生了警報(alert), DBA 希望得到郵件通知,以便即時排除故障。 或者是監控數據庫作業(SQL Server Job)的運行狀況,當檢查到失敗的作業時, 就發送數據庫郵件報告給 DBA。
在 SQL Server 2000 中 配置 “SQL Mail”,需要安裝 Outlook,配置過程比較麻煩。 在 SQL Server 2005 中配置 “Database Mail” 就相對容易多了。 主要是理清思路。
SQL Server 並沒有內置郵件服務器(Mail Server), 它跟我們發送郵件一樣,需要用戶名和密碼通過 SMTP(Simple Message Transfer Protocol) 去連接郵件服務器。我們想讓 SQL Server 來發送郵件,首先要告訴它用戶名稱,密碼, 服務器地址,網絡傳送協議,郵件服務器的端口。。。等信息。這是通過 SQL Server 系統 存儲過程 sysmail_add_account_sp 來實現的。
exec sysmail_add_account_sp
這樣,在 SQL Server 2005 中就添加了一個發送郵件的帳戶。 道理上講,有了這個郵件帳戶,SQL Server 就可以發送郵件了。 如:
sp_send_dbmail @account_name = 'mail_account'
但是,SQL Server 考慮的更周全。試想:如果這個郵件帳戶發生故障 (比如:用戶密碼過期,或者郵件服務器宕機)那豈不是發送不了郵件了? 爲了應對這種情況,SQL Server 2005 引入了 mail profile 這個東東。 一個 profile 中可以包含多個 account (郵件帳戶),這樣,SQL Server 發郵件的時候會依次嘗試 profile 中的多個郵件帳戶,如果發送成功,則退出, 否則,利用下一個郵件帳戶發送郵件。其中,添加 profile 和 在 account 和 profile 建立映射是通過下面兩個系統存儲過程實現的:
sysmail_add_profile_sp
sysmail_add_profileaccount_sp
這時候,SQL Server 發送郵件,就採用下面的方法了:
sp_send_dbmail @profile_name = 'profile_name'
下面是具體的配置郵件步驟
在 sa 系統帳戶下運行。
1. 啓用 SQL Server 2005 郵件功能。
use master
go
exec sp_configure 'show advanced options',1
go
reconfigure
go
exec sp_configure 'Database mail XPs',1
go
reconfigure
go
2. 在 SQL Server 2005 中添加郵件帳戶(account)
exec msdb..sysmail_add_account_sp
@account_name = 'p.c.w.l' -- 郵件帳戶名稱(SQL Server 使用)
,@email_address = '[email protected]' -- 發件人郵件地址
,@display_name = null -- 發件人姓名
,@replyto_address = null
,@description = null
,@mailserver_name = '58.215.64.159' -- 郵件服務器地址
,@mailserver_type = 'SMTP' -- 郵件協議(SQL 2005 只支持 SMTP)
,@port = 25 -- 郵件服務器端口
,@username = '[email protected]' -- 用戶名
,@password = 'xxxxxxxxx' -- 密碼
,@use_default_credentials = 0
,@enable_ssl = 0
,@account_id = null
3. 在 SQL Server 2005 中添加 profile
exec msdb..sysmail_add_profile_sp @profile_name = 'dba_profile' -- profile 名稱
,@description = 'dba mail profile' -- profile 描述
,@profile_id = null
4. 在 SQL Server 2005 中映射 account 和 profile
exec msdb..sysmail_add_profileaccount_sp @profile_name = 'dba_profile' -- profile 名稱
,@account_name = 'p.c.w.l' -- account 名稱
,@sequence_number = 1 -- account 在 profile 中順序
5. 利用 SQL Server 2005 Database Mail 功能發送郵件。
exec msdb..sp_send_dbmail @profile_name = 'dba_profile' -- profile 名稱
,@recipients = '[email protected]' -- 收件人郵箱
,@subject = 'SQL Server 2005 Mail Test' -- 郵件標題
,@body = 'Hello Mail!' -- 郵件內容
,@body_format = 'TEXT' -- 郵件格式
6. 查看郵件發送情況:
use msdb
go
select * from sysmail_allitems
select * from sysmail_mailitems
select * from sysmail_event_log
如果不是以 sa 帳戶發送郵件,則可能會出現錯誤:
Msg 229, Level 14, State 5, Procedure sp_send_dbmail, Line 1
EXECUTE permission denied on object 'sp_send_dbmail', database 'msdb', schema 'dbo'.
這是因爲,當前 SQL Server 登陸帳戶(login),在 msdb 數據庫中沒有發送數據庫郵件的權限, 需要加入 msdb 數據庫用戶,並通過加入 sp_addrolemember 角色賦予權限。假設該SQL Server 登陸帳戶 名字爲 “dba”
use msdb
go
create user dba for login dba
go
exec dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole',
@membername = 'dba'
go
此時,再次發送數據庫郵件,仍可能有錯誤:
Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 119
profile name is not valid
雖然,數據庫用戶 “dba” 已經在 msdb 中擁有發送郵件的權限了, 但這還不夠,他還需要有使用 profile:“dba_profile” 的權限。
use msdb
go
exec sysmail_add_principalprofile_sp @principal_name = 'dba'
,@profile_name = 'dba_profile'
,@is_default = 1
從上面的參數 @is_default=1 可以看出,一個數據庫用戶可以在多個 mail profile 擁有發送權限。
現在,可以利用 SQL Server 2005 發送數據庫郵件了吧。
圖文版:
數據庫郵件(Database Mail)設計爲與 SMTP 服務器配合使用,具有可靠性,靈活性,安全性,兼容性。考慮到Sql Server2005是基於.Net Framework 2.0,而在後者中新增了System.Net.Mail命名空間,相信數據庫郵件也是利用了其中的一些功能。接下來就如何啓用和配置數據庫郵件進行介紹。
出於安全性的考慮,默認地是不開啓數據庫功能。啓用數據庫郵件功能有兩種方式:使用SQL Server 外圍應用配置器工具或數據庫郵件配置嚮導顯式啓用數據庫郵件。通過外圍應用配置器工具啓用的方式啓動後,選擇功能的外圍應用配置器,然後啓用數據庫郵件存儲過程。如下圖:
配置數據庫郵件是打開Sql Server Management Studio(Sqlwb.exe),然後在對象資源管理器中的實例下,打開【管理】,然後在【數據庫郵件】上右鍵後點擊【配置數據庫郵件】,如下圖:
在彈出【歡迎使用數據庫郵件配置嚮導】對話框,在該對話框裏單擊【下一步】按鈕。
點擊【下一步】後出現【新建配置文件】:
然後點擊【添加】:
點擊【下一步】後管理配置文件安全性,將其設置爲默認配置文件:
然後點擊【下一步】完成配置:
這樣就完成了數據庫郵件的配置。然後可以在【數據庫郵件】上右鍵後選擇【發送測試電子郵件】:
稍等片刻,如果配置正確,我們就可以收到這個測試郵件了。
我們可以通過在【數據庫郵件】上右鍵選擇【查看數據庫郵件日誌】查看日誌:
由於數據庫郵件只是通過使用 Microsoft SMTP 服務器進行了測試,從我的測試拉看,好像有的SMTP郵件服務器似乎不能通過,原因不明。由於郵件服務器故障,無法將郵件發送給收件人。 (使用帳戶 1 (2007-12-06T11:17:08) 發送郵件。 異常郵件: 無法將郵件發送到郵件服務器。 (不是本地用戶;請嘗試不同的路徑。服務器響應爲: auth error. (è??¤óà??꧰ü))。
)
如果出現:由於郵件服務器故障,無法將郵件發送給收件人。 (使用帳戶 1 (2007-12-06T10:08:32) 發送郵件。 異常郵件: 無法將郵件發送到郵件服務器。 (不允許使用郵箱名稱。 服務器響應爲: You are not authorized to send mail, authentication is required)。 )這樣的錯誤應該是你的SMTP郵件服務器要求認證,而你沒有提供正確的帳戶密碼或者是錯誤地選擇了匿名身份認證(如果SMTP郵件服務器沒啓用匿名的話)。
也可以通過:
SELECT * FROM msdb.dbo.sysmail_allitems
SELECT * FROM msdb.dbo.sysmail_event_log
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBMAIL',
@recipients = '[email protected]',
@body = 'The stored procedure finished successfully.',
@subject = 'Automated Success Message' ;
查看郵件發送情況或日誌。