0

我需要在 C# 中编写一个方法,该方法使用 Exchange Web 服务 (EWS) 托管 API 从邮箱中读取电子邮件,并给出当前电子邮件的 ItemId/UniqueId,然后在收件箱中返回下一封电子邮件的 ItemId/UniqueId当前的电子邮件。

此外,由于各种原因,我要求该方法是静态无状态方法,也就是说,它不能依赖于在调用该方法之间持续存在的任何成员/全局变量。因此,我不能简单地存储对 FindItemsResults 对象实例的引用并在每次调用该方法时移至下一个 Item。

我尝试使用以下代码实现该方法(仅简化示例,无错误检查):

using Microsoft.Exchange.WebServices;
using Microsoft.Exchange.WebServices.Data;
...
...
public string GetNextEmailId(string currentItemId)
{
    // set up Exchange Web Service connection
    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
    service.AutodiscoverUrl("example.user@contoso.com");
    // create SearchFilter to find next email after current email
    ItemId itemId = new ItemId(currentItemId);
    SearchFilter sfNextEmail = new SearchFilter.IsGreaterThan(EmailMessageSchema.Id, itemId);
    // find next email in inbox
    ItemView itemView = new ItemView(1);
    itemView.OrderBy.Add(EmailMessageSchema.DateTimeReceived, SortDirection.Ascending);
    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sfNextEmail, itemView);
    // return unique ID of next email
    return findResults.Items[0].Id.UniqueId;
}

但是,当我运行此方法时,它会从 service.FindItems 行引发以下异常:

System.ArgumentException:“验证失败。参数名称:searchFilter”
内部异常 - Microsoft.Exchange.WebServices.Data.ServiceValidationException:“'ItemId' 类型的值不能作为搜索过滤器中的比较值。”

一种选择是使用 FindItems 查找收件箱中的所有电子邮件并遍历它们检查 ItemId,直到找到当前电子邮件,然后移至下一封并返回其唯一 ID。但我认为这可能是缓慢且低效的。我希望有更好的方法来实现这一点。

任何帮助或建议将不胜感激。我无法在网上找到任何解决方案。

4

1 回答 1

6

如果您知道当前电子邮件的项目 ID,则可以绑定到它:

EmailMessage 当前 = EmailMessage.Bind(service, id);

然后你有当前收到的电子邮件日期 - 为所有大于该日期的日期创建一个搜索过滤器,并使用你已经拥有的代码的订单。

于 2010-08-11T14:53:09.490 回答