c# - 处理未读邮件时出现问题并在处理后将其标记为已读

标签 c#

我正在编写一段代码来访问 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/

相关文章:

c# - 领域驱动设计 API 问题

c# - 替换静态 AutoMapper API;替换 Profile 中的 Map 方法

c# - 在 IDisposable.Dispose() 中使用异步调用

c# - 寻找在 C# 中获取重复桌面屏幕截图的最有效方法

c# - List<Object> 的 XML 序列化

c# - 如何在 MVVM 中创建母版页?

c# - 在ASP.NET中将数据插入sql数据库

c# - 应用发布时的异常控制?

c# - 何时使用枚举,何时用具有静态成员的类替换它们?

c# - 双色路径对象