分类: BSD
2011-11-01 03:37:08
数据库邮件
数据库邮件是随SQL Server 2005引入的一项功能,目的是取代早期的SQL Mail。早期的SQL Mail要求有扩展消息应用程序编程接口(Extended Messaging Application Programming Interface MAPI)支持,这就有可能会存在兼容的问题,比如安装新版本的OFFICE就可能会导致SQL Mail 失效,但数据库邮件不存在这个问题,数据库邮件更安全,更可能,且不依赖于MAPI。它使用简单邮件传输协议(SMTP)。它具有群集感知能力,可以自动重传发送失败的电子邮件消息,并能在第一台SMTP服务器不可用时故障转移到另一台SMTP服务器。数据库邮件还允许设置多个帐户,并提供对账户的安全或公共访问。
数据库邮件是从 SQL Server 数据库引擎中发送电子邮件的企业解决方案。通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件。邮件中可以包含查询结果,还可以包含来自网络中任何资源的文件。数据库邮件旨在实现可靠性、灵活性、安全性和兼容性。
可靠性: 无需OUTLOOK或MAPI接口就可以使用DB Mail。
进程隔离,传递电子组件在SQL Server外围的单独进程中运行。即使外部进程停止或失败,SQL Server也会继续对电子邮件进行排队。队列中的邮件将在外部进程或SMTP服务器联机时发送。
故障转移。数据库邮件配置文件允许您指定多台SMTP服务器,如果一台SMTP服务器不可用,还可以将邮件传递到其他的SMTP服务器。
群集支持。数据库邮件与群集兼容,并且可以完全用于群集中。
伸缩性: 后台传递。数据库邮件提供后台(或异步)传递。调用 sp_send_dbmail 发送消息时,数据库邮件可以向 Service Broker 队列中添加请求。有的请求是实时处理的,如锁定机票,购买,有的请求可以稍后发送,如选择快递公司,个人资料的补充等。
多个配置文件。数据库邮件允许您在一个 SQL Server 实例中创建多个配置文件。另外,您也可以选择发送邮件时数据库邮件使用的配置文件。
多个帐户。每个配置文件都可以包含多个故障转移帐户。您可以配置包含不同帐户的不同配置文件以跨多台电子邮件服务器分发电子邮件。
64 位兼容性。数据库邮件完全可以用于采用 64 位安装的 SQL Server。
安全性: 默认为关闭。为了减少 SQL Server 的外围应用,默认情况下,禁用数据库邮件存储过程。
必须是 msdb 数据库中的 DatabaseMailUserRole 数据库角色的成员,才能发送数据库邮件。
配置文件安全性。数据库邮件增强了邮件配置文件的安全性。您可以选择对数据库邮件配置文件具有访问权限的 msdb 数据库用户或组,并可以为 msdb 中的任一特定用户或所有用户授予访问权限。专用配置文件用于限制指定用户的访问权限。公共配置文件可供数据库中的所有用户使用。
附件大小调控器。数据库邮件增强了对附件文件大小的可配置限制。可以使用 sysmail_configure_sp 存储过程更改该限制。
禁止某些附近文件扩展名。数据库邮件维护一个禁止的文件扩展名列表。用户无法附加扩展名为列表中某个扩展名的文件。可以使用 sysmail_configure_sp 更改该列表。
可支持性:集成配置。数据库邮件在 SQL Server 数据库引擎中维护电子邮件帐户的信息。无需在外部客户端应用程序中管理邮件配置文件。数据库邮件配置向导提供了十分方便的界面来配置数据库邮件。您还可以使用 Transact-SQL 创建并维护数据库邮件的配置。
日志记录。数据库邮件将电子邮件活动记录到 SQL Server、 Windows应用程序事件日志和 msdb 数据库的表中。
审核。数据库邮件将发送的邮件和附件的副本保留在 msdb 数据库中。您可以轻松地审核数据库邮件的使用情况并检查保留的邮件。
支持 HTML。数据库邮件允许您以 HTML 格式发送电子邮件。
设置邮件的优先级别:重要邮件有一个!标记,但OE中看不出来。
数据库邮件的体系结构:
数据库邮件由以下主要组件构成:
配置和安全组件:数据库邮件将配置和安全信息存储在 msdb 数据库中。配置和安全对象可创建数据库邮件所用的配置文件和帐户。
邮件处理组件:msdb 数据库是邮件主机数据库,包含数据库邮件用于发送电子邮件的消息处理对象。这些对象包括 sp_send_dbmail 存储过程和保存邮件信息的数据结构。
数据库邮件可执行文件:数据库邮件可执行文件是一个外部程序,从 msdb 数据库中的队列读取邮件并将邮件发送到电子邮件服务器。就是exe 文件。
日志记录和审核组件:数据库邮件将日志记录信息记录在 msdb 数据库和 Microsoft Windows 应用程序事件日志中。
即便不具备对数据库邮件体系结构的全面了解,您也能够有效地使用数据库邮件。但是,了解构成数据库邮件的组件以及组件之间如何交互将有助于您设计应用程序和解决可能出现的任何问题。
下图简要介绍了数据库邮件体系结构:
数据库邮件的设计基于使用 Service Broker 技术的排队体系结构。当用户执行 sp_send_dbmail 时,存储过程将向邮件队列中插入一项,并创建一条包含该电子邮件信息的记录。在邮件队列中插入新项将启动数据库邮件外部进程 (DatabaseMail90.exe)。该外部进程会读取电子邮件的信息并将电子邮件发送到相应的一台或多台电子邮件服务器。该外部进程还会在状态队列中插入一项,来指示发送操作的结果。在状态队列中插入新项将启动内部存储过程,该过程将更新电子邮件信息的状态。除存储已发送(或未发送)的电子邮件信息外,数据库邮件还在系统表中记录所有电子邮件的附件。数据库邮件视图提供了供排除故障使用的邮件状态,使用存储过程可以对数据库邮件队列进行管理。
只有 msdb 数据库中的 DatabaseMailUserRole 的成员可以执行 sp_send_dbmail
配置:
配置过程相对于早期的SQL Mail来说简单多了,主要就是配置文件和账户
首先咱们来看一个图:
从这个图中大家可以看到,用户一使用的是配置文件一,而用户二使用了两个配置文件;
配置文件一对应的是账户一和账户二,而配置文件二对应的是帐户二和帐户三;可以起到容错的作用,当一个失效的时候,另一个还能使用。
数据库邮件账户是数据库邮件的基本配置单元。它包含下列配置信息:
电子邮件的发件人信息:所有外发电子邮件消息将表明它们来自用户提供的这个账户。它不必是一个真实的电子邮件账户。
回复电子邮件地址:如果这些电子邮件的收件人尝试回复,回复将发送到此地址上。
SMTP连接消息:SMTP服务器名称和端口号包括在账户配置信息中。数据库邮件支持加密和非加密消息,加密是通过安全套接字层SSL实现的。
电子邮件重试配置:重试发送邮件多少次以及两次重试间等待的时间。
电子邮件大小限制:可对这个账户发送的电子邮件的大小进行限制。
排除附件扩展名限制。禁止某些类型的附件。
日志级别:对这个帐户执行哪个级别的日志记录。
下面,咱们就来看一下具体的配置:
首先咱们得配置一个SMTP服务器出来,这属于IIS的配置,在此具体步骤我就省略了。
步骤1:配置数据库邮件:
点击:配置数据库邮件之后,出现下图所示:
在此可以选择安装数据库邮件来创建新的电子邮件配置文件并指定其SMTP帐户,指定配置文件安全性并配置系统参数。
在此可以选择是,点击是之后可以启用数据库邮件功能。或者是通过存储过程来启用。在此我们就点击:否,我通过一个命令来启用此功能。
sp_configure 'show advanced options',1
reconfigure
sp_configure 'database mail xps',1
reconfigure
或者是通过外围应用配置器:
然后,我们再来重新配置数据库邮件,就没有此提示了!
点击:添加按钮来增加新的SMTP帐户。
必须在SMTP服务器上创建DBA账户。如果选用SSL,则必须有证书。
在此可以建多个账户,以实现容错。
公共配置文件是指:所有用户都可以使用此配置文件。但有个前提是:msdb 数据库中的 DatabaseMailUsersRole 角色
专用配置文件是指:只有指定的用户才可能使用此配置文件。
帐户重试次数:外部邮件进程使用指定配置文件中的每个帐户尝试发送电子邮件的次数。
帐户重试延迟时间(秒) :在尝试使用配置文件中的所有帐户传递消息后,外部邮件进程在再次尝试使用所有帐户之前等待的时间(秒)。
最大文件大小(字节) :附件的最大大小(字节)。
禁止的附件文件扩展名 :具有这些扩展名的文件不能作为电子邮件附件发送。可添加其他扩展名。
数据库邮件可执行文件的最短生存期(秒) :外部邮件进程保持活动状态的最短时间(秒)。只要数据库邮件队列中有电子邮件,该进程就会保持活动状态。此参数指定了在没有要处理的消息时该进程保持活动状态的时间。
日志记录级别:指定数据库邮件日志中要记录的消息。可能的值包括:
普通 - 仅记录错误
扩展 - 记录错误、警告和信息性消息
详细 - 记录错误、警告、信息性消息、成功消息和其他内部消息。使用详细日志记录可进行故障排除。
默认值为“扩展”。
全部重置:选择此选项可将该页上的值重置为默认值。
配置完成后,我们要测试一下:
也就是让数据库邮件给administrator发一封邮件!
这个1就是邮件的ID编号,如果没有收到的话,咱们可以去利用这个ID去排错!
我们利用OE来登录administraor收一下!
我们还可以查看邮件的日志:如果用户给回了一封,我们设置的回复地址也是dba@dufei.com
那可以利用OE来接收一下:可以再启一台机器,配置OE:
说明邮件设置是成功的!
那这里,咱们的警报或作业执行成功或失败的时候就可以给管理员发信了。咱们试试:只要把邮件的地址设置为:dba@dufei.com
请注意,若要向操作员发送电子邮件和寻呼通知,必须将 SQL Server 代理配置为使用数据库邮件或 SQL Mail。
方法如下:
重新启动 SQL Server 代理服务,以便使更改生效。
在未来版本的 Microsoft SQL Server 中,寻呼程序和 net send 选项将从 SQL Server 代理中删除。请避免在新的开发工作中使用这些功能,并考虑修改当前使用这些功能的应用程序。
Database Mail的数据存储:
元数据:相关的配置信息都存储在msdb中
相关数据:发送的邮件和日志也是存储在MSDB数据库中的。
以sysmail_为前缀的表中。
select * from msdb.dbo.sysmail_event_log --服务相关的信息
select * from msdb.dbo.sysmail_allitems --所有发送的邮件如果是普通用户则只能查看自己发送的邮件
select * from msdb.dbo.sysmail_faileditems -- 查看发送失败的邮件,可以停止SMTP,再发送,但需要等待一个重试时间。
发送邮件:向指定收件人发送电子邮件。该邮件可能包含查询结果集和/或文件附件。
语法是相当的复杂:
看几个例子吧:
A. 发送电子邮件
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBA_FILE',
@recipients = 'DBA@DUFEI.COM',
@body = 'The stored procedure finished successfully.',
@subject = 'Automated Success Message' ;
B. 发送包含查询结果的电子邮件
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'dba_file',
@recipients = 'dba@dufei.com',
@query = 'SELECT @@servername' ,
@subject = 'display server name',
@attach_query_result_as_file = 1 ;
C. 发送附件
exec msdb.dbo.sp_send_dbmail
@profile_name='dba_file',
@recipients='dba@dufei.com',
@file_attachments='c:\sqlbak\mt.bak',
@subject='attachments',
@importance=high,
@body='test!'
数据库邮件相当是一个SMTP的客户端!
也可以使用命令来配置数据库邮件,常用的存储过程如下: