在 SQL Server 2000 中 配置 “SQL Mail”,需要安裝 Outlook,配置過(guò)程比較麻煩。在 SQL Server 2005 中配置 “Database Mail” 就相對容易多了。主要是理清思路。 aSE平坦軟件園
SQL Server 并沒(méi)有內置郵件服務(wù)器(Mail Server),它跟我們發(fā)送郵件一樣,需要用戶(hù)名和密碼通過(guò) SMTP(Simple Message Transfer Protocol)去連接郵件服務(wù)器。我們想讓 SQL Server 來(lái)發(fā)送郵件,首先要告訴它用戶(hù)名稱(chēng),密碼,服務(wù)器地址,網(wǎng)絡(luò )傳送協(xié)議,郵件服務(wù)器的端口。。。等信息。這是通過(guò) SQL Server 系統存儲過(guò)程 sysmail_add_account_sp 來(lái)實(shí)現的。 aSE平坦軟件園
exec sysmail_add_account_spaSE平坦軟件園這樣,在 SQL Server 2005 中就添加了一個(gè)發(fā)送郵件的帳戶(hù)。道理上講,有了這個(gè)郵件帳戶(hù),SQL Server 就可以發(fā)送郵件了。如: sp_send_dbmail @account_name = 'mail_account'aSE平坦軟件園但是,SQL Server 考慮的更周全。試想:如果這個(gè)郵件帳戶(hù)發(fā)生故障(比如:用戶(hù)密碼過(guò)期,或者郵件服務(wù)器宕機)那豈不是發(fā)送不了郵件了?為了應對這種情況,SQL Server 2005 引入了 mail profile 這個(gè)東東。一個(gè) profile 中可以包含多個(gè) account (郵件帳戶(hù)),這樣,SQL Server 發(fā)郵件的時(shí)候會(huì )依次嘗試 profile 中的多個(gè)郵件帳戶(hù),如果發(fā)送成功,則退出,否則,利用下一個(gè)郵件帳戶(hù)發(fā)送郵件。其中,添加 profile 和 在 account 和 profile 建立映射是通過(guò)下面兩個(gè)系統存儲過(guò)程實(shí)現的: sysmail_add_profile_spsysmail_add_profileaccount_spaSE平坦軟件園這時(shí)候,SQL Server 發(fā)送郵件,就采用下面的方法了: sp_send_dbmail @profile_name = 'profile_name'aSE平坦軟件園下面是具體的配置郵件步驟 在 sa 系統帳戶(hù)下運行。 aSE平坦軟件園
1. 啟用 SQL Server 2005 郵件功能。 aSE平坦軟件園
use mastergoexec sp_configure 'show advanced options',1goreconfiguregoexec sp_configure 'Database mail XPs',1goreconfiguregoaSE平坦軟件園2. 在 SQL Server 2005 中添加郵件帳戶(hù)(account) exec msdb..sysmail_add_account_sp @account_name = 'p.c.w.l' -- 郵件帳戶(hù)名稱(chēng)(SQL Server 使用) ,@email_address =
'webmaster@sqlstudy.com' -- 發(fā)件人郵件地址 ,@display_name = null -- 發(fā)件人姓名 ,@replyto_address = null ,@description = null ,@mailserver_name = '58.215.64.159' -- 郵件服務(wù)器地址 ,@mailserver_type = 'SMTP' -- 郵件協(xié)議(SQL 2005 只支持 SMTP) ,@port = 25 -- 郵件服務(wù)器端口 ,@username =
'webmaster@sqlstudy.com' -- 用戶(hù)名 ,@password = 'xxxxxxxxx' -- 密碼 ,@use_default_credentials = 0 ,@enable_ssl = 0 ,@account_id = nullaSE平坦軟件園3. 在 SQL Server 2005 中添加 profile exec msdb..sysmail_add_profile_sp @profile_name = 'dba_profile' -- profile 名稱(chēng) ,@description = 'dba mail profile' -- profile 描述 ,@profile_id = nullaSE平坦軟件園4. 在 SQL Server 2005 中映射 account 和 profile exec msdb..sysmail_add_profileaccount_sp @profile_name = 'dba_profile' -- profile 名稱(chēng) ,@account_name = 'p.c.w.l' -- account 名稱(chēng) ,@sequence_number = 1 -- account 在 profile 中順序aSE平坦軟件園5. 利用 SQL Server 2005 Database Mail 功能發(fā)送郵件。 exec msdb..sp_send_dbmail @profile_name = 'dba_profile' -- profile 名稱(chēng) ,@recipients =
'sqlstudy@163.com' -- 收件人郵箱 ,@subject = 'SQL Server 2005 Mail Test' -- 郵件標題 ,@body = 'Hello Mail!' -- 郵件內容 ,@body_format = 'TEXT' -- 郵件格式 aSE平坦軟件園6. 查看郵件發(fā)送情況: use msdbgoselect * from sysmail_allitemsselect * from sysmail_mailitemsselect * from sysmail_event_logaSE平坦軟件園如果不是以 sa 帳戶(hù)發(fā)送郵件,則可能會(huì )出現錯誤: Msg 229, Level 14, State 5, Procedure sp_send_dbmail, Line 1EXECUTE permission denied on object 'sp_send_dbmail', database 'msdb', schema 'dbo'.aSE平坦軟件園這是因為,當前 SQL Server 登陸帳戶(hù)(login),在 msdb 數據庫中沒(méi)有發(fā)送數據庫郵件的權限,需要加入 msdb 數據庫用戶(hù),并通過(guò)加入 sp_addrolemember 角色賦予權限。假設該SQL Server 登陸帳戶(hù)名字為 “dba” use msdbgocreate user dba for login dbagoexec dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole', @membername = 'dba'goaSE平坦軟件園此時(shí),再次發(fā)送數據庫郵件,仍可能有錯誤: Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 119profile name is not validaSE平坦軟件園雖然,數據庫用戶(hù) “dba” 已經(jīng)在 msdb 中擁有發(fā)送郵件的權限了,但這還不夠,他還需要有使用 profile:“dba_profile” 的權限。 use msdbgoexec sysmail_add_principalprofile_sp @principal_name = 'dba' ,@profile_name = 'dba_profile' ,@is_default = 1aSE平坦軟件園從上面的參數 @is_default=1 可以看出,一個(gè)數據庫用戶(hù)可以在多個(gè) mail profile 擁有發(fā)送權限。 現在,可以利用 SQL Server 2005 發(fā)送數據庫郵件了吧。如仍有問(wèn)題,請留言。 aSE平坦軟件園