Question

J'ai écrit ce code pour afficher les articles non lus dans ma boîte de messagerie Outlook et est le code ici:

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

mais sur la boucle foreach Je reçois cette erreur:

  

"Impossible d'objet COM coulé de type « System .__ ComObject » type d'interface « Microsoft.Office.Interop.Outlook.MailItem ». Cette opération a échoué parce que l'appel QueryInterface sur le composant COM pour l'interface avec IID « {00063034 -0000-0000-C000-000000000046} » a échoué en raison de l'erreur suivante: cette interface pris en charge (Exception de HRESULT: 0x80004002 (E_NOINTERFACE))."

Pouvez-vous s'il vous plaît me aider comment résoudre cette erreur?

Était-ce utile?

La solution

Je devais contourner quelque chose comme votre problème un certain temps.

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

L'espoir qui aide.

Le problème ici est que _explorer.CurrentFolder.Items peut contenir plus d'objets que juste MailItem (PostItem étant l'un d'entre eux).

Autres conseils

essayez de vérifier l'élément est un mailitem valide avant de vérifier ses propriétés:

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

Le code suivant a bien fonctionné quand je l'ai testé. Mais je dois mentionner que ma référence était de « Microsoft Outlook 14.0 Object Library ». Est-ce que vous arrive d'utiliser une autre 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;
            else
                Debug.WriteLine("Item is not a MailItem");
        }
    }
    }

S'il vous plaît noter que dans Outlook, de nombreux éléments ont des propriétés communes (par exemple le temps d'expiration), de sorte que vous pouvez, en tant que solution désespérée, utilisez un type de « dynamique » - soit en tant que scénario de repli pour les types d'éléments inconnus ou votre défaut (aussi longtemps que vous êtes très bien avec le succès de la performance).

Nice! adapté la solution un peu, cela a bien fonctionné pour moi

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>");
            }
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top