Невозможно привести объект COM - Microsoft Outlook & C # - PullRequest
14 голосов
/ 11 января 2011

Я написал этот код для просмотра непрочитанных элементов в моем почтовом ящике 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)). "

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

Ответы [ 4 ]

23 голосов
/ 11 января 2011

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

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

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

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

6 голосов
/ 11 января 2011

попытайтесь проверить правильность элемента 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());
    }
}
4 голосов
/ 11 января 2011

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

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

0 голосов
/ 26 октября 2018

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

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