25 Stimmen

COM-Objekt kann nicht gecastet werden - Microsoft Outlook & C#

Ich habe diesen Code geschrieben, um die ungelesenen Elemente in meinem Outlook-Postfach anzuzeigen, und hier ist der Code:

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

aber in der foreach-Schleife erhalte ich diesen Fehler:

"COM-Objekt des Typs 'System.__ComObject' konnte nicht auf den Schnittstellentyp 'Microsoft.Office.Interop.Outlook.MailItem' übertragen werden. Dieser Vorgang ist fehlgeschlagen, da der QueryInterface-Aufruf für die COM-Komponente für die Schnittstelle mit IID '{00063034-0000-0000-C000-000000000046}' aufgrund des folgenden Fehlers fehlgeschlagen ist: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."

Können Sie mir bitte helfen, wie ich diesen Fehler beheben kann?

0 Stimmen

@Bolu Nein, das ist, was ich in meiner c#-Windows-Anwendung schreibe

1 Stimmen

MAPIFolder ist veraltet, verwenden Sie stattdessen Folder.

0 Stimmen

Konnten Sie das Problem lösen?

30voto

Anders Arpi Punkte 8097

Vor einiger Zeit musste ich ein ähnliches Problem wie das Ihre umgehen.

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

Ich hoffe, das hilft.

Das Problem dabei ist, dass _explorer.CurrentFolder.Items kann mehr Objekte enthalten als nur MailItem ( PostItem ist eine davon).

0 Stimmen

Ich erhalte den gleichen Fehler in der folgenden Zeile Microsoft.Office.Interop.Outlook.Application = new Microsoft.Office.Interop.Outlook.Application();

9voto

Bolu Punkte 8586

Versuchen zu prüfen, ob der Artikel gültig ist mailitem bevor Sie seine Eigenschaften überprüfen:

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

5voto

KBoek Punkte 5225

Der folgende Code funktionierte gut, als ich ihn getestet habe. Ich muss jedoch erwähnen, dass ich auf die "Microsoft Outlook 14.0 Object Library" verwiesen habe. Verwenden Sie zufällig eine andere 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");
        }
    }
    }

Bitte beachten Sie, dass in Outlook viele Elemente einige gemeinsame Eigenschaften haben (z. B. Verfallszeit), so dass Sie als verzweifelte Abhilfe einen "dynamischen" Datentyp verwenden können - entweder als Ausweichszenario für unbekannte Elementtypen oder als Standard (solange Sie mit dem Leistungseinbruch einverstanden sind).

0 Stimmen

Ich habe das Gleiche versucht und diese Meldung erhalten: COM-Objekt des Typs 'System.__ComObject' kann nicht an den Schnittstellentyp 'Microsoft.Office.Interop.Outlook.PostItem' angepasst werden. Dieser Vorgang ist fehlgeschlagen, da der QueryInterface-Aufruf der COM-Komponente für die Schnittstelle mit der IID '{00063024-0000-0000-C000-000000000046}' aufgrund des folgenden Fehlers fehlgeschlagen ist: Keine solche Schnittstelle unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)).

0 Stimmen

Dies funktionierte bei mir mit Outlook 2016, mit der neuesten Microsoft.Office.Interop.Outlook.dll

1voto

Jeffrey DeMuth Punkte 111

Schön! Ich habe die Lösung ein wenig angepasst, das hat bei mir gut funktioniert

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

0 Stimmen

Greifen Sie über einen Dienst (IIS) auf OOM zu? Tun Sie das nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X