outlook联系人无法获取SMTP地址,“交换”联系人列表中没有MAPI属性

时间:2013-08-21 10:04:02

标签: c# outlook exchange-server mapi exchange-server-2010

是Outlook中的错误吗?

我创建了一个本地联系人列表卡,我在地址栏中给了他一个交换用户地址。 (双击该地址,看看它的交换)。

当我尝试使用MAPI获取地址时 - 我不能,问题是这样,当我检查AddressEntry对象时,我得到以下内容:

  • Type =“EX”
  • 地址=“/ o = ... / ou = Exchange ...”/ cn =收件人/ cn =姓名
  • Class = olAddressEntry
  • AddressEntryUserType = olOutlookContactAddressEntry

当我在OutlookSpy中检查时 - 没有MAPI属性,所以我无法获得PR_SMTP_ADDRESS,也无法获得PR_EMS_AB_PROXY_ADDRESSES,这也不是SMTP所以我没有有效的地址。


我检查了其他用户,这些是属性(它的工作原理):

真实交换用户收件人,与交换用户一样的电子邮件地址,但它是在没有自动更正的情况下为交换用户创建的,因此它保持为smtp:

  • Type =“SMTP”
  • 地址=“Email@email.com”
  • Class = olAddressEntry
  • AddressEntryUserType = olExchangeUserAddressEntry

常规地址录入

  • Type =“EX”
  • 地址=“/ o = ... / ou = Exchange ...”/ cn =收件人/ cn =姓名
  • Class = olAddressEntry
  • AddressEntryUserType = olOutlookContactAddressEntry

如果我双击“交换”本地联系人,它会打开其属性的交换窗口,如果我打开“我手动创建的常规”,它会打开“SMTP”地址窗口。

我可以做的任何解决方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

它没有按计划工作" Dmitry Streblechenko"建议因为某些原因 ContactItem.Email1EntryId,ContactItem.Email2EntryId和ContactItem.Email3EntryId不包含id,但包含一些错误的随机数据(甚至是一些html标签) - office 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包装器 - 它在dispose上执行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";

希望能节省时间!我已经花了一天时间。

答案 1 :(得分:0)

如果您有EX类型的联系人,请使用ContactItem.Email1EntryId属性的值来调用Namespace,GetAddressEntryFromId,然后阅读AddressEntry.GetExchangeUser.PrimarySmtpAddress属性。