2011-07-06 14 views
0

私たちは、asp.net Webアプリケーションを使用して異なるアカウントのExchangeサーバーから電子メールを取得するための新しいタスクを開始しました。過去にこのような経験はありませんでしたが、オンラインで検索したところ、Outlookと通信してそこから電子メールを取得できるコードスニペットが見つかりました。ASP.NET WebページがOutlookの問題から電子メールを受け取る

"Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Outlook.PostItem'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00063024-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). "

誰もが理由を知っています:ただし、例外は私がコードをテストするたびに発生していますか?

ちなみに、交換サーバーから直接メールを取り込む際の助言は、非常に高く評価されています。

マイコード:

 Microsoft.Office.Interop.Outlook.Application app = null; 
     Microsoft.Office.Interop.Outlook._NameSpace ns = null; 
     Microsoft.Office.Interop.Outlook.PostItem item = null; 
     Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null; 
     Microsoft.Office.Interop.Outlook.MAPIFolder subFolder = null; 
     try 
     { 
      app = new Microsoft.Office.Interop.Outlook.Application(); 
      ns = app.GetNamespace("MAPI"); 
      ns.Logon("user", "password", false, false); 
      inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 

      StringBuilder sb = new StringBuilder(); 
      sb.AppendFormat("Folder Name:{0},EntryId:{1}", inboxFolder.Name, inboxFolder.EntryID); 
      sb.AppendFormat(" Num Items:{0}", inboxFolder.Items.Count.ToString()); 
      Response.Write(sb); 
      for (int i = 1; i <= inboxFolder.Items.Count; i++) 
      { 
       item = (Microsoft.Office.Interop.Outlook.PostItem)inboxFolder.Items[i];//this is the exception happened line 
       Console.WriteLine("Item: {0}", i.ToString()); 
       Console.WriteLine("Subject: {0}", item.Subject); 
       Console.WriteLine("Sent: {0} {1}" item.SentOn.ToLongDateString(), item.SentOn.ToLongTimeString()); 
       Console.WriteLine("Categories: {0}", item.Categories); 
       Console.WriteLine("Body: {0}", item.Body); 
       Console.WriteLine("HTMLBody: {0}", item.HTMLBody); 

      } 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
     finally 
     { 
      ns = null; 
      app = null; 
      inboxFolder = null; 
     } 
+0

あなたが相互運用機能を使用する必要がありますか、またはあなたが代わりにメールサーバーからメッセージを取得するためにPOPを使用するほとんどのアプリケーションのようにそれを行うことができますか? – Earlz

+0

あなたは読んでいる - http://stackoverflow.com/questions/652549/read-ms-exchange-email-in-c? –

+0

@エリズ、それはする必要はありませんが、私は交換サーバーからメールを取得する方法が必要です。 –

答えて

1

がここに行く:これらの行では

...

Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null; 
inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 

は...あなたは、ユーザーの受信トレイへの参照を作成しています。ここまでは順調ですね。

しかし、その後、ここで...

for (int i = 1; i <= inboxFolder.Items.Count; i++) 
{ 
    item = (Microsoft.Office.Interop.Outlook.PostItem)inboxFolder.Items[i]; 
    //other stuff... 
} 

...あなたが言っている、「受信トレイ内のすべての項目について、項目がPostItemであることを前提としています。」

According to MSDN, a PostItem

Represents a post in a public folder that others may browse.

ユーザーの受信ボックスには、ポスト項目の完全であることを行っていません。それは、ユーザーの電子メールを表すMailItemオブジェクトを含む予定です。ケースということを、コード行は、おそらく

item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[i]; 

警告する必要があります:私はそれは、Outlookアイテムが存在することが可能ですにおけるMailItemオブジェクト以外のオブジェクトかどうかを理解するために、OutlookのAPIについて十分に知りませんInbox、しかし私は賭けたくない。参考のためにfull list of Outlook Item Objects is here

0

使用下図のように:

// not PostItem 
item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[i]; 
関連する問題