CE MAPI執行個體講解 — 如何擷取Inbox裡的所有訊息(一)

來源:互聯網
上載者:User
原文:http://blog.csdn.net/yzx0023/archive/2005/08/11/451491.aspx
      
第一次寫這玩意,感覺挺彆扭,不過想想以前遇到問題的時候,也從網路上得到過很多協助,同時在CSDN,也看到有些網友在問關於MAPI的問題,自
己雖然水平不怎麼樣,寫東西也爛,但是覺的有必要將自己這幾年積累的東西同大家分享一下,希望對大家能有些協助。我的寫作能力不怎麼樣,這點接下來看我的
文章就會有感覺,呵呵,所以我會盡量用代碼來表達我的意思,對於一些理論知識,我瞭解比較膚淺,有錯誤的地方,希望大家能夠指正,謝謝先! 
      對於MAPI的意義,用處我就不多說了,大家可以去MSDN上找一下,我的英語爛,免的誤導群眾。接下來的例子為了減少篇幅,我將略去所有錯誤處理,但是在平時的使用過程中,希望使用者能加上詳細的錯誤處理,這能使我們的程式更加健壯。
      來看第一個例子,如何擷取tmail(就是我們熟稱的收件匣程式)下各個Message Box下的訊息。
      第一步:初始化MAPI:
   //session變數,在停止使用MAPI前,請不要釋放它
  IMAPISession* m_pSession = NULL;   

  //COM初始化
  CoInitializeEx(NULL, COINIT_MULTITHREADED);  
  MAPIInitialize(NULL);
  MAPILogonEx(NULL, NULL, NULL, NULL, &m_pSession);
  

    退出MAPI
 if(m_pSession)
  {
  m_pSession->Logoff(0, 0, 0); 
   m_pSession->Release();
  m_pSession = NULL;
 }
  MAPIUninitialize();
  CoUninitialize();


      第二步:擷取message store,對於message
store,我認為它是管理message和folder的一個集合,它與收件匣下的各個帳戶想對應,每個帳戶對應有一個store,我們可以通過
session來遍曆所有message store,每個store都會有一個DISPLAY
NAME,通過它我們可以獲得指定的store,下面示範如何擷取SMS的Store:
  //IMAPITABLE,通過它我們可以訪問資料,比如拿Store,拿Folder,拿Message等,方法都類似,下面會有介紹
  LPMAPITABLE pTable  = NULL;
  ULONG lCount   = 0;
  HRESULT hr  = 0;
  LPSRowSet pRows  = NULL;
  IMsgStore* pMsgStore = NULL;
  //希望擷取多少屬性,這裡我們只需要獲得兩個屬性
  ULONG ulNumCols  = 2;
  //通過下面的定義,我們告訴系統,我們需要擷取以下兩個屬性,一個是Entry ID,通過它我們可以擷取Store對象,一個是Display Name,我們用它來比較是不是我們需要的Store
  SizedSPropTagArray(ulNumCols , Columns) =
  { 
   ulNumCols , 
   PR_ENTRYID, //Store的Entry ID
   PR_DISPLAY_NAME //Store的Display Name
  };

  pSession->GetMsgStoresTable(MAPI_UNICODE , &pTable);
  pTable->SetColumns((LPSPropTagArray)&Columns, 0);

  while(SUCCEEDED(pTable->QueryRows(1, 0, &pRows)))
  {

   if (NULL == pRows || pRows->cRows != 1)

   {

       break;

   }
   //開始一條條記錄查詢,pRows->aRow[0].lpProps[0]代表了第一個查詢屬性,即Entry ID,pRows->aRow[0].lpProps[1]則表示Display Name。
   if (_tcsicmp(pRows->aRow[0].lpProps[1].Value.lpszW, _T("SMS")) == 0)
   {
    ULONG ulMesageType;
    //如果是SMS,則擷取Store對象
    pSession->OpenEntry(pRows->aRow[0].lpProps[0].Value.bin.cb,
      (LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,
      NULL,
      MAPI_BEST_ACCESS,
      &ulMesageType,
      (LPUNKNOWN*)&pMsgStore);
    break;
   }
   
   FreeProws(pRows);
   pRows = NULL;
  }
  if(pRows)
  {
   FreeProws(pRows);
   pRows = NULL;
  }

 到此,就拿到了SMS的Message Store,累死了,休息一下,接下來讓我們繼續來擷取Folder。在這裡我先提醒一下,前面擷取的IMsgStore和後面要講的IMAPIFolder等對象,在不使用時候需要Release(),千萬別忘記。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.