0

現在のユーザーの Outlook 受信トレイを検索するコンソール アプリケーションを作成しています。プログラムは、件名に基づいて各電子メールに対して特定のアクションを実行し、電子メールを 3 つのサブフォルダのうちの 1 つに移動します。これまでのところ、エラーをスローすることなく実行されています。問題は、受信トレイ内の一部の電子メールをスキップすることであり、これを行う理由の背後にあるロジックを見つけることができないようです. 受信した最初のメールをスキップする場合もあれば、最後のメールをスキップする場合もあれば、2 つ残して残りを移動する場合もあります。コードにブレークポイントを挿入し、各行をステップ実行しましたが、スキップされたメールは表示されません。メールが既読か未読かは問題ではないようです。プログラムを複数回実行すると、最終的にスキップされた電子メールが処理されます。何が原因でしょうか?

        Microsoft.Office.Interop.Outlook.Application application = null;          

        if (Process.GetProcessesByName("OUTLOOK").Count() > 0)
        {  
            application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
        }
        else  
        {
            //outlook not open, do nothing
        }         

        Microsoft.Office.Interop.Outlook.Items items = null;
        Microsoft.Office.Interop.Outlook.NameSpace ns = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder inbox = null;
        Microsoft.Office.Interop.Outlook.Application();

        ns = application.Session;
        inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        items = inbox.Items;

        try
        {                
            foreach (Object receivedMail in items)
            {                   
                if (receivedMail is MailItem)
                {                        
                    MailItem mail = receivedMail as MailItem;

                        string subject = mail.Subject.ToString().ToUpper();

                        switch (subject)
                        {
                            case "SUBJECT1":
                                DoStuff1(mail);           
                                mail.Move(inbox.Folders["folder1"]);   
                                break;
                            case "SUBJECT2":
                                DoStuff2(mail);                                    
                                mail.Move(inbox.Folders["folder2"]);
                                break;
                            default:
                                mail.Move(inbox.Folders["folder3"]);          
                                break;

                    }
                }
            }

            Console.WriteLine("Complete");
            Console.ReadLine();
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            Console.WriteLine(ex.ToString());
            Console.ReadLine();
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.ToString());
            Console.ReadLine();
        }   
4

1 に答える 1

0

誰かがこれに遭遇した場合、私は解決策を発見しました. メールに対してアクションを実行する前に、最初に各メールをリストに追加しました。この手順が必要な理由はわかりませんが、アクティブな受信トレイ メール アイテムを適切に列挙できないことに関係している可能性があります。

List<MailItem> ReceivedEmail = new List<MailItem>(); 

foreach (Outlook.MailItem mail in emailFolder.Items)
{
     ReceivedEmail.Add(mail);
}

foreach (MailItem mail in ReceivedEmail)
{ 
    //do stuff
}
于 2013-07-24T12:09:39.063 に答える