|
(本段文章节选自铁道出版社新出的《用BackOffice建立Intranet/Extranet应用》一书)
SQL Mail是数据库系统同邮件系统进行沟通的桥梁。由于SQL Mail的出现,我们可以开发出广泛的数据库和邮件系统相结合的应用。它可以用来将数据库系统产生的一些警报信息发送给管理员(这是SQL Mail最常用的功能),从而使管理员能够及时地对系统发生的问题作出反应。也可以接受用户发出的查询邮件,并将查询结果通过邮件发送给用户。也可以用它来实现邮件列表的功能。
下面我们将来介绍如何设置和使用SQL Mail。
6.7.1. 设置SQL Mail
还记得我们当初在安装SQL Server之前在Exchange Server上为其服务帐号设置的邮箱吗?SQL Mail将通过这个邮箱来发送和接受邮件。而SQL Mail的设置是一个比较复杂的过程。需要为其指定一个邮件配置文件和相应的支持MAPI接口的应用程序(为了使讨论的问题简化,我们使用Outlook作为SQL Mail的MAPI支持程序。当然,也可以使用其他的邮件系统和支持MAPI的邮件客户端程序)。下面我们来看看如何对SQL Server进行设置,以使其SQL Mail服务能够正常的运转起来。
首先,我们用SQL Server的服务帐号(sqlservice)登录服务器。安装Outlook并设置配置信息(这将产生一个配置文件,SQL Mail将通过此配置文件与邮件系统连接。设置方法参见本书前面的内容)。启动Outlook并对邮件的收发进行测试。确认无误后,退出登录,重新以管理员帐号登录服务器。
注意:如果安装的是Outlook97,它有可能会在系统的启动文件组中加入一个用于快速查找文件的程序findfast.exe(这取决于你在安装Outlook时所做的对安装组件的选择)。它在每次系统启动时自动运行,会占用大量的服务器资源。请将它从启动程序组中删除。
启动Enterprise Manager,找到要进行SQL Mail设置的服务器并打开其Support Services容器。右击其下的SQL Mail对象,从弹出的快捷菜单中选择Properties选项。就会弹出SQL Mail属性对话框(如下图)。
图6.7.1-1SQL Mail的设置
在Profile name下拉列表框中选择我们在前一步建立的邮件配置文件。点击Test按钮来对此设置进行测试。如果测试成功,会出现一个提示SQL Mail设置成功的对话框。如果存在问题,则需要重新执行前面的步骤。直到测试成功。
Autostart SQL Mail when SQL Server starts选择框用于指定是否在SQL Server启动时也自动地启动SQL Mail。我们应该选择此选项。配置完成后,点击确定按钮结束设置工作。
随后右击SQL Mail对象,从弹出的快捷菜单中选择Start选项来启动SQL Mail。至此我们就完成了SQL Mail的配置工作。
6.7.2. 通过SQL Mial发送邮件
SQL Mail会在两种情况之下发送邮件。一种是当系统发生警报时间时,会向预先为警报定义的操作员发送警报信息邮件(我们将在下一节中对此问题做详细的讨论)。另一种是通过扩展存贮过程xp_sendmail来发送邮件。如果我们想要在SQL Server应用中完成发送邮件功能的话,就需要使用此存贮过程。它的语法结构如下:
xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,][@message =] 'message']
[,][@query =] 'query']
[,][@attachments =] attachments]
[,][@copy_recipients =] 'copy_recipients [;...n]'
[,][@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,][@subject =] 'subject']
[,[@type =] 'type']
[,][@attach_results =] 'attach_value']
[,][@no_output =] 'output_value']
[,][@no_header =] 'header_value']
[,][@width =] width]
[,][@separator =] 'separator']
[,][@echo_error =] 'echo_value']
[,][@set_user =] 'user']
[,][@dbuse =] 'database']
其中各参数的含义分别如下:
■ recipients:为邮件指定的接收人,可以同时将邮件发给多个用户。各用户的邮件地址用分号分割。此参数必须指定,而其他参数都为可选参数。
■ message:邮件中的信息,其最长不得超过7990字节。
■ query:一段SQL语句,其结果集将附在邮件之中。它的长度不得超过8000字节。
■ attachments:用来指定一个文件作为被发送邮件的附件。
■ copy_recipients:用来指定此邮件抄送到哪些用户。即我们在邮件程序中常见的CC to:功能。
■ blind_copy_recipients:功能同上个参数。不过不同的是,邮件之中将不会包含这些收件人的地址信息。即我们在邮件程序中常见的密送BCC to:功能。
■ subject:邮件的标题。如果不指明,默认为"SQL Server Message"。
■ type:指定邮件的MAPI类型。默认为空值。
■ attach_results:指明是否将SQL语句的执行结果作为一个附件进行发送。其取值为TRUE或FALSE。默认值为FALSE。
■ no_output:指明此发送将不返回信息到SQL 客户端。其取值为TRUE或FALSE。默认值为FALSE。
■ no_header:指明不将SQL语句执行结果中的字段名包含在邮件之中。其取值为TRUE或FALSE。默认值为FALSE。
■ width:指定SQL语句执行结果的行宽。省缺宽度为80个字符这样可能会造成一些结果行被从中间截断的现象。将行宽设大一些可以有效地防止此现象。
■ separator:指定SQL语句的执行结果进行字段分割的字符。这样会方便一些电子表格应用程序读取结果集。
■ echo_error:指明是否包含系统错误信息。其取值为TRUE或FALSE。默认值为TRUE。
■ set_user:指明执行SQL语句的用户,默认为guest。此参数所指定的用户应该在master数据库中存在。
■ dbuse:指明SQL语句在哪个数据库上执行,默认为set_user指定的用户的省缺数据库。
下面的例子将把1999年12月1日的所有刊载的文章的题目发送给邮件地址为zw@cbb.com的用户。
exec master.dbo.xp_sendmail
@recipients ='zw@cbb.com',
@message ='1999年12月1日刊载文章题目' ,
@query = 'select timu
from test.dbo.gaojian
where datepart(yy,riqi)=datepart(yy,convert(datetime,''1999-12-01')) and datepart(dy,riqi)=datepart(dy,convert(datetime,''1999-12-01''))
order by banmian' ,
@subject ='test',
@attach_results = 'true',
@width =60,
@separator = ',' ,
@set_user ='dbo',
@dbuse = 'test'
zw用户收到的邮件附件文件的内容如下:
Timu ,
----------------------------------------------------------------------------------------
测试信息1 ,
测试信息2 ,
测试信息3 , |
|