4

Outlook のすべてのメールを読むプログラムを作成しています。最終的にはより具体的な検索が行われるようになりますが、今のところ、受信トレイにあるすべてのメールを読みたいと考えています。何らかの理由で、169まで必要なものを読み取るコードを実行しています...

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

何かキーを押すと続行します 。. .

4

2 に答える 2

4

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

dynamic item = inboxFolder.Items[counter];

あなたのコードが受信トレイフォルダーで会議の招待状を処理する際に問題があったため、これは私にとってはうまくいきました。

完全に変更されたコード:

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

}

于 2012-03-12T20:06:53.170 に答える
1

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

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

あなたのエラーは、あなたがMailItem- を持っている可能性があることを示していますが、それはメール配信レポート (開封確認など) である可能性があります。キャスト エラーの参照については、この投稿を参照してください彼らは、回避策としてOutlook テーブル インターフェイスを利用し、オブジェクトをチェックすることを提案していますClass。これは別のオプションかもしれません。

于 2012-03-12T19:45:02.097 に答える