Outlook 批次寄信與 SharpDevelop

湯瑪斯.愛迪生(Thomas A. Edison)可說是公認的發明大師,不過如果要把他跟「程式設計」(computer programming)這個議題聯想在一塊,可能會覺得有點困難。沒關係,讓我們先思考一下到底「程式」是拿來幹嘛用的?嗯,基本上以最粗分的方式來說,不外乎就是三大項目:控制、呈現與自動化,控制是讓硬體得以被操控,呈現是將結果輸出給使用者,而自動化則是將重複性的工作轉變為批次處理。

 

那干愛迪生什麼事呢?這邊就要說一個故事了:話說愛迪生早年曾經在加拿大的多倫多擔任電報員,這個工作要求電報員必須在每個小時發出一封電報,用來查核電報員是否有確實堅守工作崗位。然而愛迪生卻認為這個要求太廢了,於是他發明一款自動發報機,可以在每個小時自動發出電報。不過正所謂夜路走多了,總會碰到鬼……有一天老闆來巡察,看到愛迪生正在睡覺,連同自動發報機也被老闆發現,這使得愛迪生差點丟掉工作(另有一說是他確實被開除了)。

 

所以,這則故事讓我們知道:愛迪生不只是發明大師,他還是自動化處理與偷雞摸狗(?)的先驅。

 

呃,回到正題,DR 會先談這則故事是因為自己最近也在處理一些極度重複性的工作,就是得用 Outlook 一次寄信給很多單位。而這項工作有一些要求以致於它不適合採用同一封信加入許多收件人的方式來處理,這些要求包含內文抬頭必須有所差異、不同的收件人可能得加入不同附件等等。一開始 DR 的確是手動用 Outlook 一封一封的寄,但寄到後來受不了了,索性就把之前寫的一支可呼叫 Outlook 寄信的 Python 程式雛型略作修改,從寫好的 CSV 檔裡自動代入抬頭、信箱位址、附件檔名等,然後程式一執行便會將設定好的信件內容一封封送去給 Outlook 寄,從頭到尾只要按確定就好了。

 

由於這項工作在 DR 所在的公司裡執行得非常密集,所以當 DR 的作法被發現後,便受指示要將程式散佈出去。然而就在 DR 嘗試撰寫使用手冊時,才寫不到一頁就覺得整個流程就某個角度來說真是不可理喻,內文光交代需安裝 Python,然後是 pywin32PySide,以及需注意 Python 的版本和 32bit、64bit 作業系統的差異等等……就覺得對終端使用者而言實在太麻煩了。雖然 DR 有想過將 Python 程式包成獨立的執行檔,但這支程式所需的函式庫比較難打包,也讓 DR 開始萌生出應該要將整個程式重寫成在 Windows 上可以直接使用的版本。

 

接著就把腦筋動到 .NET Framework 上,而程式語言的選擇是 VB,這是考量到日後協力維護的容易性。於是就這麼決定了,用 VB .NET 重寫吧。

 

方案決定後,DR 想起先前這台工作電腦(Pentium 4,1GB 的記憶體)跑 Visual Basic 2010 Express 的效率異常的差,所以想找找看其它的代替品,就找到了 SharpDevelop,使用後覺得效率的確有好一些,而且功能算是頗為完整,不會比微軟的 Express 版差。只不過 SharpDevelop 仍有一些明顯的小問題存在,例如 add reference 後卻沒有介面可以檢查或刪除已加入的 reference,只能靠人工編輯專案檔來解決,這很不像是一款已經發展好幾年的開發環境所應有的狀況……但無論如何,DR 仍決定繼續使用 SharpDevelop 來重寫這支 Outlook 批次寄信程式。

 

在程式內容的撰寫方面,因為考量到單位裡的使用者大部分是使用 Outlook Express 而非 Outlook(事實上 DR 是唯一一個用 Outlook 的…),所以使用 Office 函式庫呼叫 Outlook 寄信的寫法並不適合,至於單純用 SMTP 寄信的寫法也更不可能,因為這樣就沒有辦法做郵件的管理。因此最好的寫法其實是使用 MAPI(Messaging Application Programming Interface),這樣只要系統預設的 MAPI 客戶端是 Outlook Express 便是呼叫 Outlook Express、預設為 Outlook 便呼叫 Outlook。

 

MAPI 的程式碼撰寫主要是參考以下這兩個連結,例如 Class 都是直接抄裡頭的:

 

這支程式已經寫好了,對程式碼或成品有興趣的人可來信索取。雖然不將專為工作或案子撰寫的程式放在個人網站是 DR 的原則之一,但 DR 也沒有打算對其加諸版權限制,所以想要的就來信吧。

 

分類: