第一次拍摄时无法从Outlook删除电子邮件

时间:2017-12-13 09:21:05

标签: c# outlook vsto

我使用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;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

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