2013-03-12 63 views
0

在搜索一小時後嘗試我的運氣。訪問多個Outlook帳戶的全局地址列表

假設您擁有兩個活動帳戶的Outlook 2010:[email protected][email protected]

你需要拉全局地址列表的[email protected]

  using Microsoft.Office.Interop.Outlook; 

      Application app = new Application(); 
      NameSpace ns = app.GetNamespace("MAPI"); 
      ns.Logon("", "", false, true); 

      AddressList GAL = ns.AddressLists["Global Address List"]; 

      foreach (AddressEntry oEntry in GAL.AddressEntries) 
      { 
       // do something 
      } 

這裏的問題是,GAL可以屬於任何一個帳戶,這不是明顯的,至少通過閱讀MSDN,如何你想知道你真的想使用哪個賬戶。

如果我們將經歷這樣,所有列表:

foreach (AddressList lst in ns.AddressLists) 
{ 
    Console.WriteLine("{0}, {1}", lst.Name, lst.Index); 
} 

我們可以看到,有兩個項目名爲「全球地址列表」,命名爲「聯繫人」等不同的指標兩個條目,但它的仍不清楚哪一個屬於哪個帳戶。

對於文件夾,它的完成相當不錯,因爲你可以使用結構類似:

ns.Folders["[email protected]"].Folders["Inbox"]; 

,但我無法找出類似的機制AddressLists。

任何幫助表示讚賞。

謝謝。

+0

請問這個例子幫助:http://msdn.microsoft.com/en-us/library/ff184631.aspx – 2013-03-12 20:00:04

+0

它可以幫助如果我能在納秒項目獲取商店.Accounts,所以我可以使用它來匹配AddressList上的PR_EMSMDB_SECTION_UID。帳戶可以有多個商店,是不是? – ilgor 2013-03-12 21:02:13

+0

Dmitry也有關於使用C++/Delphi的答案,他已經刪除了它,但是我想知道如何在C#.NET上做到這一點,如果可能的話。 – ilgor 2013-03-12 21:03:24

回答

0

我使用Account.CurrentUser UID和匹配的AddressList UID來選擇正確的列表。 我不知道如果使用Store是一種更好的方法,但是這個工作很好。

理查德和德米特里感謝您的幫助。

另外德米特里我想感謝您維護互聯網上可用的所有MAPI標籤的唯一來源。

代碼:

using Microsoft.Office.Interop.Outlook; 

const string PR_EMSMDB_SECTION_UID = "http://schemas.microsoft.com/mapi/proptag/0x3D150102"; 

Application app = new Application(); 
NameSpace ns = app.GetNamespace("MAPI"); 
ns.Logon("", "", false, true); 

string accountName = "[email protected]"; 
string accountUID = null; 

// Get UID for specified account name 
foreach (Account acc in ns.Accounts) 
{ 
    if (String.Compare(acc.DisplayName, accountName, true) == 0) 
    { 
     PropertyAccessor oPAUser = acc.CurrentUser.PropertyAccessor; 
     accountUID = oPAUser.BinaryToString(oPAUser.GetProperty(PR_EMSMDB_SECTION_UID)); 
     break; 
    } 
} 

// Select GAL with matched UID 
foreach (AddressList GAL in ns.AddressLists) 
{ 
    if (GAL.Name == "Global Address List") 
    { 
     PropertyAccessor oPAAddrList = GAL.PropertyAccessor; 
     if (accountUID == oPAAddrList.BinaryToString(oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID))) 
     { 
      foreach (AddressEntry oEntry in GAL.AddressEntries) 
      { 
       // do something 
      } 
      break; 
     } 
    } 
} 
0

來自不同服務器的GAL需要使用配置文件(IProfAdmin)和賬戶管理API(IOlkAccountManager)與相應的商店和賬戶相關聯。這些接口只能用C++或Delphi訪問。 您將需要從兩個商店(IMsgSTore)和地址簿對象(IABContainer)中讀取PR_EMSMDB_SECTION_UID。如果您需要將其與一個帳戶進行匹配,那麼在IOlkAccount對象的PROP_MAPI_EMSMDB_SECTION_UID(0x20070102)屬性中可以使用相同的值 - 如果您單擊IOlkAccountManager按鈕並雙擊一個Exchange帳戶,則可以在OutlookSpy中看到它。

如果使用Redemption是一個選項,你可以使用RDOExchangeAccount對象,它公開GAL,AllAddressLists,PrimaryStore,PublicFolders等特性。

相關問題