我正在编写一个控制台应用程序,用于搜索当前用户的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();
}
答案 0 :(得分:0)
如果有人偶然遇到这种情况,我发现了一个解决方案。我先将每封电子邮件添加到列表中,然后再对其执行任何操作。我不确定为什么这个步骤是必要的,可能与无法正确枚举活动的收件箱邮件项目有关。
List<MailItem> ReceivedEmail = new List<MailItem>();
foreach (Outlook.MailItem mail in emailFolder.Items)
{
ReceivedEmail.Add(mail);
}
foreach (MailItem mail in ReceivedEmail)
{
//do stuff
}