2013-04-10 1 views
0

Мне нужно написать небольшое приложение C#, которое использует глобальную адресную книгу Outlook, чтобы найти пользователя Exchange с данного адреса электронной почты. Поиск пользователя Exchange по его имени прост, но как его найти по его первичному адресу smtp? Итерация по всему AddressList не является вариантом, так как она огромна (почти 400 тыс. Записей), это длится вечно. Есть ли лучший и быстрый способ?Найти пользователя Exchange через Primary Smtp Address

public Outlook.ExchangeUser GetAddressBookEntry(string senderName, string senderAddress) 
    { 
     //Get Outlook address book 
     Outlook.AddressList addressList = olNamespace.AddressLists["Globale Adressliste"]; 
     Outlook.AddressEntries addressEntries = addressList.AddressEntries; 

     Outlook.ExchangeUser exUser = null; 


     //Find corresponding entry in the address book 
     //This always returns something even if the SenderName is not in the Address Book 
     if (senderName != null) 
     { 
      Outlook.AddressEntry addressEntry = addressEntries[senderName]; 
      exUser = addressEntry.GetExchangeUser(); 
     } 

     //Check if contact is correct (see above for reason) 
     if (exUser != null && ((exUser.Name == senderName) || (exUser.PrimarySmtpAddress == senderAddress))) 
     { 
      return exUser; 
     } 

     //this loop takes a few minutes, it is not an option 
     //not checking the address not implemented 
     Debug.WriteLine("Count: " + addressEntries.Count); 

     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     for (int i = 1; i <= addressEntries.Count; i++) 
     { 
      Outlook.AddressEntry addressEntry = addressEntries[i]; 

      if (i % 1000 == 0) 
      { 
       Debug.WriteLine(i); 
      } 
     } 
     sw.Stop(); 
     Debug.WriteLine("Seconds: " + sw.Elapsed.TotalSeconds); 

     return null; 
    } 

ответ

3

Вызов Namespace.CreateRecipient, вызовите Recipient.Resolve, а затем использовать свойство Recipient.AddressEntry.

+0

Большое вам спасибо, я искал это какое-то время. Работает как шарм. – metacircle

+0

Привет, ваш путь работает для новых версий Outlook (я использую addin express). Но тот же метод дает ошибки в v.2003. Он отмечает Outlook.ExchangeUser и addressEntry.GetExchangeUser(); в красном. Пожалуйста, попросите меня решить это. Спасибо –

+0

В Outlook 2003 нет ExchangeEser obejkct и нет AddressEntry.PropertyAccessor для чтения исходных свойств MAPI. Использует ли Redemption вариант? –

Смежные вопросы