【问题标题】:outlook contact can't get SMTP address, No MAPI properties on "exchange" contact listOutlook 联系人无法获取 SMTP 地址,“交换”联系人列表中没有 MAPI 属性
【发布时间】:2023-03-19 15:30:01
【问题描述】:

这是 Outlook 中的错误吗?

我创建了一个本地联系人列表卡片,并在地址字段中为他提供了一个交换用户地址。 (双击该地址,查看其交换)。

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

  • 类型 = “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@email.com"
  • 类 = olAddressEntry
  • AddressEntryUserType = olExchangeUserAddressEntry

常规地址输入

  • 类型 = “EX”
  • 地址 = "/o=.../ou=Exchange..."/cn=Recipients/cn=Name
  • 类 = olAddressEntry
  • AddressEntryUserType = olOutlookContactAddressEntry

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

我能做些什么解决方法?

谢谢。

【问题讨论】:

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


    【解决方案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&lt;T&gt; 只是 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";
    

    希望它能节省一些人的时间!我花了一天的时间。

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2017-06-22
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多