第一次无法从 Outlook 中删除电子邮件

Not able to delete emails from Outlook at first shot

我使用 C# 在 Visual Studio 中构建了一个控制台应用程序。我有一个包含很多键的配置文件 (app.config),以便识别我要删除的电子邮件。

我的问题是,如果我有 10 封未读电子邮件要删除,即使删除有效,我也需要 运行 应用程序几次才能执行此操作。我没有收到任何错误。

看起来有点超时,所以应用程序删除了前 3 封电子邮件,其余的保持不变,然后我再次 运行 应用程序,它删除了接下来的 3 或 4 封电子邮件,然后一遍又一遍,直到我删除所有内容。

我是不是做错了什么?按照我的代码,它连接到 Outlook,我们的邮件服务器是 Microsoft Exchange。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using Microsoft.Office.Interop.Outlook;
using Exception = System.Exception;

namespace OutlookReader
{
   class Program
   {
     static void Main()
     {
        try
        {
            var outlookApplication = new ApplicationClass();
            var mapiNameSpace = outlookApplication.GetNamespace("MAPI");

            //Inbox
            var inbox = mapiNameSpace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
            //Unread emails
            var unreadItems = inbox.Items.Restrict("[Unread]=true");

            var splitter = char.Parse(ConfigurationManager.AppSettings["splitter"]);
            var excludeBySenderName = ConfigurationManager.AppSettings["ExcludeBySenderName"].Split(splitter).ToList();
            var excludeByEmail = ConfigurationManager.AppSettings["ExcludeByEmail"].Split(splitter).ToList();
            var excludeByDomain = ConfigurationManager.AppSettings["ExcludeByDomain"].Split(splitter).ToList();
            var excludeByTo = ConfigurationManager.AppSettings["ExcludeByTo"].Split(splitter).ToList();
            var excludeBySubject = ConfigurationManager.AppSettings["ExcludeBySubject"].Split(splitter).ToList();



            foreach (MailItem item in unreadItems)
            {
                Console.WriteLine("Sender: " + item.SenderName + " - To: " + item.To + " - Subject: " + item.Subject);

                if (stringExists(item.SenderName, excludeBySenderName) 
                    || stringExists(item.SenderEmailAddress, excludeByEmail) 
                    || stringExists(item.SenderEmailAddress, excludeByDomain) 
                    || stringExists(item.To, excludeByTo) 
                    || stringExistsFullSearch(item.Body, excludeByDomain) 
                    || stringExistsFullSearch(item.HTMLBody, excludeByDomain)  
                    || stringExistsFullSearch(item.Subject, excludeBySubject)) 
                {
                    //item.UnRead = false;
                    item.Delete();
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadKey();
    }

    private static bool stringExists(string pattern, List<string> list)
    {
        var result = list.Find(item => item.ToLower().Contains(pattern.ToLower()));

        if (string.IsNullOrWhiteSpace(result))
        {
            return false;
        }

        return true;
    }

    private static bool stringExistsFullSearch(string pattern, List<string> list)
    {
        var result = false;
        foreach (var item in list)
        {
            if (pattern.ToLower().Contains(item.ToLower()))
            {
                result = true;
            }
        }

        return result;
    }
  }
}

您在循环访问其元素时正在修改集合。遍历受限项目集合并将条目 ID (MailItem.EntryID) 存储在列表中。然后您可以遍历该列表中的字符串,使用 Namespace.GetItemFromID 打开每个项目,然后使用 MailItem.Delete 删除消息。