2012-03-12 10 views
4

すべてのOutlookのメールを読むためのプログラムを作成していますが、最終的に検索はより具体的ですが、今のところ受信トレイにあるすべてのメールを読みたいと思っています。私はまた、任意の日付のようです何で電子メールの読み取りを開始し、私はいくつかの理由で169まで何をしたい読み取るコードの実行...Cを使ってoutloookでメールを解析する

namespace reademail 
{ 
static class Program 
{ 
    public static Microsoft.Office.Interop.Outlook.Application myApp; 

    public static void Main(string[] args) 
    {    
     // myApp = new Microsoft.Office.Interop.Outlook.Application(); 
     //myApp.NewMailEx += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailExEventHandler(OutlookNewMailReceived); 
     ReadMail(); 
    } 

    static void ReadMail() 
    { 
     Microsoft.Office.Interop.Outlook.Application app = null; 
     Microsoft.Office.Interop.Outlook._NameSpace ns = null; 
     Microsoft.Office.Interop.Outlook.MailItem item = null; 
     Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null; 


      app = new Microsoft.Office.Interop.Outlook.Application(); 
      ns = app.GetNamespace("MAPI"); 
      //ns.Logon(null, null, false, false); 

      inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 
      // subFolder = inboxFolder.Folders["Inbox"]; //folder.Folders[1]; also works 
      Console.WriteLine("Folder Name: {0}, EntryId: {1}", inboxFolder.Name, inboxFolder.EntryID); 
      Console.WriteLine("Num Items: {0}", inboxFolder.Items.Count.ToString()); 

      //System.IO.StreamWriter strm = new System.IO.StreamWriter("C:/Test/Inbox.txt"); 
      for (int counter = 1; counter <= inboxFolder.Items.Count; counter++) 
      { 
       Console.Write(inboxFolder.Items.Count + " " + counter); 
       item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[counter]; 
       Console.WriteLine("Item: {0}", counter.ToString()); 
       Console.WriteLine("Subject: {0}", item.Subject); 
       Console.WriteLine("Sent: {0} {1}", item.SentOn.ToLongDateString(), item.SentOn.ToLongTimeString()); 
       Console.WriteLine("Sendername: {0}", item.SenderName); 
       Console.WriteLine("Body: {0}", item.Body); 
       //strm.WriteLine(counter.ToString() + "," + item.Subject + "," + item.SentOn.ToShortDateString() + "," + item.SenderName); 

      } 
      //strm.Close(); 
     } 


    } 
} 

ループがクラッシュした後、169通のメールまで読み込み、があります。 ..私はすべての電子メールを読むことからそれが防止されているか分からない...

Folder Name: Inbox, EntryId: 000000003527EA8DB4FFC04EB6ABA4DE31CB4BA40100C6D3EBA 
DBDB57E438D0B53C5FB515CC50000660627C70000 
Num Items: 1048 
System.InvalidCastException: Unable to cast COM object of type 'System.__ComObje 
ct' to interface type 'Microsoft.Office.Interop.Outlook.MailItem'. This operatio 
n failed because the QueryInterface call on the COM component for the interface 
with IID '{00063034-0000-0000-C000-000000000046}' failed due to the following er 
ror: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERF 
ACE)). 
at CallSite.Target(Closure , CallSite , Object) 
at reademail.Program.ReadMail() in C:\Documents and Settings\DBubel\my docume 
nts\visual studio 2010\Projects\reademail\reademail\Program.cs:line 60 

キーを押し続ける。 。 。

+0

。 – SliverNinja

+0

ここに例外があります: – stihl

答えて

4

私の推測では、受信トレイにMicrosoft.Office.Interop.Outlook.MailItemインターフェイスが適用されないアイテムがあるため、ループを通過してキャストしようとするとコードがクラッシュすることがあります。 1つの可能な回避策は、動的にサポートしているので.NET4を使用している場合、オブジェクトをキャストするのではなく、動的変数に渡すことです。あなたのコードは、受信トレイフォルダ内の会議の招待状を扱う問題を抱えていたよう

​​

これは私のために働きました。

全修正コード:

あなたはそれが私たちは、問題のトラブルシューティングを行うことができクラッシュしたときに特定の `Exception`が何であるかを私たちに伝える必要があり
namespace reademail 
    { 
    static class Program 
    { 
     public static Microsoft.Office.Interop.Outlook.Application myApp; 

     public static void Main(string[] args) 
     { 
      // myApp = new Microsoft.Office.Interop.Outlook.Application(); 
      //myApp.NewMailEx += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailExEventHandler(OutlookNewMailReceived); 
      ReadMail(); 
     } 

     static void ReadMail() 
     { 
      Microsoft.Office.Interop.Outlook.Application app = null; 
      Microsoft.Office.Interop.Outlook._NameSpace ns = null; 
      //Microsoft.Office.Interop.Outlook.MailItem item = null; 
      Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null; 


      app = new Microsoft.Office.Interop.Outlook.Application(); 
      ns = app.GetNamespace("MAPI"); 
      //ns.Logon(null, null, false, false); 

      inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); 
      // subFolder = inboxFolder.Folders["Inbox"]; //folder.Folders[1]; also works 
      Console.WriteLine("Folder Name: {0}, EntryId: {1}", inboxFolder.Name, inboxFolder.EntryID); 
      Console.WriteLine("Num Items: {0}", inboxFolder.Items.Count.ToString()); 

      //System.IO.StreamWriter strm = new System.IO.StreamWriter("C:/Test/Inbox.txt"); 
      for (int counter = 1; counter <= inboxFolder.Items.Count; counter++) 
      { 
       Console.Write(inboxFolder.Items.Count + " " + counter); 
       dynamic item = inboxFolder.Items[counter]; 
       //item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[counter]; 
       Console.WriteLine("Item: {0}", counter.ToString()); 
       Console.WriteLine("Subject: {0}", item.Subject); 
       Console.WriteLine("Sent: {0} {1}", item.SentOn.ToLongDateString(), item.SentOn.ToLongTimeString()); 
       Console.WriteLine("Sendername: {0}", item.SenderName); 
       Console.WriteLine("Body: {0}", item.Body); 
       //strm.WriteLine(counter.ToString() + "," + item.Subject + "," + item.SentOn.ToShortDateString() + "," + item.SenderName); 

      } 
      //strm.Close(); 
     } 
    } 

} 

+0

私はループ内の項目の前に動的を追加すると、範囲を変更すると言います。それをそのままキャストしようとしました。 item =(dynamic)inboxFolder.Items [counter]; の場合でも同じエラーです。私のコードはあなたのために働いた? – stihl

+0

はい、上の変数の宣言を削除するだけでした。 (上記の完全修正コードを参照) –

1

MailItemsだけの場合は、取得するアイテムが有効であると仮定するのではなく、有効なMailItemであることを確認する必要があります。 CalendarItem,DocumentItemなどであり、これはolItemTypeで変化します。現在のコードでは、受信トレイにMailItemsしかないと明示的に想定しています。

item = inboxFolder.Items[counter] as Microsoft.Office.Interop.Outlook.MailItem; 
if (item != null) 
{ 
    .... 
} 

あなたのエラーは、MailItemを持っていることを示している - しかし、それはメール配信レポート(読むレシートなど)である可能性があります。キャストエラーのあるthis post for referenceを参照してください。これらは、回避策としてOutlook Table interfaceを利用し、オブジェクトClassをチェックすることを推奨します。これはあなたのための別のオプションかもしれません。

+0

私はそれが修正になると思っていましたが、まったく同じ現象が発生し、任意の数の電子メールを読み取り、任意の日付に開始することが非常に奇妙です。 – stihl

+0

私は試してみますこれを私は家に帰るつもりです。私は後で戻ってきます。 – stihl

関連する問題