开篇介绍
大多数情况下我们的 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 的使用其实非常的简单,配置的步骤也并不多,但是在使用它的时候有几个限制:
- 只能发送普通的文本格式的邮件,也就是说不支持 HTML 格式的邮件。
- 连接 SMTP Server 时不支持用户填写用户名和密码,也就是说用户要么在域环境下 SMTP Server 对用户进行 Windows 方式验证,要么就是访问的 SMTP Server 支持匿名访问,不需要提供用户名和密码。
- 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验证, 以及如何成功订阅报表的实例