我使用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;
}
}
}
答案 0 :(得分:0)
在迭代其元素时,您正在修改集合。循环访问受限项目colelction并将条目ID (MailItem.EntryID
存储在列表中。然后,您可以遍历该列表中的stings,使用Namespace.GetItemFromID
打开每个项目,然后使用MailItem.Delete
删除该消息。