2013-08-21 50 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"; 

希望这将节省时间某人!我花了一天的时间。

相关问题