天天看點

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

大多數情況下我們的 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 的使用其實非常的簡單,配置的步驟也并不多,但是在使用它的時候有幾個限制:

隻能發送普通的文本格式的郵件,也就是說不支援 HTML 格式的郵件。

連接配接 SMTP Server 時不支援使用者填寫使用者名和密碼,也就是說使用者要麼在域環境下 SMTP Server 對使用者進行 Windows 方式驗證,要麼就是通路的 SMTP Server 支援匿名通路,不需要提供使用者名和密碼。

SMTP Server 的端口号使用預設的,也就是說如果在域中的 SMTP Server 端口号不是預設的話 Send Mail Task 就無法使用了。 

建立一個包并首先建立一個 SMTP 連接配接 - New Connection。

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

選擇 SMTP 連接配接管理器。

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件
微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

是以說,如果想要在 SMTP Connection 裡自己動手配置使用者名和密碼是不可能的,那麼像這種 163,126等等很多很多郵箱直接通過 SMTP Connection 是肯定無法完成發送郵件操作的。

看下圖時一定要了解一點:幾乎每一個 SSIS 控件的屬性都是可配置的,也是可擷取的,這是我們在 SSIS ETL 的學習過程中解決很多很多問題的最關鍵的地方!

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

建立一些常用的變量,發件人,收件人,抄送,郵件标題,内容,附件位址,還有使用者名和密碼等。

PS:關于這個密碼有一個故事,以前在公司裡有一個管機房管電腦的同僚,他的網絡下載下傳速度最快也沒人管,他的電腦裡有各種遊戲,高清藍光和 1024。每次大家夥要點東西像擠牙膏似的,大家都在想辦法搞他的密碼,直到後來大家有意無意記了并試出了密碼 - 大概就是 lowformat1MBD!! 類似于這樣的!看了密碼之後我們都一緻認為這個密碼确實很符合他的職業,不過貌似苦大仇深啊!

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

其中 PV_CONTENT 變量描述的是郵件發送的 HTML 格式的内容,注意是字元串類型的是以需要雙引号。

系統變量的資訊也通過表達式嵌入到郵件正文中。

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

編輯 Script Task 并引入這些變量,Script Task 中的代碼 -

Main 中的代碼包括處理優先級,多個收件人的處理,使用者名和密碼,添加附件的方式等等。

儲存并執行 SSIS 包,執行成功!

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

優先級别,标題,發送人等資訊 -

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

附件資訊和内容都可以看的到,包括在抄送欄中抄送給了自己,Package Start Time 的時間是來自虛機的時間,我虛機的時間還是 28日,這個是正确的 -

微軟BI 之SSIS 系列 - 使用 Script Task 通路非 Windows 驗證下的 SMTP 伺服器發送郵件

從中可以看出,雖然在 SSIS 中提供了 SMTP 的連接配接方式,但是實際上它還是預設隻允許通過 Windows 驗證或者匿名通路的方式來通路。但是我們通過 Script Task 在 Script 中關聯到了 SMTP 伺服器,并同時寫入使用者名和密碼,這樣就實作了在 SSIS 中通路非域環境下第三方的 SMTP 伺服器并通過身份驗證且發送郵件的效果。

當然,這種方式在實際項目中可能用的并不是很多,因為項目中的郵件肯定是通過域驗證的方式去通路更安全一些,畢竟系統資訊的傳遞隻能限制在域中。

在項目中使用郵件通知如是 Windows 驗證的方式,有這幾個點需要注意:

在開發與測試過程中,手動執行 SSIS Package 的這個使用者要有域中發送郵件的權限,能夠通過 Windows 驗證。

當包部署到 SQL Agent Job 中後,執行 SQL Agent Job 的賬号要有域發送郵件的權限,也必須能通過 Windows 驗證。

如果不需要部署到 SQL Agent Job,那麼就直接使用 Send Mail Task 通過 Windows 驗證也可以直接發送錯誤消息提醒。

在這個例子中的代碼是不是一定要像這樣去通路 SMTP Server 的連接配接資訊,感覺是不是多此一舉? - 可以不用這樣通路,其實很多 SMTP 的配置資訊最為友善的是配置成變量,通過變量傳遞給 Script Task 就可以了。這裡通過這樣的一種方式來表示在 Script Task 中如何擷取連接配接管理器的屬性資訊的,因為很多時候我們隻知道如何去擷取變量資訊,這一點展現了 C# Script 的靈活性,我們在 Script 中可以做非常多的事情。包括這些通路 SMTP Server 如何使用 smtpClient 發送郵件的代碼可以在網上找到現成的很多很多示例,而我們要做的事情就是大膽的靈活運用它們來解決我們的問題。

<a href="http://www.cnblogs.com/biwork/p/3258728.html" target="_blank">微軟BI 之SSRS 系列 - 報表郵件訂閱中 SMTP 伺服器匿名通路與 Windows驗證, 以及如何成功訂閱報表的執行個體</a>