从.OST文件Office 2010/2013访问联系人

本文关键字:2013 访问 联系人 2010 OST 文件 Office | 更新日期: 2023-09-27 18:30:04

让我在前言中说,我不使用office COM对象,通常会像瘟疫一样避免它。我也知道这个问题在访问.pst文件方面已经被打得死去活来了,但是经过一个小时的谷歌搜索,我还没有找到关于.ost.的更多信息

我正在尝试更新现有应用程序中的一个方法,该应用程序正在访问.pst文件,并检索要在自动填充实现中使用的联系人姓名和电子邮件列表。我们最近从直接IMAP改为主机电子邮件服务器,改为Microsoft Exchange,从.pst改为.ost文件

这是一种方法:

    var arrName = new List<string>();
    var arrEmail = new List<string>();
    try
    {
        var outlookApplication = new ApplicationClass();
        NameSpace mapiNamespace = outlookApplication.GetNamespace("MAPI");
        MAPIFolder contacts = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
         for (int i = 1; i < contacts.Items.Count + 1; i++)
         {
             var contact = (ContactItem) contacts.Items[i];
             arrName.Add(contact.FullName);
             arrEmail.Add(contact.Email1Address);
         }
            Global.ConName = arrName.ToArray();
          Global.ConEmail = arrEmail.ToArray();
        }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.ToString());
        //Error Logging
    }

调用时抛出以下错误:

System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to 
interface type 'Microsoft.Office.Interop.Outlook.ContactItem'. 
This operation failed because the QueryInterface call on the COM 
component for the interface with IID '{00063021-0000-0000-C000-000000000046}' 
failed due to the following error: 
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
at OPUSfin.LoginMain.GetEmailContactsFromOutlook() in PATH:line 81

有人能为我指明正确的方向,告诉我如何修改它以与Exchange实现一起工作吗?

谢谢

参考:访问Outlook ost文件问题

从.OST文件Office 2010/2013访问联系人

除了您的代码所期望的ContactItem之外,您还可以拥有DistListItem对象。

使用"as"操作符检查您是否真的有ContactItem对象。您可能还想在进入循环之前缓存Items集合:

Items items = contacts.Items;
for (int i = 1; i <= items.Count; i++)
{
    ContactItem contact = items[i] as ContactItem;
    if (contact !=null)
    {
       ...
    }
}