代码改变世界

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

2013-08-14 23:51  BIWORK  阅读(8930)  评论(27编辑  收藏  举报

这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助!

参看上一篇博文 - SSRS 报表中分组聚合的展开和收起效果与处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号) 

 


先展示订阅成功的效果之一

 


进入正文....

首先,先列出常见问题,大家多多少少碰到过。

第一,在SSRS报表订阅的地方找不到 Email 的选项 - Choose a method of delivery 下只有 Windows File Share 看不到 Email 选项。

第二,只要一设置订阅,就会出现这种错误信息。

Subscriptions cannot be created because the credentials used to run the report are not stored, or if a linked report, the link is no longer valid.

大致的意思就是"运行报表的证书没有保存因此不能创建订阅...."

第三,比如 SQL Server Agent 没有启动造成的错误。报表的订阅是按时间周期发送报表的,因此实际上是由 SQL Server Agent Job 来完成的。当订阅完成后,在 SQL Server Agent 下就能看到

第四,除了这些基本的错误之外,最常见的问题,很多人按照MSDN或者网上其它资料讲解的配置怎么就配置不成功(收不到订阅的报表)。一种是在公司使用公司域用户邮箱也配置不成功,第二种是公司域用户能配置成功,但是换了其它比如126等邮箱就是不成功,为什么?如何来验证?

我们依次来解决这些问题,不过要先说明一下,其中有些结论只在于我个人不断的尝试,猜测,再尝试和最终总结的结果。有可能总结有不正确的地方,希望大家也可以积极探讨和指正。


第一,在SSRS报表订阅的地方找不到 Email 的选项 - Choose a method of delivery 下只有 Windows File Share 看不到 Email 选项。

这个比较简单,原因就是我们在 Reporting Services 的配置中并没有设置我们的 SMTP Server 和 发送邮件信息,这样就无法发送邮件。

第二,只要一设置订阅,就会出现这种错误信息 - Subscriptions cannot be created because the credentials used to run the report are not stored, or if a linked report, the link is no longer valid.

这个错误其实是报表数据源的设置错误造成的,因为在报表的数据源没有绑定一个存储在 SQL Server 上的用户,而有可能使用了 Windows 集成验证等方式。

因此,首先创建一个 SQL Server 用户,我在本地还给了这个账户 sysadmin 权限.

数据源访问使用这个账户

这样就可以了!

等这些基本的配置问题解决后,后面就是真正在使用 SSRS 报表订阅过程了!


在解决问题4之前,先完成了以下这些准备.

第一,Reporting Services 先要配置好,特别是之前提到的 SMTP Server 那里的配置.

我的 Service Account 和其它的账户都是域账户。

这个最后来解释,SMTP Server 这里的配置发现没有? 是没有密码验证的,这就是很多人配置失败和比较困惑的地方!

 

第二,报表的实例是来自于上一篇博文中的报表 - SSRS 报表中分组聚合的展开和收起效果与处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号)

部署这个报表到 Reporting Service 中去.

检查 Data Source 中的配置

 

一定要记得 Apply !

回到报表,选择订阅 - Subscribe..

常用的发送邮件设置很简单,注意我这里填的邮件地址 biworktest@yopmail.com 和在 Reporting Services 里配置的 biwork@yopmail.com 使用的都是同一个 SMTP Server smtp.yopmail.com。这里不想误导大家,填着两个地址是有原因的,我们先看配置和发送邮件的结果。

下面的订阅选项中,报表可以 PDF, HTML 或者 Excel 的形式发送,都可以尝试一下,这里我选择的是 Excel, 目的就是想看看这个报表的分组的 +和- 在不在。

选择计划 - Schedule, 和 SQL Server Agent 里一样很容易配置。

为了快速测试,我选择每1分钟发送一次,点击确定。

可以看到外面的显示,每1分钟一次。

1分钟以后... 看看 My Subscriptions 的记录,显示了订阅的最后一次发送的时间和状态。

 

到我的接收邮箱 biworktest@yopmail.com 中看看有没有来自 biwork@yopmail.com 发送过来的报表。

非常壮观啊!也有之前2分钟测试发一次的!都成功了!

打开附件,看看果然只有第一层的 + 存在,而第二层和第三层的就没有了!并且 France 在之前的例子中是不可以展开的,因为它下面并没有子元素,但是在这里看到确实展开的效果。

对比一下之前在 Reporting Services 上的效果。

至此,整个 SSRS 报表的订阅过程,以及报表以 Excel 附件发送和效果都看到了,这里的订阅是成功的。


再来谈谈,为什么我们所有的配置看似成功,订阅也可以顺利的创建,SMTP 服务器也没有问题(通过 DB Email 发送邮件验证过肯定没有问题,参看我的另一篇文章 配置 SQL Server Email 发送以及 Job 的 Notification通知功能),但是最终还是不能成功。

还是先看看我们在 Reporting Service 里 SMTP 服务器的配置。

在这里 Sender Address, 是发件人地址。 SMTP Server, 是这个发件人地址的 SMTP 服务器。在这里并没有进行用户安全性验证,比如输入密码。我的理解是,Reporting Service 在这里只是拿这个发件人地址去访问 SMTP 服务器,如果 SMTP服务器支持不用密码安全性验证的匿名访问的话,那么是完全没有问题的。

第一种测试,我在我们公司内部,使用我们公司的 SMTP 服务器和自己的邮箱地址,配置好了订阅,但是依旧不能成功。

错误的信息 -

Failure sending mail: The SMTP server requires a secure connection or the
client was not authenticated. The server response was: 5.7.1 Client was not
authenticatedMail will not be resent.

原因就是,我们公司的 SMTP 服务器不支持匿名访问,但是因为PC在域中,能够识别到运行 Reporting Service 的 Windows 账号,这时就需要你主动提供认证的要求,那么 SMTP 服务器会通过对你进行 Windows 认证,如果认证通过那么就可以发送邮件了!

但是,这个东西的配置并不是在 Reporting Services 上就能直接完成的,需要修改 Report Server 的配置文件。

我的地址是 - C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

在 rsreportserver.config 中找到 -

将<SMTPAuthenticate></SMTPAuthenticate> 改成 <SMTPAuthenticate>2</SMTPAuthenticate>

默认是 0 - 没有身份验证,也就是说 SMTP 服务器不支持匿名访问,但是因为我们已经在域中,SMTP 服务器本来可以进行 Windows 验证的,但是我们在这个配置中却写上了没有身份验证,那么 SMTP 即使可以给你验证,它看到这个 0 那么也就放弃了,那么你肯定就不成功了!

2 - 身份验证,并且是 Reporting Services 通过 Windows 服务的安全凭证连接到 SMTP 服务器,那么就是告诉 SMTP 服务器我是有身份的,你应该验证下,这样不就验证成功了吗? 所以微软这样设计 Reporting Services 的目的可能也是考虑到安全性的问题,如果可以随便订阅,没有域环境下的安全检查,那不是随便填个地址就可以随便把报表发出去了吗? 因为大多数 SMTP 服务器都不支持匿名访问的,这样就给报表的订阅限定了一个安全的范围,这是我自己的理解!

OK! 在域环境下,设置为 2 就可以正常发送邮件订阅了!


第二种测试与很多人有关,因为肯定有人和我一样一开始就傻傻的很执着的配置这个订阅,翻资料查资料屡战屡败,屡败屡战到最后也没有搞明白问题出在什么地方,反而开始怀疑起是不是自己的系统防火墙或者什么小地方配置出错了?要么最后这就是微软的一个 Bug,最后放手。

我也尝试过多次为什么在域中可以,但是回到家就不能发 163,126等邮箱,配置过很多遍就是不成功。看过日志看过 Reporting Service 配置文件,再仔细尝试过在域中的配置后,我意识到确确实实不是我们自身配置的问题。想想,就126 邮箱来说,如果我们在没有输入密码进行安全性验证的情况下就可以随便借助 SMTP 服务器发邮件,那么是不是会有很多的垃圾的邮件产生。以前相信很多 SMTP服务器应该支持匿名访问,但是现在估计很少了。

于是,找了一个不需要安全验证的 SMTP 服务器,它可以允许匿名访问来验证一下我的想法。

访问地址 - http://www.yopmail.com/en/ 无须注册,我用了两个测试用户名,一个是 biwork, 一个是 biworktest.

再看下在 Reporting Services 中的配置,发送人是 biwork@yopmail.com

由于这个邮箱只允许同域(邮箱后缀相同)的邮件发送,因此在 Subscription 中都是发送给 biworktest@yopmail.com 的。

这样配置完成后,订阅邮件就发送成功了!所以如果 SMTP 服务器支持匿名访问,那么这个配置是非常简单的。我们之前很多失败的尝试就是因为这个原因才不能成功,而这并不是因为我们的配置不正确造成的。

最后,为什么不问问在匿名访问中这个配置中应该不填还是填 2? 这个答案就留给大家去尝试了!

<SMTPAuthenticate>2</SMTPAuthenticate>

希望我上面的测试与分析对大家有所帮助!如果有误导的地方,欢迎指正,不求有功,但求无过!

 


更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。