建立个人资料并和账号相联系
在能够发送数据库邮件到一个在账号中鉴别过的SMTP服务器之前,你需要把账号和个人资料联系起来,把访问权授予个人资料。数据库邮件个人资料用来提高邮件安全性。有两种个人资料,公开的和私有的。公开的个人资料任何人都可见,它把访问权授予msdb数据库,是msdb数据库中DatabaseMailUserRole中的成员,而私有的个人资料只可以被授权访问私有个人资料的特定用户使用。一个邮件个人资料能够和一个或多个账号相联系。你可以使用数据库邮件配置向导来管理个人资料,或者使用一些和下面类似的T-SQL命令来建立邮件个人资料:
-- Create a Database Mail profile EXECUTE msdb.dbo.sysmail_add_profile_sp @profile_name = 'Database Administration Profile', @description = 'Mail Profile for use by DBA processes';
这里我只是创建了一个名为“数据库管理个人资料”的个人资料。现在你仅仅有了一个刚创建的个人资料,并不意味着你能够使用它来发送邮件。你仍然需要把那个个人资料和至少一个数据库邮件账号及msdb数据库里的一个用户联系起来。为了做到这些我可以执行下面的语句:
-- Add the account to the profile EXECUTE msdb.dbo.sysmail_add_profileaccount_sp @profile_name = 'Database Administration Profile', @account_name = 'Database Administration Account', @sequence_number =1 ; -- Grant access to the profile EXECUTE msdb.dbo.sysmail_add_principalprofile_sp @profile_name = 'Database Administration Profile', @principal_name = 'ProdServer01',
第一个EXECUTE语句把我的个人资料和一个账号相联系。第二个EXECUTE语句把我的个人资料和‘ProdServer01’msdb数据库用户相联系。这个用户在他们能够发送邮件之前必须是DatabaseMailUserRole中的成员。既然我把个人资料和一个特定用户联系起来,这个个人资料就是一个私有个人资料。要创建一个公共个人资料你需要把个人资料和“公共”数据库角色相联系。
发送数据库邮件
SQL Server提供了存储过程“sp_send_dbmail”来发送邮件。下面的句法用来调用这个存储过程:
sp_send_dbmail [ [ @profile_name = ] 'profile_name' ]
[ , [ @recipients = ] 'recipients [ ; ...n ]' ]
[ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ]
[ , [ @blind_copy_recipients = ] 'blind_copy_recipient [ ; ...n ]' ]
[ , [ @subject = ] 'subject' ]
[ , [ @body = ] 'body' ]
[ , [ @body_format = ] 'body_format' ]
[ , [ @importance = ] 'importance' ]
[ , [ @sensitivity = ] 'sensitivity' ]
[ , [ @file_attachments = ] 'attachment [ ; ...n ]' ]
[ , [ @query = ] 'query' ]
[ , [ @execute_query_database = ] 'execute_query_database' ]
[ , [ @attach_query_result_as_file = ] attach_query_result_as_file ]
[ , [ @query_attachment_filename = ] query_attachment_filename ]
[ , [ @query_result_header = ] query_result_header ]
[ , [ @query_result_width = ] query_result_width ]
[ , [ @query_result_separator = ] 'query_result_separator' ]
[ , [ @exclude_query_output = ] exclude_query_output ]
[ , [ @append_query_error = ] append_query_error ]
[ , [ @query_no_truncate = ] query_no_truncate ]
[ , [ @mailitem_id = ] mailitem_id ] [ OUTPUT ]
正如你所见,这个存储过程支持多个不同的参数。想获取这些参考中每个参数的信息,请参考Books Online。
下面是我如何使用上面创建的私有个人资料来给我发送一封有关自动数据库重索引过程方面的简单的邮件消息的例子。
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Database Administration Profile',
@recipients = 'greg.larsen@databasejournal.com',
@body = 'Reindex database process completed successfully',
@subject = 'Reindex Database' ;
由于数据库邮件是以队列方式工作的,当我运行上面的命令时将得到一个“邮件已进入队列”的通知邮件。当执行sp_send_dbmail存储过程时邮件并不是立即被发送,而是存储在msdb数据库中的邮件队列里。存储过程的执行触发一个外部邮件过程(DatabaseMail90.exe)的运行。这个可执行程序读入队列中的邮件,把它发送到合适的邮件服务器上。
