我需要遍历收件箱中的所有未读邮件并为每封电子邮件下载第一个附件,我的代码有效但仅适用于第一封电子邮件,为什么?

/* load all unread emails */
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(1));

/* loop through emails */
foreach (EmailMessage item in findResults)
{
    item.Load();

    /* download attachment if any */
    if (item.HasAttachments && item.Attachments[0] is FileAttachment)
    {
        Console.WriteLine(item.Attachments[0].Name);
        FileAttachment fileAttachment = item.Attachments[0] as FileAttachment;

        /* download attachment to folder */
        fileAttachment.Load(downloadDir + fileAttachment.Name);
    }

    /* mark email as read */
    item.IsRead = true;
    item.Update(ConflictResolutionMode.AlwaysOverwrite);
}

Console.WriteLine("Done");

在我的收件箱中,它设置了第一封要阅读的电子邮件,但 sript 随即停止并写下“完成”。到控制台窗口。怎么了 ?

最佳答案

问题是您只从 Exchange 请求一个项目。

FindItemsResults<Item> findResults = service.FindItems(
    WellKnownFolderName.Inbox,
    sf,
    new ItemView(1));

ItemView class 构造函数以页面大小作为参数,其定义为:



因此,您请求的是单个项目,这解释了为什么您的 foreach 在该项目之后完成。

要对此进行测试,您可以简单地将 pageSize 增加到更合理的值,例如 100 或 1000。

但是要修复它,您应该遵循惯用的双循环:
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
FindItemsResults<Item> findResults;
ItemView view = new ItemView(100);
do {
    findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view);
    foreach (var item in findResults.Items) {
        // TODO: process the unread item as you already did
    }
    view.Offset = findResults.NextPageOffset;
}
while (findResults.MoreAvailable);

在这里,我们继续从 Exchange 检索更多项目(以 100 个为批次),只要它告诉我们有更多可用项目。

关于c# - EWS foreach 所有未读消息不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26544626/

10-10 12:32