我需要在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。但我认为这可能是缓慢而无效的。我希望有更好的方法来实现这一目标。
非常感谢任何帮助或建议。我无法在网上找到任何解决方案。
答案 0 :(得分:6)
如果你知道当前电子邮件的项目ID,你可以绑定它:
EmailMessage current = EmailMessage.Bind(service,id);
然后,您将收到当前收到的电子邮件日期 - 为所有超过该日期的日期创建搜索过滤器,并按照您已有的代码使用您的订单。