再談 Outlook 批次寄信

去年 DR 在 Outlook 批次寄信與 SharpDevelop 這篇文章裡,提到自己因為工作需要寫了一支程式,該程式的功能是可以根據 CSV 格式的名單自動產生信件給 Outlook(或者 Outlook Express 和 Windows Live Mail)寄送。當這支程式完成後,DR 有很長的一段時間沒有再對程式碼做大幅度的更新,僅有針對特定需求略做客製化的修改。

 

直到最近,DR 再度涉及到大量信件寄送的業務,回頭再去操作當初自己寫的程式時,也許是因為操作思維的轉變,發覺這東西真是不太好用,很多地方現在都覺得礙手礙腳的,於是便打算將這支程式整個重寫過。然而事過境遷,不只是操作喜好改變,在程式架構上的評估也產生了一些轉變。

 

當初選擇用 VB.NET 來寫主要是基於兩點考量:其一是認為 Python 程式發佈比較麻煩,因為當時 DR 對於 Python 的執行檔打包工具只知道 py2exe,過了一段時間才知道其實有相對好用很多的 PyInstaller。 其二則是認為使用 VB.NET 有較高的機會可將程式碼交給他人維護(很多人都學過 VB 吧),但只能說這個考量和目前公司的現狀不符,因此 DR 還是改回用個人比較喜歡的 Python。

 

呃,所以這支程式一開始的雛型是用 Python,後來再改成 VB.NET,最後又改回用 Python……

 

這次的重寫除了在許多操作環節增加便利性外,還有一項改動是放棄使用 MAPI(Messaging Application Programming Interface),直接呼叫 Outlook。其實當初 DR 就有寫一支不用 MAPI 的版本,但因為不用 MAPI 就無法支援 Outlook Express,所以並沒有把這個版本當作最終發佈的版本。

 

儘管 Outlook Express 仍是公司大多數人員所使用的郵件軟體,但這次的重寫是針對 DR 個人的需求(DR 在公司用的是 Outlook),而 DR 對於 MAPI 不支援 HTML 格式的信件內文實在不甚滿意,所以決定新版本不再使用 MAPI。從另一方面來說,也許藉由這支新版本的發佈,能夠增加同事更換郵件軟體的意願與動機。

 

對於程式碼或執行檔有興趣的人同樣可來信索取,Python 使用 Outlook 寄信的程式碼相當單純,基本上就如以下的程式碼節錄:

def sendOutlook(recipients, subject, body):
    pythoncom.CoInitialize()
    for recipient in recipients:
        outlookApp = Dispatch("Outlook.Application")
        outlookMsg = outlookApp.CreateItem(0)
        outlookMsg.Subject = subject
        outlookMsg.To = recipient.address
        outlookMsg.CC = recipient.cc
        outlookMsg.HTMLBody = body
        for path in recipient.attachment:
            outlookMsg.Attachments.Add(path)
        outlookMsg.Display(True)

 

Display() 指的是顯示信件而不直接寄出,適用於信件內容的確認,若改為 Send() 則是直接寄出。

 

雖然這支程式符合 DR 當前的工作需求,但 DR 總還是不太喜歡這種僅限於 Windows 平台、而非跨平台的方案,所以下一步也許會試著做出 Mozilla Thunderbird 的擴充套件吧。不過這東西顯然不急,並且其實已經有相同作用的套件了(Mail Merge)。

 

分類: