这篇文章源于在上一篇博文中有园友提出订阅 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></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></SMTPAuthenticate>

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


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

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


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

  1. 微软BI 之SSRS 系列 - 解决Pie Chart 中控制标签外部显示与标签重叠的问题

    当 Pie Chart 页面标签过多的时候,往往数字标签内容挤做一团.我们要做的是:第一,让标签在饼图外部显示:第二,不让标签重叠. 一种做法是通过修改数字标签属性 - Series Label Pr ...

  2. 微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计

    来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?   SSRS 2008.2 ...

  3. 微软BI 之SSRS 系列 - 如何实现报表导航 Navigation 和钻取 Drill Down 的效果

    开篇介绍 如何在 SSRS 报表中实现标签导航 Navigation 和向下钻取 Drill Down的效果? 如同下面这个例子一样 - 在页面第一次加载的时候,默认显示是全部地区的销售总和情况,上面 ...

  4. 微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表

    之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型 ...

  5. 微软BI 之SSRS 系列 - 基于时间段参数的 MDX 查询以及时间日历 Date Picker 的时间类型参数化

    今天在天善问答里看到一个问题,如果我没有理解错的话,它应该是指比如在一个报表中选取一个时间段,然后求出这个时间段的某个 Measure 的 SUM 和.并且同时求出这两个时间点对应的上一年的时间点之间 ...

  6. 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

    开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...

  7. 微软BI 之SSRS 系列 - 使用 LookupSet 和 Adjacent Group 等高级技巧在报表中跨 Dataset 分组查询

    SSRS 报表中有一些高级的技巧,平常很少用到,下面我通过这个案例来展现一下如何在实际开发中使用它们,并且如何解决一些实际的需求. 这张报表分别统计了不同的 Product 产品在不同的月份的 Ord ...

  8. 微软BI 之SSRS 系列 - 如何让报表在一页显示,两种常用的技巧

    通常情况下,SSRS 报表在页面内容过多的时候会自动分页.但有的时候当页面内容不是很多,大概最多2页的情况下,或者客户要求所有内容必须在一页显示时,应该如何设置. 实际上,要考虑两种情况:第一种情况是 ...

  9. 微软BI 之SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表

    基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 ...

随机推荐

  1. Oracle数据库(一)

    Oracle 是一个数据库管理系统,是Oracle公司的核心产品.其在数据安全性与安整性控制方面的优越性能,以及跨操作系统.跨硬件平台的数据操作能力.基于“客户端/服务    器”(Client/Se ...

  2. SharePoint Online 创建资产库

    前言 本文介绍如何在Office 365中创建资产库库,以及资产库的一些基本设置. 正文 通过登录地址登录到Office 365的SharePoint Online站点中,我们可以在右上角的设置菜单中 ...

  3. SqlServer 还原数据库 代码实现

    RESTORE DATABASE TargetDB FROM DISK = 'D:\DataBase\DB.bak' with replace, MOVE 'DB' TO 'D:\DataBase\T ...

  4. 《Android编程权威指南》

    <Android编程权威指南> 基本信息 原书名:Android programming: the big nerd ranch guide 原出版社: Big Nerd Ranch Gu ...

  5. Java比较两个Date日期的大小

    import java.util.*; import java.text.ParseException; import java.text.SimpleDateFormat; class Test{ ...

  6. .NetCore中EFCore for MySql整理(二)

    一.简介 EF Core for MySql的官方版本MySql.Data.EntityFrameworkCore 目前正是版已经可用当前版本v6.10,对于以前的预览版参考:http://www.c ...

  7. 微服务中的 API 网关(API Gateway)

    API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需进行 ...

  8. iCOM组件(iComponent,应用或学习组件)

    iCOM(英文全称:i + component,应用或学习组件,或iCOM组件),为学习资源的一种表现形式,是面向不同类型的学习对象(某一知识点或某一类知识点,如词汇.句子)专门开发的.在外部可重用的 ...

  9. 排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

    今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. ...

  10. Maximum Submatrix & Largest Rectangle

    相关题型 问题一(最大和子矩阵) : 有一个 m x n 的矩阵,矩阵的元素可正可负.请找出该矩阵的一个子矩阵(方块),使得其所有元素之和在所有子矩阵中最大.(问题来源:http://acm.pku. ...