Sql2005數據庫郵件功能

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 外圍應用配置器工具或數據庫郵件配置嚮導顯式啓用數據庫郵件。通過外圍應用配置器工具啓用的方式啓動後,選擇功能的外圍應用配置器,然後啓用數據庫郵件存儲過程。如下圖:

http://s3.sinaimg.cn/orignal/3f2ef11806cdc1fc835c2


    配置數據庫郵件是打開Sql Server Management Studio(Sqlwb.exe),然後在對象資源管理器中的實例下,打開【管理】,然後在【數據庫郵件】上右鍵後點擊【配置數據庫郵件】,如下圖:

http://s1.sinaimg.cn/orignal/3f2ef1184409951f91580


    在彈出【歡迎使用數據庫郵件配置嚮導】對話框,在該對話框裏單擊【下一步】按鈕。

http://s6.sinaimg.cn/orignal/3f2ef118440996731d8e5

    點擊【下一步】後出現【新建配置文件】:

http://s2.sinaimg.cn/orignal/3f2ef1184409967558641

   
    然後點擊【添加】:

http://s10.sinaimg.cn/orignal/3f2ef11844099677235e9

   
   點擊【下一步】後管理配置文件安全性,將其設置爲默認配置文件:

http://s10.sinaimg.cn/orignal/3f2ef11844099876a18f9

   
    然後點擊【下一步】完成配置:

http://s3.sinaimg.cn/orignal/3f2ef11844099878c8272


 

http://s8.sinaimg.cn/orignal/3f2ef1184409987a72d97

   

http://s2.sinaimg.cn/orignal/3f2ef11806cdc272c9701


    這樣就完成了數據庫郵件的配置。然後可以在【數據庫郵件】上右鍵後選擇【發送測試電子郵件】:

http://s2.sinaimg.cn/orignal/3f2ef11844099bef116c1


    稍等片刻,如果配置正確,我們就可以收到這個測試郵件了。
   

http://s13.sinaimg.cn/orignal/3f2ef11844099bf066d5c


    我們可以通過在【數據庫郵件】上右鍵選擇【查看數據庫郵件日誌】查看日誌:
   

http://s1.sinaimg.cn/orignal/3f2ef11844099bf21a0c0

    由於數據庫郵件只是通過使用 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' ;

    查看郵件發送情況或日誌。


發佈了27 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章