Domanda

ho scritto questo codice per visualizzare gli elementi non letti nella mia casella di posta di Outlook e qui è il codice:

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

, ma il ciclo foreach sto ottenendo questo errore:

  

"Impossibile oggetto getto COM di tipo 'sistema di .__ ComObject' al tipo di interfaccia 'Microsoft.Office.Interop.Outlook.MailItem'. Questa operazione non è riuscita perché la chiamata QueryInterface sul componente COM per l'interfaccia con IID '{00.063.034 -0000-0000-C000-000000000046}' non riuscita a causa del seguente errore: interfaccia non supportata (Eccezione da HRESULT: 0x80004002 (E_NOINTERFACE)) ".

Potete per favore aiutarmi come risolvere questo errore?

È stato utile?

Soluzione

ho dovuto andare in giro qualcosa come il problema un po 'indietro.

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

La speranza che aiuta.

Il problema qui è che _explorer.CurrentFolder.Items può contenere più oggetti che solo MailItem (PostItem essere uno di loro).

Altri suggerimenti

provare a controllare la voce è un mailitem valida prima di controllare le sue proprietà:

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

Il seguente codice ha funzionato bene quando ho provato. Ma devo dire che il mio riferimento è stato quello di "Microsoft Outlook 14.0 Object Library". Ti capita di usare un'altra versione?

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

Si prega di notare che in Outlook, molti articoli hanno alcune proprietà comuni (ad esempio, tempo di scadenza), in modo da poter, come una soluzione disperata, utilizzare un tipo di dati "dinamico" - sia come scenario di ripiego per i tipi di elementi sconosciuti o come predefinito (fino a quando si sta bene con il calo di prestazioni).

Nizza! adattato la soluzione un po ', questo ha funzionato bene per me

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>");
            }
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top