例如無法直接執行並操作如 Microsoft Outlook, Word, Excel 等跟作業系統綁的較緊的軟體,
如果真得要使用 Java 來操作,
則必須要使用例如 JNI 或 Java-COM Bridge 等技術 (例如 JACOB, Jawin 等)來實現。
Java Outlook Connector 是一個提供 Java 控制本地端 Outlook 的 Java Lib,
將底層的 JNO、 COM、MAPI 等複雜的實現進行了封裝,
不過只有試用版 (每次執行都會跳出建議購買的視窗) 及付費版。
這裡要介紹的是另一個方案, JACOB,
為一個免費的 Java-COM Bridge ,
這邊要演示的是使用 JACOB 這個 Java-COM Bridge 來操作 Outlook 的範例。
要注意的是,這裡只是直接操作電腦上的 Outlook 軟體,
並非使用 JavaMail 來連接 mail server,
所以並不需要進行登入連接等動作,
可以想成類似直接使用 VBscript 來控制 Outlook。
首先先去 JACOB 官網下載所需的 JAR 檔和 DLL 檔,
裡面有提供最新版放在 Sourceforge.net 上的檔案下載頁面連結,
下載完解壓縮後可以看到所需的 jacob.jar、jacob-1.19-x64.dll (或著是 32 位元,依執行環境自行選擇),也有附上 Javadoc 的說明文檔。
引入 jacob.jar、jacob-1.19-x64.dll (例如設定環境變數 path、或放到System32 資料夾下、或放到程式同目錄等,
可參考
source of com.jacob.com.LibraryLoader、
System.loadLibrary() 的使用方法彙總
) 後,
就可以開始撰寫程式。
範例程式碼如下,
其中讀取了 Outlook 的 INBOX 收件夾,
找出特定 Subject 的信,並將信上的附件檔存到本地資料夾。
參考:
System.loadLibrary() 的使用方法彙總
) 後,
就可以開始撰寫程式。
範例程式碼如下,
其中讀取了 Outlook 的 INBOX 收件夾,
找出特定 Subject 的信,並將信上的附件檔存到本地資料夾。
package outlookReaderTest;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
public class JacobTest {
public static void main(String[] args) {
// 指定 INBOX 收件夾,參考 https://docs.microsoft.com/zh-tw/office/vba/api/outlook.oldefaultfolders
int olFolderInbox = 6;
ActiveXComponent outlookApplication = new ActiveXComponent("Outlook.Application");
Dispatch outlookObject = outlookApplication.getObject();
Dispatch myNamespace = Dispatch.call(outlookObject, "GetNamespace","MAPI").toDispatch();
Dispatch myFolder = Dispatch.call(myNamespace,"GetDefaultFolder", Integer.valueOf(olFolderInbox)).toDispatch();
Dispatch mails = Dispatch.get(myFolder, "Items").toDispatch();
/*
* 上述程式碼等同於 VBscript 的:
* Dim outlookObject, myNamespace, myFolder, mails
* Set outlookObject = CreateObject("Outlook.Application")
* Set myNamespace = outlookObject.GetNamespace("MAPI")
* Set myFolder = myNamespace.GetDefaultFolder(6)
* Set mails = myFolder.Items
* 下面的程式碼跟 VBscript 的對照可以此類推
*/
int count = Dispatch.call(mails, "Count").getInt();
System.out.println("Total Mail Count: " + count);
for (int i = 1; i <= count; i++)
{
Dispatch mail = Dispatch.call(mails, "Item", Integer.valueOf(i)).toDispatch();
String subject = Dispatch.call(mail, "Subject").getString();
if ("This is a test mail".equals(subject)) {
System.out.println(i);
System.out.println(subject);
String saveFolderPath = "D:\\tempTestFoler";
//Save attachments
Dispatch attachs = Dispatch.call(mail, "Attachments").toDispatch();
int attachCount = Dispatch.call(attachs, "Count").getInt();
System.out.println("attachCount: " + attachCount);
for (int j = 1; j <= attachCount; j++) {
Dispatch attach = Dispatch.call(attachs, "Item", Integer.valueOf(j)).toDispatch();
String attachName = Dispatch.call(attach, "FileName").getString();
Dispatch.call(attach, "SaveAsFile", saveFolderPath + "\\" + attachName);
System.out.println(attachName + " -- saved");
//Dispatch.call(mail, "Delete");
}
}
}
}
}
參考: