Unable to cast COM object - Microsoft outlook & C#


I have written this code to view the unread items in my outlook mail box and here is the code:

 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)

but on the foreach loop I am getting this error:

"Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Outlook.MailItem'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00063034-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."

Can you please assist me how to resolve this error?

asked on Stack Overflow Jan 11, 2011 by Zerotoinfinity • edited Sep 18, 2012 by SliverNinja - MSFT

4 Answers


I had to get around something like your problem a while back.

        foreach (Object _obj in _explorer.CurrentFolder.Items)
            if (_obj is MailItem)

Hope that helps.

The issue here is that _explorer.CurrentFolder.Items can contain more objects than just MailItem (PostItem being one of them).

answered on Stack Overflow Jan 11, 2011 by Anders Arpi • edited Aug 19, 2015 by Anders Arpi

try to check the item is a valid mailitem before checking its properties :

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());
answered on Stack Overflow Jan 11, 2011 by Bolu

The following code worked fine when I tested it. But I must mention that my reference was to "Microsoft Outlook 14.0 Object Library". Do you happen to use another version?

    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;
                Debug.WriteLine("Item is not a MailItem");

Please note that in Outlook, many items have some common properties (e.g. expiration time), so you can, as a desperate workaround, use a "dynamic" datatype - either as a fallback scenario for unknown item types or as your default (as long as you're fine with the performance hit).

answered on Stack Overflow Jan 11, 2011 by KBoek • edited Nov 4, 2015 by Community

Nice! adapted the solution a bit, this worked well for me

foreach (dynamic item in mailItems)
            if (item is MailItem)
                Response.Write("Sender: ");
                Response.Write(" - To:");
answered on Stack Overflow Oct 26, 2018 by Jeffrey DeMuth

User contributions licensed under CC BY-SA 3.0