无法转换COM对象 - Microsoft Outlook& C#

时间:2011-01-11 10:00:08

标签: c# outlook c#-2.0 office-interop outlook-2003

我已编写此代码以查看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'。此操作失败,因为QueryInterface调用COM组件上的IID为{00063034的接口-0000-0000-C000-000000000046}由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))。“

您能帮我解决一下这个错误吗?

4 个答案:

答案 0 :(得分:23)

我不得不在一段时间内解决你的问题。

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

希望有所帮助。

此处的问题是_explorer.CurrentFolder.Items可以包含的对象多于MailItemPostItem是其中之一)。

答案 1 :(得分:6)

在检查项目属性之前,尝试检查项目是否有效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());
    }
}

答案 2 :(得分:4)

以下代码在我测试时运行正常。但我必须提到我的参考是“Microsoft Outlook 14.0对象库”。你碰巧使用另一个版本吗?

    public class Outlook
    {
    readonly Microsoft.Office.Interop.Outlook.Items       _items;
    readonly Microsoft.Office.Interop.Outlook.NameSpace   _ns;
    readonly Microsoft.Office.Interop.Outlook.MAPIFolder  _inbox;
    readonly Microsoft.Office.Interop.Outlook.Application _application = new Microsoft.Office.Interop.Outlook.Application(); 

    public Outlook()
    {
        _ns    = _application.Session;
        _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        _items = _inbox.Items;

        foreach (var item in _items)
        {
            string subject= string.Empty;
            var mail    = item as Microsoft.Office.Interop.Outlook.MailItem;
            if (mail    != null)
                var subject = mail.Subject;
            else
                Debug.WriteLine("Item is not a MailItem");
        }
    }
    }

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

答案 3 :(得分:0)

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

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>");
            }
        }