我正在编写一段代码来访问 Outlook 并逐一处理未读邮件并将它们标记为已读(因此它不会在相同的邮件上运行)。
问题是它无法读取所有未读邮件。 (例如)假设收件箱中有 10 封邮件,但它仅适用于 5 封邮件。它只处理了一半的邮件。
标记为已读后,计数减少,但 forloop 不会迭代所有未读邮件,而是跳过邮件
我是这样写的:
Outlook.Application outlookApp = new Outlook.Application();
Outlook._NameSpace oNS;
Outlook.MAPIFolder oFolder;
Outlook._Explorer oExp;
outlookApp = new Outlook.Application();
oNS = (Outlook._NameSpace)outlookApp.GetNamespace("MAPI");
oFolder = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
oExp = oFolder.GetExplorer(false);
oNS.Logon(Missing.Value, Missing.Value, false, true);
Outlook.Items items = oFolder.Items.Restrict("[Unread]=true");
int mailcount = items.Count;
foreach (Microsoft.Office.Interop.Outlook.MailItem mailItem in oFolder.Items)
{
if (mailItem.UnRead) // I only process the mail if unread
{
Console.WriteLine("Accounts: {0}", mailItem.Subject);
mailItem.UnRead = false;
}
}
我错过了什么吗?可以请任何人帮忙吗?
最佳答案
每次将一项标记为已读时,您的“项目”集合都会受到影响(减少),这就是问题所在。
OutLook.Application oApp;
OutLook._NameSpace oNS;
OutLook.MAPIFolder oFolder;
OutLook._Explorer oExp;
oApp = new OutLook.Application();
oNS = (OutLook._NameSpace)oApp.GetNamespace("MAPI");
oFolder = oNS.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderInbox);
oExp = oFolder.GetExplorer(false);
oNS.Logon(Missing.Value, Missing.Value, false, true);
OutLook.Items items = oFolder.Items.Restrict("[Unread]=true");
// Switched to for, https://stackoverflow.com/questions/4317850/do-i-need-to-release-the-com-object-on-every-foreach-iteration#4317878
for (int i = items.Count; i >= 1; i--)
{
var mail = items[i];
if (mail.UnRead)
{
mail.UnRead = false;
mail.Save();
}
Marshal.ReleaseComObject(mail);
}
Marshal.ReleaseComObject(items);
关于c# - 处理未读邮件时出现问题并在处理后将其标记为已读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51838734/