工作上的電子郵件往來有些時候是很制式化的,意即可能會有相當固定的回覆內容或者是相同的處理方式。而對於這類千篇一律的流程,就不免會讓人思考是否有更自動化的作法,比方說讓郵件編輯器預先根據特定條件來產生回覆內容、或是預先代入特定的轉寄對象。如此一來,使用者就不用再花時間打字或是進行選取的動作,不僅能夠更快的將郵件寄出,甚至還能避免一些人為錯誤。
以 Mozilla Thunderbird 郵件軟體來說,可行的作法就是自行撰寫 JavaScript 程式,然後包成擴充套件安裝到 Thunderbird 裡。而 DR 製作了一個範例擴充套件:conditional_message,該套件所處理的應用情境如下:
- 當接收到的郵件主旨含有「ABC」時,代表是來自「ABC」單位的郵件。
- 對該單位經常性往來的人員給予簡單回覆。
- 然後將郵件轉寄給固定的人員進行後續處理。
以下 DR 會簡要說明程式的架構,首先是 composeOverlay.xul 這支檔案,由於這個擴充套件並沒有任何自訂介面的部份,所以該檔案的作用僅是為了執行 compose.js。compose.js 的運作原理是監聽 Thunderbird 的郵件編輯器(Composer)並在其啟動後插入自訂的程式碼、也就是 compose.automatic():
var customStateListener = { init: function(event){ gMsgCompose.RegisterStateListener(customStateListener); }, NotifyComposeBodyReady: function() { compose.automatic(); } }; var compose = { automatic: function(event) { //Do something. } }; window.addEventListener("compose-window-init", customStateListener.init, true);
在進一步說明 compose.automatic() 的內容之前,compose.js 的最開頭有宣告一組陣列形式的名單,代表經常性往來的人員,其目的是當特定項目與該名單符合時就能夠將來源郵件的寄件者名字自動代入到內文中:
var people = ["Ripley", "Dallas", "Kane", "Ash", "Lambert", "Parker", "Brett"];
接著來到 compose.automatic(),這裡先分別取得郵件主旨(subject)的值和編輯器(editor)物件來進行條件判斷並預備後續的內文處理:
var subject = document.getElementById("msgSubject").value; var editor = gMsgCompose.editor; if (subject.indexOf("ABC") != -1) { //Do something. }
編輯類型為「回覆」時產生簡單的回覆內容並嘗試加上收件者的名字(如果符合名單的比對結果):
if (gMsgCompose.type == 2 || gMsgCompose.type == 6) { var name = ""; for (var i = 0; i < people.length; i++) { if (gMsgCompose.compFields.to.toLowerCase().indexOf(people[i].toLowerCase()) != -1) { name = people[i]; break; } } editor.insertHTML("Hi " + name + ",<br><br>" + "I got your message.<br><br>"); }
至於編輯類型為「轉寄」時則代入特定的收件者與副本收件者,這段程式碼也包含了從往來的郵件內文中進行名單比對的功能。此外由於 DR 平常還有在 Thunderbird 上使用 MRC Compose 這個擴充套件,所以程式碼是設計成可同時相容於有安裝跟沒有安裝 MRC Compose 的環境:
else if (gMsgCompose.type == 4) { //For "MRC Compose" extension: if (document.getElementById("msgTO") != null && document.getElementById("msgCC") != null) { document.getElementById("msgTO").value = "Jack Torrance <jack_torrance@test.org>,"; document.getElementById("msgCC").value = "Norman Stansfield <norman_stansfield@test.org>,"; onRecipientsChanged(true); } //Default: else { awAddRecipient("addr_to", "Jack Torrance <jack_torrance@test.org>"); awAddRecipient("addr_cc", "Norman Stansfield <norman_stansfield@test.org>"); } var body = editor.outputToString("text/plain", 2); var name = ""; for (var i = 0; i < people.length; i++) { if (body.indexOf(people[i]) != -1) { name = people[i]; break; } } editor.insertHTML("Hi Jack and Norman,<br><br>Please take a look at this request from " + name + ".<br><br>"); }
將以上的程式碼載入到 Thunderbird 後,在進行回覆或是轉寄動作時便會根據相關的條件判斷預先代入所需的內容。