2009年04月15日

Openchange/libmapi API 用例

在 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開發工具補遺


初始化

  1. 配置記憶體資源。透過 talloc library 管理記憶體。
  2. 配置會期資源,並開啟指定的帳號簡介資料檔。
  3. 使用者登入。
  4. 建構預設的回傳訊息封包。

開啟信箱資料夾或指定功能的預設資料夾: 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 則是一個集大成的範例,極具實用性。


Posted by shirock at 樂多Roodo! │13:09 │回應(0)引用(0)C/C++
樂多分類:學術/學習 工具:編輯本文
標籤:Exchange,MAPI,Openchange
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/8722399