25

我编写了这段代码来查看 Outlook 邮箱中的未读项目,代码如下:

 Microsoft.Office.Interop.Outlook.Application app;
 Microsoft.Office.Interop.Outlook.Items items; 
 Microsoft.Office.Interop.Outlook.NameSpace ns; 
 Microsoft.Office.Interop.Outlook.MAPIFolder inbox;

 Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application();
        app = application;
        ns =  application.Session;
        inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        items = inbox.Items;
        foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
        {
            if (mail.UnRead == true)
            {
                MessageBox.Show(mail.Subject.ToString());
            }
        }

但是在 foreach 循环中我收到了这个错误:

“无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“Microsoft.Office.Interop.Outlook.MailItem”。此操作失败,因为对具有 IID 的接口的 COM 组件的 QueryInterface 调用“{00063034-0000- 0000-C000-000000000046}' 由于以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE))。”

你能帮我解决这个错误吗?

4

4 回答 4

29

不久前,我不得不解决类似您的问题的问题。

        foreach (Object _obj in _explorer.CurrentFolder.Items)
        {
            if (_obj is MailItem)
            {
                 MyMailHandler((MailItem)_obj);
            }
        }

希望有帮助。

这里的问题是它_explorer.CurrentFolder.Items可以包含更多的对象,而不仅仅是MailItemPostItem作为其中之一)。

于 2011-01-11T10:29:21.970 回答
9

mailitem在检查其属性之前尝试检查该项目是否有效:

foreach (Object mail in items)
{
    if ((mail as Outlook.MailItem)!=null && (mail as Outlook.MailItem).UnRead == true)
    {
        MessageBox.Show((mail as Outlook.MailItem).Subject.ToString());
    }
}
于 2011-01-11T10:30:07.540 回答
5

以下代码在我测试时运行良好。但我必须提到,我的参考是“Microsoft Outlook 14.0 Object Library”。你碰巧使用另一个版本吗?

    公开课展望
    {
    只读 Microsoft.Office.Interop.Outlook.Items _items;
    只读 Microsoft.Office.Interop.Outlook.NameSpace _ns;
    只读 Microsoft.Office.Interop.Outlook.MAPIFolder _inbox;
    只读 Microsoft.Office.Interop.Outlook.Application _application = new Microsoft.Office.Interop.Outlook.Application();

    公共展望()
    {
        _ns = _application.Session;
        _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        _items = _inbox.Items;

        foreach(_items 中的变量项)
        {
            字符串主题=字符串。空;
            var mail = 作为 Microsoft.Office.Interop.Outlook.MailItem 的项目;
            如果(邮件!= null)
                var 主题 = 邮件。主题;
            别的
                Debug.WriteLine("Item 不是 MailItem");
        }
    }
    }

请注意,在 Outlook 中,许多项目都有一些共同的属性(例如过期时间),因此作为一种绝望的解决方法,您可以使用“动态”数据类型 - 作为未知项目类型的后备方案或作为您的默认值(只要因为你对性能的影响很好)。

于 2011-01-11T10:10:04.490 回答
1

好的!稍微调整了解决方案,这对我来说效果很好

foreach (dynamic item in mailItems)
        {
            if (item is MailItem)
            {
                Response.Write("Sender: ");
                Response.Write(item.SenderEmailAddress);
                Response.Write(" - To:");
                Response.Write(item.To);
                Response.Write("<br>");
            }
        }
于 2018-10-26T18:13:51.587 回答