這篇文章源於在上一篇博文中有園友提出訂閱 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 博客推薦欄中快速看到這些文章。