Невозможно преобразовать COM-объект - Microsoft Outlook и C #

Я написал этот код для просмотра непрочитанных элементов в моем почтовом ящике 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 я получаю эту ошибку:

«Невозможно преобразовать COM-объект типа 'System .__ ComObject' к типу интерфейса 'Microsoft.Office.Interop.Outlook.MailItem'. Эта операция завершилась неудачно из-за вызова QueryInterface компонента COM для интерфейса с IID '{00063034-0000- 0000-C000-000000000046} 'не удалось из-за следующей ошибки: Такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) ».

Не могли бы вы помочь мне решить эту ошибку?


person Zerotoinfinity    schedule 11.01.2011    source источник
comment
@Bolu Нет, это то, что я пишу в своем приложении для Windows на C #   -  person Zerotoinfinity    schedule 11.01.2011
comment
MAPIFolder устарел, используйте вместо него папку.   -  person Hans Passant    schedule 11.01.2011
comment
Удалось ли вам разобраться в этой проблеме?   -  person Anders Arpi    schedule 17.01.2011
comment
Эта ошибка связана с изменением версии Office. (это создает целое семейство проблем) Что нужно сделать, так это отредактировать некоторые файлы реестра, как описано здесь: stackoverflow.com/questions/12957595/   -  person YuriG    schedule 30.11.2014


Ответы (4)


Некоторое время назад мне приходилось решать что-то вроде вашей проблемы.

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

Надеюсь, это поможет.

Проблема здесь в том, что _explorer.CurrentFolder.Items может содержать больше объектов, чем просто MailItem (PostItem является одним из них).

person Anders Arpi    schedule 11.01.2011
comment
Я получаю ту же ошибку в следующей строке Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application (); - person Meer; 29.06.2016

попробуйте проверить, является ли элемент действительным 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());
    }
}
person Bolu    schedule 11.01.2011

Следующий код работал нормально, когда я его тестировал. Но я должен упомянуть, что я ссылался на «Библиотеку объектов 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 многие элементы имеют некоторые общие свойства (например, время истечения срока действия), поэтому вы можете в качестве безнадежного обходного пути использовать «динамический» тип данных - либо в качестве альтернативного сценария для неизвестных типов элементов, либо по умолчанию (пока поскольку вас устраивает удар по производительности).

person KBoek    schedule 11.01.2011
comment
Я попробовал то же самое и получил следующее сообщение: Невозможно преобразовать COM-объект типа «System .__ ComObject» к типу интерфейса «Microsoft.Office.Interop.Outlook.PostItem». Эта операция завершилась неудачно, потому что вызов QueryInterface для COM-компонента для интерфейса с IID «{00063024-0000-0000-C000-000000000046}» завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) . - person Zerotoinfinity; 11.01.2011
comment
Это сработало для меня с Outlook 2016 с последней версией Microsoft.Office.Interop.Outlook.dll - person Ben; 22.12.2017

Отлично! немного адаптировал решение, это сработало для меня

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>");
            }
        }
person Jeffrey DeMuth    schedule 26.10.2018
comment
Вы получаете доступ к OOM из службы (IIS)? Не делай этого. - person Dmitry Streblechenko; 26.10.2018