微软BI 之SSIS 系列 - 使用 Send Mail Task 邮件通知错误

浏览: 18798

开篇介绍

大多数情况下我们的 SSIS 包都会配置在 SQL Agent Job 中周期性的按计划执行,比如每天晚上调用 SSIS 包刷新数据,处理 Cube 等。一旦 SSIS 包中出现任何异常,报错,那么配置在 SQL Agent Job 中的通知,邮件提醒就会把这些错误信息发邮件到指定的用户或者系统维护者,这样就起到了一个错误监控的作用。

但是有的情况下,有一些自定义的 SSIS 调度框架的计划调度都不是通过 SQL Agent Job 配置来完成的。比如我曾在一个小项目中设计过一个 SSIS 调度框架,只有一个主包配置在 SQL Agent Job 中,所有子包的上线不由 SQL Agent Job 支配,只需要将相应的信息以及调度计划注册到相应的表中即可,不需要打开 SQL Agent Job 调整各个子包的执行顺序等等。那么在这种情况下,就只能在 SSIS 内部使用发送邮件的功能来发送错误信息,因为任何子包出现的问题不会影响主包的执行,所有的子包和 SQL Agent Job 没有任何关系。

在 SSIS 中我们可以通过 Send Mail Task 或者 Script Task 来发送邮件,当然还有第三种方式就是写存储过程调用发送邮件存储过程,这里演示 Send Mail Task 的方式。

Send Mail Task 发送邮件任务

Send Mail Task 的使用其实非常的简单,配置的步骤也并不多,但是在使用它的时候有几个限制:

  1. 只能发送普通的文本格式的邮件,也就是说不支持 HTML 格式的邮件。
  2. 连接 SMTP Server 时不支持用户填写用户名和密码,也就是说用户要么在域环境下 SMTP Server 对用户进行 Windows 方式验证,要么就是访问的 SMTP Server 支持匿名访问,不需要提供用户名和密码。
  3. SMTP Server 的端口号使用默认的,也就是说如果在域中的 SMTP Server 端口号不是默认的话 Send Mail Task 就无法使用了。

由于测试环境的限制,我无法使用域账号来发送邮件,那么下面我通过匿名访问的方式来演示 Send Mail Task 的配置与发送邮件的过程。

这里是我常用的一个测试服务器地址 http://www.yopmail.com/en/ ,免费的并支持匿名访问,可以通过它来进行邮件发送的测试。

我要使用 biwork@yopmail.com 这个账号给 biworktest@yopmail.com 发送邮件 

新建一个包并拖放一个 Send Mail Task。

主要的配置都在 Mail 选项中,首先需要建立一个 SMTP Connection 访问 SMTP 服务器。

Yopmail 的 SMTP 服务器地址是 smtp.yopmail.com,这里有一个选项是 2012 对2008R2 版本的一个改进。在 SQL Server 2008 R2 版本中,是没有 Timeout 这样的一个选项的。这样会有一个问题,即当发送附件内容过大的时候,是容易发生超时的,因为内置默认 Timeout 时间是 100,000 毫秒,100秒。在这里我们不填写 Timeout,它应该也保持默认值。

配置 Mail 选项,很容易理解配置的是什么内容。在配置最后有一个附件,我上传了一个 XML 文件用来测试。

保存并执行包,发生失败 - Bad Domain 使用了错误的域名!原因就在于在收件人地址中,YOPMAIL 有限制,要求收件人必须是 yopmail.com 的邮箱。如果这种匿名邮箱不做出这样的限制,那么可想而知我们很容易拿着 YOPMAIL 给别人发送垃圾邮件且没有任何违法的成本。

[Send Mail Task] Error: An error occurred with the following error message: "Syntax error in parameters or arguments. The server response was: Bad Domain".

正确的配置如下 - 

保存并执行成功!

查看 biworktest@yopmail.com 邮箱中,可以看到发件人,邮件标题,邮件内容与附件等信息,测试成功!

当然只要收件人域名是 yopmail.com,发件人可以随便改,比如使用 biwork@126.com 发送也是可以成功的。

演示错误事件与错误邮件发送提醒

当包中的某一个 Task 执行失败的时候,会触发它自身的 OnError 事件,默认情况下整个包也会失败,因此也会触发到包的 OnError 事件。

我们把控制流中的这个错误配置给还原一下,演示当这个错误发生时,包自动的发一封邮件给 biworktest@yopmail.com 报告这些错误信息。

上面的这个 Task CM_SMTP_YOPMAIL 将会引起错误,导致包执行失败,因此触发包的 OnError 事件。切换到 Event Handlers 处,选中 019_SEND_MAIL_TASK 包的名称,然后选中 OnError 后确定。

在包中新建一个变量 PV_ERROR_MESSAGE,通过表达式给它的赋值 - 

"SSIS Package Failed!\r\n
Error Information as below:\r\n
Server Name –
"+ @[System::MachineName]+"\r\n
Package Name –
"+@[System::PackageName]+".dtsx\r\n
Task Name –
"+ @[System::SourceName]+"\r\n
Task Type –
"+@[System::SourceDescription]+"\r\n
Error Description
- "+@[System::ErrorDescription]+"\r\n
Error Code –
"+(DT_WSTR, 12) @[System::ErrorCode]

并把它的 Scope 移动到 OnError 处,只有移动到 OnError 范围中,上面的系统变量比如 @[System::SourceName],@[System::SourceDescription],@[System::ErrorDescription],@[System::ErrorCode],才是可见的。因为正常运行的包中,是不需要描述这些信息的系统变量的。

最后,在 OnError 处的 Send Mail Task 的配置完成如下修改。

保存并执行包,当在控制流中的 Send Mail Task 因为发送给了非法的域名 biwork@126.com 而出错。

这时包的 OnError 事件捕获这个错误,并将错误内容发送给 biworktest@yopmail.com 以提醒 SSIS 包在运行过程中出现了错误。

查看 Yop Mail 中的邮件内容 -

相关资源

在这篇 SSRS 报表订阅文章中,也是通过匿名验证演示如果实现订阅的过程,同样它是支持 Windows 验证的。

微软BI 之SSRS 系列 - 报表邮件订阅中 SMTP 服务器匿名访问与 Windows验证, 以及如何成功订阅报表的实例

推荐 0
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册