第一次无法从 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
删除消息。
我使用 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
删除消息。