我需要在 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。但我认为这可能是缓慢且低效的。我希望有更好的方法来实现这一点。
任何帮助或建议将不胜感激。我无法在网上找到任何解决方案。