web-dev-qa-db-ja.com

COMオブジェクトをキャストできません-MicrosoftOutlookおよびC#

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ループでこのエラーが発生します:

「タイプ 'System .__ ComObject'のCOMオブジェクトをインターフェイスタイプ 'Microsoft.Office.Interop.Outlook.MailItem'にキャストできません。この操作は、IIDのインターフェイスのCOMコンポーネントに対するQueryInterface呼び出しが原因で失敗しました '{00063034-0000- 0000-C000-000000000046} 'は、次のエラーのために失敗しました:そのようなインターフェイスはサポートされていません(HRESULTからの例外:0x80004002(E_NOINTERFACE))。 "

このエラーを解決する方法を教えていただけますか?

17
Zerotoinfinity

私はしばらく前にあなたの問題のようなものを回避しなければなりませんでした。

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

お役に立てば幸いです。

ここでの問題は_Explorer.CurrentFolder.Itemsには、MailItemだけでなく多くのオブジェクトを含めることができます(PostItemはその1つです)。

25
Anders Arpi

プロパティを確認する前に、アイテムが有効な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());
    }
}
9
Bolu

次のコードは、テストしたときに正常に機能しました。ただし、私の参照は「Microsoft Outlook14.0オブジェクトライブラリ」でした。別のバージョンを使用しますか?

パブリッククラスOutlook 
 {
読み取り専用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(); 
 
 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では、多くのアイテムにいくつかの共通のプロパティ(有効期限など)があるため、必死の回避策として、不明なアイテムタイプのフォールバックシナリオとして、またはデフォルトとして(限り、動的な」データ型を使用できます。パフォーマンスの低下に問題がないため)。

5
KBoek

いいね!ソリューションを少し適応させました、これは私にとってうまくいきました

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
Jeffrey DeMuth