sql server 发送邮件两种方法: Database Mail和SQL Mail的原理、实际应用及常见问题

一、SQL Mail的原理、实际应用及常见问题

概 述
   这 里 所 指 的SQL Mail, 是 微 软 公 司 的 关 系 数 据 库 管 理 系 统 SQL Server 所 提 供 的 邮 件 功 能。 在SQL Server 中 包 含 一 些 扩 展 存 储 过 程, 使 得SQL Server 可 以 通 过 基 于Windows NT 内 部 的 消 息 应 用 编 程 界 面(MAPI) 的 客 户 机 邮 件 程 序 接 收 和 发 送 邮 件 消 息。SQL Ma il 可 发 送 的 消 息 包 括 文 本 串, 附 加 文 件 或SQL 语 句 的 执 行 结 果 集。 应 用SQL Mail 的 扩 展 存 储 过 程, 邮 件 消 息 可 以 从 一 个 触 发 器 或 一 个 存 储 过 程 中 发 送, 并 且 通 过SQL Server 提 供 的 任 务 和 警 告 等 功 能, 可 以 根 据 需 要 在 不 同 的 时 间 和 情 况 下 发 送。

SQL Mail 工 作 流 程
   SQL Mail 工 作 流 程 主 要 分 为 邮 件 收、 发 两 个 过 程。
   在SQL Server 内 可 以 通 过 一 定 方 法, 调 用 扩 展 存 储 过 程xp_s endmail, 将 收 信 人 电 子 邮 件 地 址, 标 题, 信 的 内 容 等 以 参 数 的 形 式 传 送 给xp_sendmail, 由 它 通 过 客 户 端MAPI 接 口 将 发 送 邮 件 任 务 交 给 如Microsoft Exchange Client 或Outlook97 等 邮 件 客 户 端 程 序, 最 终 通 过 邮 件 服 务 将 邮 件 发 送 出 去。
   收 邮 件 的 过 程 与 此 相 似。 在SQL Server 端 定 期 或 手 工 调 用x p_readmail 扩 展 存 储 过 程, 通 过 客 户 端MAPI 接 口 将 存 放 在 邮 件 服 务 器 或 客 户 端 的 邮 件 及 其 他 信 息 读 入SQL 变 量 中, 用 来 满 足 特 定 的 处 理 需 要。

配 置SQL Mail
   配 置SQL Mail 的 首 要 条 件 是 要 有 一 个 电 子 邮 件 帐 户, 不 管 是 局 域 网 内 的MS Exchange Server 或MS Mail 3.x 的 邮 件 帐 户, 还 是Int ernet 上 的SMTP,POP3 等 邮 件 帐 户 均 可。 具 体 配 置 可 分 为 以 下 几 步 :

   1 . 为SQL Server 创 建 一 个NT 域 用 户 帐 号, 要 求 具 有 本 地 管 理 员 组 的 权 限。 仔 细 设 置 帐 号 口 令, 保 证 口 令 足 够 复 杂, 且 设 成 口 令 永 不 过 期 和 用 户 不 得 更 改 口 令。

   2 . 双 击 控 制 面 板 的 服 务 图 标, 找 到MS SQL Server 的 启 动 设 置, 将Use System Account 改 为Use This Account, 将 刚 才 建 立 的NT 帐 ? ?口 令 输 入。 重 新 启 动SQL Server。

   3 . 在 安 装SQL Server 的 服 务 器 上 以 与 启 动SQL Server 相 同 的 NT 帐 号 登 录, 然 后 安 装 支 持MAPI 接 口 的 邮 件 客 户 端 程 序, 如MS Exchange Client 和Outlook 97。

   4 . 打 开 控 制 面 板 的 电 子 邮 件 选 项, 建 立 一 个 配 置 文 件 (Profile)。 用 这 个 配 置 文 件 启 动 邮 件 客 户 端 程 序, 反 复 检 验 直 至 能 正 常 收 发 邮 件。

   5 . 从Sql Enterpriser Manager 中, 点 中 相 应 的 服 务 器 图 标, 从 Server 菜 单 中 选SQL Mail/Configure, 将 在 第4 步 中 建 立 的 配 置 文 件 名 输 入。

   6 . 从Sql Enterpriser Manager 中, 点 中 相 应 的 服 务 器 图 标, 从 Server 菜 单 中 选SQL Mail/Start, 如 果Sql Mail 的 图 标 变 为 绿 色, 则SQ L Mail 成 功 启 动。

   常 用 的SQL Mail 扩 展 存 储 过 程 xp_sendmail @recipient = recipient [; recipient2; [...; recipientn]] [, @message = message] [, @query = query] [, @attachments = attachments] [, @copy_recipients = recipient [; recipient2; [...; recipientn]]] [, @blind_copy_recipients = recipient [; recipient2; [...; recipientn]]] [, @subject = subject] [, @type = type] [, @attach_results = {true | false}] [, @no_output = {true | false}] [, @no_header = {true | false}] [, @width = width] [, @separator = separator] [, @echo_error = {true | false}] [, @set_user = user] [, @dbuse = dbname]

   此 存 储 过 程 通 过 客 户 端MAPI 接 口 发 送 邮 件, 内 容 可 以 是 文 本 串, 附 加 文 件 或SQL 语 句 的 执 行 结 果 集。 xp_findnextmsg [@msg_id = msg_id [OUTPUT]] [, @type = type] [, @unread_only = {true | false}])

   此 存 储 过 程 在 邮 箱 中 查 找 特 定 的 邮 件, 并 返 回 一 封 邮 件 的 消 息ID。 xp_readmail ([@msg_id = msg_id] [, @type = type [OUTPUT]] [, @peek = {true | false}] [, @suppress_attach = {true | false}] [, @originator = @sender OUTPUT] [, @subject = @subject_line OUTPUT] [, @message = @body_of_message OUTPUT] [, @recipients = @recipient_list OUTPUT] [, @cc_list = @cc_list OUTPUT] [, @bcc_list = @bcc_list OUTPUT] [, @date_received = @date OUTPUT] [, @unread = {true | false}] [, @attachments = @temp_file_paths OUTPUT]) [, @skip_bytes = @bytes_to skip OUTPUT] [, @msg_length = @length_in_bytes OUTPUT])

   此 存 储 过 程 从 指 定 的 邮 件 收 件 箱 中 读 取 指 定 消 息ID 的 邮 件 的 各 项 信 息。
   xp_deletemail [@msg_id = ] msg_id
   从 邮 件 收 件 箱 中 删 除 一 封 指 定 消 息ID 的 邮 件。
注 释:
   1. 存 储 过 程 的 多 个 参 数 间 用 逗 号 间 隔 开,[] 内 的 为 可 选 参 数, 每 个 参 数 均 以@ 符 号 加 字 符 串 开 头, 用 以 区 别 不 同 的 参 数 项。 等 号 后 可 以 是 常 量, 也 可 以 是 预 先 定 义 好 的 变 量。
   2. 如 果 需 要 将 某 个 结 果 值 赋 予 参 数 中 预 先 定 义 好 的 变 量, 就 必 须 在 该 项 参 数 的 最 后 加OUTPUT。
   3. 常 用 参 数 解 释:
   ? @recipient = recipient ; 指 定 收 件 人 的 电 子 邮 件 地 址。 如 果 有 多 个 收 件 人, 可 以 用 分 号 分 隔 开。
   ? @subject = subject ; 邮 件 的 标 题。 发 送 邮 件 时 的 默 认 值 为 "SQL Server Message"。
   ? @message = message ; 邮 件 的 具 体 内 容。
   ? @attachments = attachments ; 邮 件 挂 接 的 附 加 文 件 名。
   ? @type = type ; 基 于MAPI 定 义 的 消 息 类 型, 详 细 信 息 参 见" Microsoft Windows NT Resource Kit" 或"Microsoft Mail Technical Reference"。
   ? @query = query ; 一 条SQL 可 执 行 语 句, 其 执 行 结 果 以 正 文 或 附 件 的 方 式 随 邮 件 发 送。
   ? @msg_id = msg_id ; 对 于 信 箱 中 的 每 一 封 邮 件 均 被 分 配 了 [风雨情难觅,心手两迷离]
   ? @attachments = attachments ; 邮 件 挂 接 的 附 加 文 件 名。
   ? @type = type ; 基 于MAPI 定 义 的 消 息 类 型, 详 细 信 息 参 见" Microsoft Windows NT Resource Kit" 或"Microsoft Mail Technical Reference"。
   ? @query = query ; 一 条SQL 可 执 行 语 句, 其 执 行 结 果 以 正 文 或 附 件 的 方 式 随 邮 件 发 送。
   ? @msg_id = msg_id ; 对 于 信 箱 中 的 每 一 封 邮 件 均 被 分 配 了 一 个 特 殊 的 消 息ID, 用 以 相 互 区 分。
SQL Mail 常见问题

下面的问题是 Microsoft SQL Server 支持专业人员经常被问到的有关 SQL Mail 的问题。这些问题不是按被问到的频率进行排序的,而是将类似的问题放在一起。


Q1:为什么必须在我的 SQL Server 计算机上安装邮件客户程序才能使用 SQL Mail?

A1:SQL Mail 是一个基于邮件应用程序编程接口 (MAPI) 的应用程序,该应用程序需要有 MAPI 消息传递子系统才能发送邮件。MAPI 子系统会在安装基于 MAPI 的客户程序时安装。Microsoft Windows NT 4.0 提供了一个名为 Windows Messaging 的 MAPI 客户程序;但是 Microsoft Windows 2000 未提供 MAPI 客户程序。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

238085 (http://support.microsoft.com/kb/238085/EN-US/) INFO:Windows 2000 Does Not Install MAPI 1.0 Subsystem(Windows 2000 未安装 MAPI 1.0 子系统)
为 SQL Mail 提供 MAPI 子系统最简单的方法是安装基于 MAPI 的邮件客户程序,例如 Microsoft Outlook。邮件客户程序还提供配置邮件配置文件的机制,该邮件配置文件随后可被分配到 SQL Mail。邮件配置文件向 SQL Mail 提供连接到邮件服务器以发送和接收邮件所需的信息。

Q2:可以将哪些邮件客户程序和 SQL Mail 一起使用?

A2:可以和 SQL Mail 一起使用的邮件客户程序取决于 SQL Server 和操作系统的版本。如果您正在使用 Windows NT 4.0,则可以将 Windows NT 4.0 提供的 Windows Messaging 客户程序和 SQL Server 6.5 及 SQL Server 7.0 的 SQL Mail 一起使用。Windows Messaging 客户程序只能用于 Internet 邮件服务器,不能用于 SQL Server 2000。有关 SQL Server 2000 的邮件客户程序选项的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

281293 (http://support.microsoft.com/kb/281293/EN-US/) FIX:SQL Mail 2000 Needs Microsoft Outlook 2000 Client(SQL Mail 2000 需要 Microsoft Outlook 2000 客户程序)
Microsoft Outlook 98 可以用于 SQL Server 6.5 和 SQL Server 7.0。只有当您应用了 Microsoft SQL Server 2000 Service Pack 1 之后,Outlook 98 才能用于 SQL Server 2000。Outlook 98 可以用于 Exchange 服务器或 Internet 邮件服务器。安装 Outlook 98 时必须选用用于企业或工作组选项才能和 SQL Mail 一起使用。以"仅用于 Internet Mail"(IMO) 模式安装的 MAPI 子系统是一个 Stub,它只为 Microsoft Outlook 的基本功能提供最基本的 MAPI 支持,不能和 SQL Mail 一起使用。

Microsoft Outlook 2000 可以用于 SQL Server 6.5、SQL Server 7.0 和 SQL Server 2000。Outlook 2000 可以用于 Exchange 服务器或 Internet 邮件服务器。安装 Outlook 2000 时必须选用用于企业或工作组选项才能和 SQL Mail 一起使用。以 IMO 模式安装的 MAPI 子系统是一个 Stub,它只为 Microsoft Outlook 的基本功能提供最基本的 MAPI 支持,不能和 SQL Mail 一起使用。有关 Outlook 的 IMO 选项的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

252720 (http://support.microsoft.com/kb/252720/EN-US/) INFO:MAPI and CDO Are Not Supported in Outlook IMO Mode(Outlook IMO 模式中不支持 MAPI 和 CDO)
Microsoft Office XP 中提供的 Microsoft Outlook 2002 可以用于 SQL Server 2000。对于 SQL Server 6.5 和 SQL Server 7.0,内置在 Outlook 2002 中的安全功能将导致 SQL Mail 停止响应。若要让 Outlook 2002 和 SQL Mail 一起使用,您应该具有 Exchange 服务器。Microsoft 建议不要将 Outlook 2002 和 SQL Mail 以及简单邮件传输协议 (SMTP) 或邮局协议 3 (POP3) Internet 邮件服务器一起使用。请参阅 Microsoft 知识库文章 Q263556 中"Outlook 2002 客户程序"一节,本文的"概要"一节对这一节进行了引用。

Q3:是否可以将 Outlook Express 和 SQL Mail 一起使用?

A3:因为 Outlook Express 安装简单的 MAPI 消息传递子系统并且不提供创建邮件配置文件的机制,所以不能和 SQL Mail 一起使用。

Q4:如果正在运行 Microsoft Small Business Server,那么如何创建邮件配置文件?

A4:Small Business Server 是一个特殊情况,这是因为您的 Exchange 服务器和 SQL Server 在同一台计算机上。有关如何在 Small Business Server 上使用 SQL Mail 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

304967 (http://support.microsoft.com/kb/304967/EN-US/) How to Configure SQL Server to Send Email on Small Business Server 2000(如何在 Small Business Server 2000 上配置 SQL Server 以发送电子邮件)
Q5:是否可以将 SQL Mail 和 Lotus Notes 或 Novell Groupwise 等邮件服务器一起使用?

A5:您可以将 SQL Mail 和第三方邮件服务器(如 Lotus Notes 或 Novell Groupwise)一起使用,但是,只有在将第三方邮件服务器配置为 Internet 邮件服务器时才支持此配置。

虽然可以配置 Microsoft Outlook 客户程序和第三方邮件服务器一起使用,但是不支持将这些邮件服务器提供的电子邮件客户程序和 SQL Mail 一起使用。这些电子邮件客户程序提供它们自己的 MAPI 消息传递子系统的实现,至于是否可以和 SQL Mail 一起使用,尚未经过测试。

Q6:如果 SQL Mail 不接收邮件,是否需要 POP3 服务器?

A6:除非您设置的 SQL Mail 具有 Exchange 服务器用于接收电子邮件,否则即使不在服务器上接收邮件,也必须具有工作的 POP3 服务器。其原因是 Microsoft Outlook 将先检查 POP3 接收邮件服务器,然后再发送外发电子邮件。如果没有有效的 POP3 接收邮件服务器,则可能延迟或根本不发送外发邮件,或者 SQL Mail 可能停止响应(挂起)。

Q7:是否可以将 Yahoo! 或 Hotmail 帐户用作 POP3 服务器?

A7:不能将基于 Web 的邮件服务(例如 Yahoo!Mail 和 Hotmail)用作 POP3 服务器。将这些服务用于商业目的还可能违反它们的"服务使用"协议。

最好也不要使用 Internet 服务提供商 (ISP)(例如 MSN)提供的 POP3 帐户。如果 SQL Mail 由于任何原因未能连接到 POP3 服务器,则 SQL Mail 将停止响应,于是您必须停止,然后重新启动 SQL Server 才能再次发送邮件。不在您控制之下的邮件服务器可能在任何时候关闭以进行维护,或者出现 Internet 上速度减慢的情况,这些都可能导致它们无法访问。

一个较好的解决方案是在您的 SQL Server 计算机上安装 POP3 服务器并使用邮件帐户对其进行配置,这样您便具有了一个本地 POP3 服务器和有保障的连接。POP3 和 SMTP 协议是公共域,您可以通过 Internet 以低廉的成本或免费获得支持这些协议的邮件服务器用于安装。Microsoft 不担保任何一种特定的 Internet 邮件服务器优于其他邮件服务器,也不对 Internet 邮件服务器的安装或管理提供支持。

Q8:如果不想在我的 SQL Server 计算机上安装 Microsoft Outlook,那么如何使用 SQL Mail?

A8:如果您正在运行 Windows NT 4.0,则可能可以使用 Windows Messaging,具体情况取决于您的 SQL Server 的版本。请参阅上面有关邮件客户程序是否可用于 SQL Mail 的问题来了解有关 Windows Messaging 客户程序的限制。

如果您正在运行 Windows 2000,则必须在您的 SQL Server 计算机上安装 Microsoft Outlook 客户程序。

您还可以通过 Transact-SQL 批处理程序发送邮件,而不使用 SQL Mail,方法是使用 CDO for NT Server (CDONTS) 或 CDO for Windows 2000 (CDOSYS) 以及 SQL Server OLE 自动存储过程。有关如何使用 CDO 创建邮件过程的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

312839 (http://support.microsoft.com/kb/312839/EN-US/) HOW TO:Send E-Mail from SQL Server Without Using SQL Mail(从 SQL Server 发送电子邮件而不使用 SQL Mail)
Q9:如果具有 Microsoft Exchange,是否仍需要使用 Outlook?

A9:Outlook 提供的客户端 MAPI 并不总是适合服务器端应用程序(如 SQL Server)。Exchange Server 附带的服务器端 MAPI 比 Outlook 附带的客户端 MAPI 更合适。但是,安装 Exchange MAPI 不会为您提供创建邮件配置文件的功能,而邮件配置文件是 SQL Mail 所必需的。如果您愿意使用 Exchange 服务器端 MAPI,这里提供一些方法可用来创建邮件配置文件。有关如何通过 Exchange 服务器端 MAPI 创建邮件配置文件的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

306962 (http://support.microsoft.com/kb/306962/EN-US/) HOWTO:Create MAPI Profiles Without Installing Outlook(在未安装 Outlook 的情况下创建 MAPI 配置文件)
若要安装服务器端 MAPI,您不需要在 SQL Server 计算机上安装 Exchange Server。只要安装 Microsoft Exchange Administrator 就可以了。您还必须添加 Exchange 服务以创建配置文件。有关如何添加 Exchange 服务的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

294470 (http://support.microsoft.com/kb/294470/EN-US/) HOWTO:Add Entries For Exchange Services to Mapisvc.inf(将 Exchange 服务的条目添加到 Mapisvc.inf)
Q10:是否可以使用 SQL Mail 发送 HTML 邮件?

A10:由于 MAPI 限制,对于当前版本的 SQL Server,您不能使用 SQL Mail 发送 HTML 格式的邮件。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

268440 (http://support.microsoft.com/kb/268440/EN-US/) INFO:MAPI Is Not Suitable for HTML Messages(MAPI 不适用于 HTML 邮件)
如果要发送 HTML 格式的邮件,您可能需要考虑编写使用协作数据对象 (CDO) 的存储过程来发送邮件。有关使用 CDO 创建邮件过程的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

312839 (http://support.microsoft.com/kb/312839/EN-US/) How to Send Mail from SQL Server without using SQL Mail(如何从 SQL Server 发送邮件而不使用 SQL Mail)
Q11:为什么在 SQL Server 2000 中没有启动 SQL Mail 的选项?

A11:在 SQL Server 2000 中没有手动启动 SQL Mail 或在启动 SQL Server 时自动启动 SQL Mail 的选项。SQL Mail 在您第一次发送 SQL Mail 邮件时自动启动。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

293443 (http://support.microsoft.com/kb/293443/EN-US/) INF:The Autostart SQL Mail Option Does Not Appear in the SQL Enterprise Manager(自动启动 SQL Mail 选项不显示在 SQL 企业管理器中)
使用 xp_startmail 和 xp_stopmail 扩展存储过程启动和停止 SQL Mail 可能导致内存泄漏,除非您应用了 SQL Server 2000 Service Pack 2,否则 Microsoft 不建议您使用这些存储过程。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

300414 (http://support.microsoft.com/kb/300414/EN-US/) FIX:SQL Mail Operations May Lead to Failures and Memory Leaks(SQL Mail 操作可能导致故障和内存泄漏)
Q12:为什么需要使用域帐户来启动 SQL Server?

A12:只有当您使用 Exchange Server 时才需要使用域帐户启动 SQL Server。SQL Mail 应该能够通过使用 Windows 身份验证连接到 Exchange Server 以避免被提示输入用户凭据。域帐户既能登录到本地 SQL Server 服务器又能登录到远程 Exchange Server 计算机,因此是完成此任务的最佳方法。

如果您正在使用 Internet 邮件服务器,则必须在配置邮件配置文件时提供 POP3 服务器的帐户名和密码。因为这是登录到 POP3 服务器所需进行的唯一身份验证,所以不需要从域帐户启动 SQL Server 服务。SMTP 服务器通常不需要帐户和密码。

如果计划使用 SQL Mail,则不应该从本地系统帐户启动 SQL Server,这是因为您无法将邮件配置文件和本地系统帐户进行关联。

Q13:是否可以对 SQL Mail 和 SQL Agent Mail 使用相同的配置文件?

A13:邮件配置文件与特定的 Windows 登录帐户关联。如果您在配置文件中配置 Internet 邮件服务,则将在默认位置创建个人存储文件 (.pst) 以存储从 POP3 服务器下载的邮件。此 .pst 文件供使用此邮件配置文件的所有服务使用,如果 SQL Mail 和 SQL Agent Mail 同时使用相同的邮件配置文件,则将导致冲突。

如果使用 Exchange 服务配置邮件配置文件,则通常不使用 .pst 文件,因为 Exchange 邮件将保留在 Exchange 服务器上。在这种情况下,您可以将相同的邮件配置文件用于 SQL Mail 和 SQL Agent Mail。但是,如果您创建了 .pst 文件,则在任何时刻只有使用邮件配置文件的那个服务可以访问 .pst 文件。如果您在邮件配置文件中使用 .pst 文件,则将需要对 SQL Mail 和 SQL Agent Mail 使用不同的邮件配置文件。有关更多详细信息,请参阅 q313969(在文章中插入链接)。

备注:如果指定 .pst 文件的位置,则不要使用网络共享。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

297019 (http://support.microsoft.com/kb/297019/EN-US/) OL2000:Why .pst Files Are Not Recommended Over a LAN or WAN Link(为什么不建议在 LAN 或 WAN 链接上使用 .pst 文件)
如果使用不同的服务帐户启动 SQL Server 和 SQL Agent 服务,则必须为每个帐户配置邮件配置文件。若要为服务帐户配置邮件配置文件,您必须使用该服务帐户登录到服务器。

Q14:如果 Exchange 服务器和 SQL Server 服务器分别在两个域中并且这两个域之间没有信任,那么我需要使用什么帐户?

A14:如果不被提示输入登录凭据就无法从 SQL Server 计算机上的 Outlook 客户程序向 Exchange 服务器发送邮件,则 SQL Mail 将不工作。当提示输入用户凭据的对话框显示在虚拟桌面上时,任何发送邮件的尝试都将导致 SQL Mail 停止响应。

若要解决此问题,请将 Exchange 服务器当做 Internet 邮件服务器对待。您可以在配置邮件配置文件时传递登录帐户和密码信息,以便当连接到其他域中的 Exchange 服务器时不提示 SQL Mail 输入登录信息。

如果 SQL Server 服务器和 Exchange 服务器被防火墙分开,您也可以使用此方法。

Q15:是否可以将 SQL Mail 用于 Microsoft 桌面引擎 (MSDE)?

A15:MSDE 上不支持 SQL Mail。您必须升级到 SQL Server 的非 MSDE 版本才能使用 SQL Mail。

二、Database Mail - SQL2005

有在用 SQL 2000的使用者還記得 SQL Mail吧. SQL Mail是利用MAPI的方式進行mail的傳遞, 在實務上往往會使用outlook配合exchange server來進行環境的建立, 也造成在使用SQL Mail前, 要準備好這些環境. 但在一般的應用上, 要使用SQL Mail, 又要有這些環境, 不見得很容易實現. 另外再加上SQL Mail在cluster環境時, 也要注意兩台的MAPI profile的設定, 才不會發生發不出mail的問題.

是的, 你的不方便, MS都知道, 到 SQL 2005後, 你會發現多了一個 Database Mail 的功能, 本篇文章就是來介紹這個方便又好用的 SQL Server發信方式. Database Mail 是基於 SMTP的方式來寄送信件, 所以很容易設定, 不太需要像 MAPI 需要 outlook 介面及 exchange server 配合寄送, 當然還是要建立 profile, 好讓 SQL Server 明白你要發信的帳號. 不過因為是走 SMTP, 所以設定也就容易多了. 而且 Database Mail 是能完全支援 cluster 的(因為是用 SQL Server 的機制, 而非外部的資源).

less..


我們在 SQL Server Management Studio 上展開你要設定的 SQL Server, 在 Management 下有個 Database Mail, 接下來就按右鍵進行設置 profile 及發送測試信件囉, 步驟可參考 MS 說明:

http://msdn2.microsoft.com/en-us/library/ms175951.aspx
中文: http://msdn2.microsoft.com/zh-tw/library/ms175951.aspx

設定完成後, 我們來看看發個 mail 試試囉, 利用 sp_send_mail 來進行發送 mail 囉. 為什麼會要用 SQL Mail 或 Database Mail, 其中除了整合在 SQL Server 外, 很重要的一點是將 query 的結果放入 mail 裡, 方便通知或警示, 這是十分重要的功能, 因為在管理資料庫時, 有時需要發生問題時, 當時的環境及資料的狀況, 利用 query 來調出資料是十分重要方便的. 所以要學會使用 SQL Mail 或 Database Mail 相信大家也能體會這個很重要吧!

sp_send_mail 範例如下:

msdb..sp_send_dbmail
   @profile_name = 'myprofile',
   @recipients = 'op1@diary.tw',
   @query = 'select top 10 * from test..member where email is null' ,
   @subject = 'member data email null',
   @body = 'member data email null notification',
   @attach_query_result_as_file = 1,
   @body_format = 'HTML' ;

上面是一個比較常用, 帶著 query 的結果為附件的用法, 實際測試時發現, 要將查詢結果變為附件時, body_format 要為 HTML 才行, 否則似乎是會發(從發送記錄上可以查得到), 但收不到, 所以在做 sp_send_dbmail 時, 要注意一下. 純文字的話, 就不要用查詢附件夾檔囉, 如下:


msdb..sp_send_dbmail
   @profile_name = 'myprofile',
   @recipients = 'op1@diary.tw',
   @query = 'select top 10 * from test..member where email is null' ,
   @subject = 'member data email null',
   @body = 'member data email null notification' ;

利用這種方式, 查詢的內容將會放在 mail 的 body 裡面, 而不用夾檔的方式.
接下來說明相關的 table, 使用 Database Mail 後, log 會放在 msdb 這個系統資料庫內, 相關的 table 比較會用到的有以下三個:

1) msdb.dbo.sysmail_allitems
2) msdb.dbo.sysmail_attachments
3) msdb.dbo.sysmail_event_log

其中 1) 是用來存放所有寄送的 mail, 2) 是存放有附件的 mail 附件, 3) 則是系統的記錄. 欄位功能看名稱即可得知. 要特別注意的是存放在 msdb 的相關資料表會愈來愈大, 這個可藉由後面的[如何建立 job 封存 Database Mail 的記錄]這篇文章獲得解決, 當然在設定 Database Mail profile時也可以在 Database Mail 組態精靈中[檢視或變更系統參數]功能來修改[記錄層次]來減少記錄的資料, 但 mail 本身的記錄應該都還是會存在的, 這是在使用 Database Mail 所衍生的空間使用問題, 得特別注意的地方.


繼續閱讀:
Database Mail 特性:
http://msdn2.microsoft.com/en-us/library/ms175887.aspx
中文: http://msdn2.microsoft.com/zh-tw/library/ms175887.aspx

如何將 SQL Mail 的 stored procedure 轉換為 Database Mail:
http://msdn2.microsoft.com/en-us/library/ms187891.aspx
中文: http://msdn2.microsoft.com/zh-tw/library/ms187891.aspx

如何建立 job 封存 Database Mail 的記錄:
http://msdn2.microsoft.com/en-us/library/ms189258.aspx
中文: http://msdn2.microsoft.com/zh-tw/library/ms189258.aspx

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liaolian9948/archive/2010/01/13/5184170.aspx

posted @ 2010-07-29 20:45  Daniel_Lu  阅读(999)  评论(0编辑  收藏  举报