Вопрос

Я написал этот код для просмотра непрочитанных элементов в My Outlook Mail Mail, а вот код:

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

Но на петле FORACH я получаю эту ошибку:

«Невозможно изменить объект системы типа .__ ComObject» в тип интерфейса «Microsoft.Office.interop.Outlook.mailitem». Эта операция не удалась, потому что вызов QueryInterFace на COM-компонент для интерфейса с IID '{00063034-0000- 0000-C000-00000000000046} 'Не удалось из-за следующей ошибки: такого интерфейса не поддерживается (исключение из HResult: 0x80004002 (e_nointerface)). "

Можете ли вы помочь мне, как разрешить эту ошибку?

Это было полезно?

Решение

Я должен был обойти что-то вроде вашей проблемы назад.

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

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

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

Другие советы

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

Следующий код работал нормально, когда я проверил его. Но я должен упомянуть, что моя ссылка была на «Библиотеку объектов Microsoft Outlook 14.0». Вы служите, чтобы использовать другую версию?

 Общественный класс Outlook {Readly Microsoft.office.interop.Outlook.items _ TiTems; Readly Microsoft.Office.interop.Outlook.Nameax _ns; Readly Microsoft.Office.interop.Outlook.mapifolder _inbox; Readly Microsoft.Office.interop.Outlook.Application _Application = новый Microsoft.Office.interop.Outlook.Application (); Общественный прогноз () {_ns = _Application.Session; _inbox = _ns.getddefaultfolder (Microsoft.Office.interop.Outlook.oldefaultFolders.Olkolderinbox); _TEMS = _INBOX.ITEMS; foreach (vart in _ _ _ _ {строковой тема = string.empty; var mail = товар как microsoft.office.interop.Outlook.mailitem; if (mail! = null) var public = mail.subject; остальное Debug.Writeline («Пункт не является почтеном»); }}}

Обратите внимание, что в Outlook многие элементы имеют некоторые общие свойства (например, время истечения срока), так что вы можете, как отчаянный обходной путь, используйте «динамический» тип данных - либо в качестве сценария «Dynamic» для неизвестных типов элементов или по умолчанию (как долго Как у вас все в порядке с достижением производительности).

Ницца! Адаптировал решение немного, это хорошо сработало для меня

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>");
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top