2013-08-21 54 views
1

這是Outlook中的錯誤嗎?outlook聯繫人無法獲取SMTP地址,「交換」聯繫人列表上沒有MAPI屬性

我創建了一個本地聯繫人名片卡,並且我在地址字段中給了他一個交換用戶地址。 (雙擊該地址,查看它的交換)。

當我嘗試使用MAPI來獲取地址 - 我不能,問題是這樣的,當我檢查AddressEntry對象,我得到如下:

  • TYPE =「EX」
  • 地址=「/o=.../ou=Exchange..."/cn=Recipients/cn=Name
  • 類= olAddressEntry
  • AddressEntryUserType = olOutlookContactAddressEntry

當我在OutlookSpy中檢查 - 沒有MAPI屬性,所以我無法獲得PR_SMTP_ADDRESS,也沒有PR_EMS_AB_PROXY_ADDRESSES,也,這不是SMTP,所以我沒有有效的地址。


我檢查了其他用戶,而這些都是性(它的工作原理):

真正交換用戶的收件人,相同的電子郵件地址作爲交換,但它不自動更正是爲了交換用戶,使其保持SMTP:

  • 類型= 「SMTP」
  • 地址= 「[email protected]
  • CLASS = olAddressEntry
  • AddressEntryUserType = olExchangeUserAddressEntry

定期地址條目

  • TYPE = 「EX」
  • 地址=「/o=.../ou=Exchange .. 。「/ cn = Recipients/cn = Name
  • Class = olAddressEntry
  • AddressEntryUserType = olOutlookContactAddress進入

如果我雙擊了「交流」地方接觸,它打開它的屬性交流的窗口,如果我打開「常規一段我手動創建」,它會打開「SMTP」地址窗口。

我可以做的任何解決方法?

謝謝。

+0

爲什麼不使用EWS? –

回答

0

如果您有EX類型聯繫人,請使用ContactItem.Email1EntryId屬性的值撥打Namespace,GetAddressEntryFromId,然後閱讀AddressEntry.GetExchangeUser.PrimarySmtpAddress屬性。

1

它沒有工作的方式「德米特里Streblechenko」建議,因爲某些原因 ContactItem.Email1EntryId,ContactItem.Email2EntryId和ContactItem。Email3EntryId包含未標識,但一些錯誤的隨機數據(甚至一些html標籤) - 2016年辦公

但最後用下面的代碼工作

using (var pa = new InteropWrapper<Outlook.PropertyAccessor>(contact.innerObject.PropertyAccessor)) 
      { 
       String EMAIL1_ENTRYID = "http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-C000-000000000046}/80850102"; 
       string emailEntryID = pa.innerObject.BinaryToString(pa.innerObject.GetProperty(EMAIL1_ENTRYID)); 

       using (var rs = new InteropWrapper<Outlook.NameSpace>(Globals.ThisAddIn.Application.Session)) 
       { 
        rs.innerObject.Logon(); 
        using (var addressEntry = new InteropWrapper<Outlook.AddressEntry>(rs.innerObject.GetAddressEntryFromID(emailEntryID))) 
        using (var exchangeUser = new InteropWrapper<Outlook.ExchangeUser>(addressEntry.innerObject.GetExchangeUser())) 
        { 
         return exchangeUser.innerObject.PrimarySmtpAddress; 
        } 
       } 
      } 

其中InteropWrapper<T>圍繞COM對象只是IDisposable的包裝 - 它Marshal.ReleaseComObject(innerObject)上處置。因此,您可以直接使用Marshal.ReleaseComObject()來完成所有操作。

以防萬一,如果有人需要2電子郵件和電子郵件3,包括他們在這裏

String EMAIL2_ENTRYID = "http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-C000-000000000046}/80950102"; 
String EMAIL3_ENTRYID = "http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-C000-000000000046}/80A50102"; 

希望這將節省時間某人!我花了一天的時間。

相關問題