在 libmapi 中,主要的封包結構是 mapi_object_t
。使用 mapi_object_init()
建構內容。
主要的函數回傳值是 enum MAPISTATUS
,並以 MAPI_E_SUCCESS
表示成功執行。
通常在呼叫 libmapi API 後使用 if (retval != MAPI_E_SUCCESS) return false;
判斷程式流程。
就設計架構而言, libmapi 運作時會管理記憶體資源。使用 MAPIFreeBuffer(), mapi_object_release()
便可釋放閒置的記憶體空間。
但就我實測結果顯示,它目前存有 memory lack 問題。以擷取連絡人清單為例,在擁有 256MB 實際記憶體與 384MB Swap 空間的 GNU/Linux 系統上,
大約在擷取200筆訊息後,就會因為記憶體不足而被系統中止程序。
openchangeclient -p rock --fetch-items=contact
這是目前使用 libmapi 開發大型客戶軟體時必須注意之處。其他Bug可以參考 Openchange開發工具補遺。
初始化
-
配置記憶體資源。透過 talloc library 管理記憶體。
-
配置會期資源,並開啟指定的帳號簡介資料檔。
-
使用者登入。
-
建構預設的回傳訊息封包。
開啟信箱資料夾或指定功能的預設資料夾: Mailbox
取得訊息 (Message) 的屬性內容
在 Exchange 中,包含電子郵件、行事曆、連絡人等等各類文件,都被視為「訊息(message)」,訊息的內容則歸屬於「訊息屬性(message property)」。
故要取得訊息內容時,就要以 GetProps(), GetPropsAll()
等取得指定的屬性清單。再以 get_SPropValue()
自屬性清單中取得指定的屬性值。
取得資料夾或階層式個體的屬性內容
以 QueryRows() 或 SeekRow()
讀取項目的屬性內容。以 find_SPropValue_data()
讀取 SRow_t aRow 結構的內容。
輸出屬性值
可參考 libmapi/mapidump.c 的程式碼。
Openchange官方範例: examples@Openchange.
而 libmapi/openchangeclient.c 則是一個集大成的範例,極具實用性。
樂多舊網址: http://blog.roodo.com/rocksaying/archives/8722399.html