代码改变世界

8 .3 .6 发送邮件

2018-08-01 09:45  笑一笑十年少!!!  阅读(232)  评论(0编辑  收藏  举报


本章已花了很多时间介绍数据库邮件的元素和配S , 现在看看您掌握的程度。发送邮
件是一个很简单的过程。木节将介绍Sp_semi_dbmail存储过程的参数,并通过一些有用的 例子说明如何准备用于发送的数据。
sp_send_dbmail
如前所述,使用数据库邮件功能发送邮件的存储过程是sp_send_dbmailo和本章前面 介绍的其他数据库邮件存储过程一样,这个存储过程也存在于msdb数据库中;并且如果要 在数据库外部实例化该存储过程,需要按照本章的介绍对其名称进行限定。
请记住,虽然一个邮件配置文件可以是公共的,并且可以由public角色的成员使用,但
sp send dbmail只能由DatabaseMailUserRole的成员执行。确保所有需要访问sp send dbmail
存储过程的登录名都映射到msdb数据鹿中的用广’上,并且是DatabaseMailUserRole的成员。

下面看几个演示如何从SQL Server中发送邮件消息的例子。 在第一个例子中,可以创建一个不依赖于任何其他数据源的简单邮件消息。这可以作
为一个作业完成时的SendMail任务或通过一个事件通知执行。本例将发送一个简单的消 息,表明一个重要的任务已成功完成。
EXECUTE msdb.dbo.sp_send_dbmail @profile_name = *HRMail*, @recipients = * Gregory.House@adventureworks.com*, @copy_recipients =' AdministratorQadventureworks.com', @body = 'Your data has been successfully imported!*, ^subject =•Import Notification Message - Success *;
为了让信息实际发送出去,必须为adventureworks.com域运行SMTP和 POP3服务, 还 必 须 把 Gregory.House和 Administrator帐户配置为POP3收件人。如果配置了不同的 SMTP服务器,可以将@ r e c i p i e n t s 参数改为有效的邮件帐户。查询窗
口将只是返冋“邮件已排队”消息。得到的电子邮件应该类似于图8-14所示。

另一示例在sp_send_dbmail存储过程中使用査洵,把结果发送到指定的收件人列表 在这个例子里将使用一个査询,它会返回2002年雇佣的所有雇员的姓、名和雇佣□期。

EXECUTE msdb.dbo.sp_send_dbmail @profile_name =*HRMail’, @recipients = * Lisa.Cuddy@adventureworks.com*, @blind_copy_recipients = •Gregory.House@adventureworks.com; Administrator@adventureworks.com', @body = * Per your request, here are the employees hired in 2002.'/ @query = * SELECT Person.Person.FirstName AS First, Person.Person.LastName AS Last, HumanResources.Employee.HireDate AS (Date of Hire] FROM Person.Person INNER JOIN HumanResources.Employee
ON Person.Person.BusinessEntitylD =
HumanResources.Employee.BusinessEntitylD WHERE HireDate > "2002-01-01" AND HIREDATE < ''2003-01-01*'
ORDER BY HireDate*, @execute_query_database = •AdventureWorks2008', ^subject = Employees Hired in 2002 *,
@attach_query_result_as_file =1;
得到的附件应该如图8-15所示。

 

还有一个例子演示了如何获取査询中的信息,并以HTML文档形式显示它。然后可以
把 这 个 HTML文档作为邮件消息正文发送。只要收件人的邮件阅读器可以正确呈现
HTML,他就会得到不错的显示效果。
USE AdventureWorks2008 DECLARE @tableHTML NVARCHAR(MAX);
SET QtableHTML = N *<H1>Employees Hired in 2002</Hl> * + N* <table border="l">' + N *<tr><th>First Name</thxth>Last Name</th>* + N ,<th>Hire Date</th>* +
CAST ( (SELECT t d = P e rs o n . P e rs o n . FirstName, ’•,
td =Person.Person.LastName, •*, td =HumanResources.Employee.HireDate,"
FROM Person.Person INNER JOIN HumanResources.Employee ON Person.Person.BusinessEntitylD = HumanResources.Employee.BusinessEntitylD WHERE HireDate > '2002-01-01* AND HIREDATE < *2003-01-01* Order by HireDate FOR XML PATH('tr*), TYPE ) AS NVARCHAR(MAX) ) +

N* </table>*;
EXEC msdb.dbo.sp_send dbmail @recipients='administrator@adventureworks.com* r ^subject ='2002 New Hires', @body =@tableHTML, @body_format =*HTML1;
邮件客户端的显示结果如图8-16所示。

8.3.7 管理消息
如前所述,数据库邮件消息保留在服务器上。如果想查看哪些信息被保留下来,可以
査询msdb数据库中的sysmail_mailitems表。它将返回每条消息的详细信息,例如收件人 是谁、消息正文包含什么,以及哪个配置文件发送了该消息。
SELECT * FROM msdb.dbo-sysmail_mailiterns
还可以使用sysmail_delete_mailitems_sp存储过程从服务器上删除邮件。可以删除失败
或成功的消息,或者仅删除某一特定日期之前的消息。Service Pack 1要求提供@861^_^^£0^
^C@sent_status 选项。
要删除2009年 1月 31日之前的消息,可以使用下面这个例子:
EXECUTE msdb.dbo.sysmail_delete mailitems sp @sent_before = 1 January 31, 20091 ;
要删除显示特定状态值的消息,可使用下面这个例子:
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_status failed’;
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_status ='retrying*;

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_status = * unsent *;
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp @sent_status =* sent *;

8 . 4 事件通知
事件通知是一些把有关服务器和数据库事件的信息发送至Service Broker的数据库对 象。执行它们用于回应数据定义语言(DDL)语句和SQL Trace事件,把有关这些事件的信 息发送到Service Broker服务。可以使用事件通知来记录数据库里的活动,或执行一个与 事件异步的动作。事件通知用来替代创建DDL触发器或使用SQL Trace函数。 由于事件通知在事务作用域以外运行,所以可以在数据库应用程序内使用它们来响应
事件,而不需要使用任何由即时事务定义的资源。事件通知的执行与事务是否提交无关。
它们也可以用来在一个SQL Server实例内部执行一个操作,以响应一个SQL Trace事件。 在 SQL Server实例和指定的目标服务之间,每一个事件通知都有自己的专属Service Broker会话。只要该事件通知还在服务器上,这个会话就会一直打开。结束一个会话可以 阻止目标服务接收更多的消息,而且在事件通知再次启动时会话不会重新打开。
事件通知是一个XML数据类型,它可以提供的信息包括事件的发生时间、影响的对象、
相关的批处理语句等。帮助SQL Server跟踪进程并做出决策的应用程序可以使用这些数据。 在设计一个事件通知时,必须定义通知的作用域和引发此通知的语句或批处理。例如,
事件通知可以作为对一个基于AdventureWorks2008数据库中所有对象的语句的响应。还可 以定义作用域为服务器,例如在创建新数据库或登录名时触发事件通知。
有关用于创建服务和队列的体系结构的更多信息将在第19章介绍。然而应该知道,本
节讨论的一些机制也适用于下一主题一 SQL Server代理服务。为此,必须确保将msdb 数据库配置为管理Service Broker对象和处理事件通知。这两个重要的元素确保了 SQL Server可以信任数据库及其中的对象,以及数据库被配置为Service Brokei•消息递送。要对 msdb数据库执行这些配置,可以使用下列ALTER DATABASE语句:
ALTER DATABASE msdb SET TRUSTWORTHY ON,
ENABLE_BROKER;
GO
因为SQL Server代理服务可能有一个到msdb数据库的活动连接,所以可能有必要在运 行此语句前停止该代理服务,然后在命令成功完成之后再重新启动它。
在 SQL Server 2008 中还有一个名为 SQL Server 扩展事件(SQL Server Extend Event)的功
能。对扩展事件的全面讨论超出了本书范围;不过,应知道它们可用于更髙级的故障检修和
诊断。使用扩展事件的一个主要好处是可以使用Windows事件跟踪(ETW,Event Tracing for
Windows)将 SQL事件与操作系统或数据库应用程序事件相关联。要了解有关“扩展事件” 的更多信息,可参见“联机从书”中的“SQLServer扩展事件简介”主题。