【问题标题】:Console App to search outlook inbox with subject line filter skipping emails使用主题行过滤器跳过电子邮件的控制台应用程序来搜索 Outlook 收件箱
【发布时间】:2013-07-11 04:26:19
【问题描述】:

我正在编写一个控制台应用程序,用于搜索当前用户的 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();
        }   

【问题讨论】:

    标签: c# console-application office-interop outlook-2010


    【解决方案1】:

    如果有人碰巧偶然发现了这个,我发现了一个解决方案。我只是先将每封电子邮件添加到列表中,然后再对其执行任何操作。我不确定为什么需要此步骤,可能与无法正确枚举活动收件箱邮件项目有关。

    List<MailItem> ReceivedEmail = new List<MailItem>(); 
    
    foreach (Outlook.MailItem mail in emailFolder.Items)
    {
         ReceivedEmail.Add(mail);
    }
    
    foreach (MailItem mail in ReceivedEmail)
    { 
        //do stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2015-10-02
      • 1970-01-01
      • 2014-04-17
      相关资源
      最近更新 更多