C# Exchange Web服务:使用FindItemsResult批处理<;项目>;
我正在使用Exchange Web服务编写一个处理电子邮件附件的应用程序 我的问题领域的总体结构如下:C# Exchange Web服务:使用FindItemsResult批处理<;项目>;,c#,exchangewebservices,ews-managed-api,C#,Exchangewebservices,Ews Managed Api,我正在使用Exchange Web服务编写一个处理电子邮件附件的应用程序 我的问题领域的总体结构如下: public static void Main() { FindItemsResults<Item> findResults = FindItems(); foreach (Item item in findResults) { DoSomethingWithItem(item); } } public static FindIt
public static void Main()
{
FindItemsResults<Item> findResults = FindItems();
foreach (Item item in findResults)
{
DoSomethingWithItem(item);
}
}
public static FindItemsResults<Item> FindItems()
{
FindItemsResults<Item> findResults;
ItemView view = new ItemView(10); //batching 10 at a time
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
findResults = service.FindItems(
WellKnownFolderName.Inbox,
new SearchFilter.SearchFilterCollection(
LogicalOperator.Or,
new SearchFilter.ContainsSubstring(ItemSchema.Subject, Properties.Settings.Default.EmailSubject)),
view);
//return set of emails
return findResults;
}
这会循环发送我想要发送的所有电子邮件,但由于我还不明白的原因,foreach循环现在只处理findResults中的第一项
即使findResults包含多个项(findResults.Items.Count
>1),在我的第二个示例中,findResults.MoreAvailable
=false。公平地说,我已经循环了前面的批次,所以我看最后一批的末尾是有意义的
但是我如何重置findResults以便它处理整个批次?我尝试设置findResults.MoreAvailable,但它是只读的。。。我错过了什么
结论:
好的,我可以一次一批地处理这些项目,也可以将每个批次中的每个项目添加到列表中,稍后再进行处理,就像我目前所做的那样
他们之间没有太多的分歧;我最初开始使用一个列表,但我会考虑进一步的选择。 在我看来,您的主要问题是,您尝试定义一个函数,它返回<代码> FIDITEMsRESULTS/<代码>。如果使用结果配对,则不会有一个此类对象。而不是在检索每个新页面时,
FindItemsResults
将被覆盖。以下示例显示收件箱中所有项目的主题:
ItemView view = new ItemView(10, 0, OffsetBasePoint.Beginning);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
// save the folder where we will make searching to do this one time
Folder myInbox = Folder.Bind(service, WellKnownFolderName.Inbox);
FindItemsResults<Item> findResults;
do
{
findResults = myInbox.FindItems(
new SearchFilter.ContainsSubstring(ItemSchema.Subject,
Properties.Settings.Default.EmailSubject)),
view);
foreach (Item item in findResults)
{
// Do something with the item.
Console.WriteLine();
if (item is EmailMessage)
{
EmailMessage em = item as EmailMessage;
Console.WriteLine("Subject: \"{0}\"", em.Subject);
}
else if (item is MeetingRequest)
{
MeetingRequest mr = item as MeetingRequest;
Console.WriteLine("Subject: \"{0}\"", mr.Subject);
}
else
{
// we can handle other item types
}
}
//any more batches?
if (findResults.NextPageOffset.HasValue)
{
view.Offset = findResults.NextPageOffset.Value;
}
}
while (findResults.MoreAvailable);
ItemView视图=新的ItemView(10,0,OffsetBasePoint.start);
view.OrderBy.Add(ItemSchema.DateTimeReceived,SortDirection.Descending);
view.PropertySet=新属性集(
BasePropertySet.i仅限,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
//保存文件夹,我们将在其中搜索一次
Folder myInbox=Folder.Bind(服务,WellKnownFolderName.Inbox);
FindItemsResults findResults;
做
{
findResults=myInbox.FindItems(
新的SearchFilter.ContainsSubstring(ItemSchema.Subject,
Properties.Settings.Default.EmailSubject),
视图);
foreach(findResults中的项目)
{
//用这个东西做点什么。
Console.WriteLine();
如果(项目为EmailMessage)
{
EmailMessage em=作为EmailMessage的项目;
Console.WriteLine(“Subject:\“{0}\”,em.Subject);
}
否则,如果(项目为会议请求)
{
MeetingRequest mr=作为MeetingRequest的项目;
Console.WriteLine(“主题:\{0}\”,主题先生);
}
其他的
{
//我们可以处理其他项目类型
}
}
//还有批次吗?
if(findResults.NextPageOffset.HasValue)
{
view.Offset=findResults.NextPageOffset.Value;
}
}
而(findResults.MoreAvailable);
代码在控制台输出上显示主题。如果要以另一种方式使用电子邮件
或会议请求
,则应修改相应的代码。您还可以定义一个代理,该代理处理找到的电子邮件
或会议请求
,并在控制台上调用该代理。WriteLine
。如果确实需要在某个位置对所有项目进行相同的操作,则必须创建一些集合,如列表
,在函数中填充并返回,而不是当前执行的FindItemsResults
ItemView view = new ItemView(10, 0, OffsetBasePoint.Beginning);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
// save the folder where we will make searching to do this one time
Folder myInbox = Folder.Bind(service, WellKnownFolderName.Inbox);
FindItemsResults<Item> findResults;
do
{
findResults = myInbox.FindItems(
new SearchFilter.ContainsSubstring(ItemSchema.Subject,
Properties.Settings.Default.EmailSubject)),
view);
foreach (Item item in findResults)
{
// Do something with the item.
Console.WriteLine();
if (item is EmailMessage)
{
EmailMessage em = item as EmailMessage;
Console.WriteLine("Subject: \"{0}\"", em.Subject);
}
else if (item is MeetingRequest)
{
MeetingRequest mr = item as MeetingRequest;
Console.WriteLine("Subject: \"{0}\"", mr.Subject);
}
else
{
// we can handle other item types
}
}
//any more batches?
if (findResults.NextPageOffset.HasValue)
{
view.Offset = findResults.NextPageOffset.Value;
}
}
while (findResults.MoreAvailable);