Mis*_*siu 5 c# .net-3.5 exchangewebservices winforms
我正在尝试从特定用户那里获取Exchange的未读电子邮件数量.
我可以从收件箱中获得大量电子邮件,如下所示:
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
ItemView view = new ItemView(int.MaxValue);
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view);
int unreadCount = 0;
foreach (EmailMessage i in findResults)
{
unreadCount++;
}
label1.Text = unreadCount.ToString();
Run Code Online (Sandbox Code Playgroud)
这非常有效.
我也可以让所有子文件夹都是收件箱:
FindFoldersResults findResults1 = service.FindFolders(
WellKnownFolderName.Inbox,
new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });
foreach (Folder folder in findResults1.Folders)
{
Console.WriteLine(folder.DisplayName);
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法将这两者结合在一起.
我知道我可以做嵌套的foreach循环,但我想避免这种情况.
我发现了这些问题:所有文件夹中的Exchange Web服务(EWS)FindItems,但它至少需要使用Outlook 2010才能创建AllItems文件夹.
我知道我可以创建SearchFilterCollection,但是如何添加规则以便它在Inbox和所有子文件夹中搜索未读的电子邮件?
编辑:
这是我到目前为止尝试做的事情:
private int getEmailCount()
{
int unreadCount = 0;
FolderView viewFolders = new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep, PropertySet = new PropertySet(BasePropertySet.IdOnly) };
ItemView viewEmails = new ItemView(int.MaxValue) { PropertySet = new PropertySet(BasePropertySet.IdOnly) };
SearchFilter unreadFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, unreadFilter, viewEmails);
unreadCount += findResults.Count();
FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders);
foreach (Folder folder in inboxFolders.Folders)
{
findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
unreadCount += findResults.Count();
}
return unreadCount;
}
Run Code Online (Sandbox Code Playgroud)
基本上这是有效的,但是当我创建了多个子文件夹时,它开始工作得很慢.
我可以用一个来获得相同的结果而不是多个查询吗?
我搜索了一下并创建了这个函数:
public void getEmailCount(Action<int> callback)
{
int unreadCount = 0;
FolderView viewFolders = new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep, PropertySet = new PropertySet(BasePropertySet.IdOnly) };
ItemView viewEmails = new ItemView(int.MaxValue) { PropertySet = new PropertySet(BasePropertySet.IdOnly) };
SearchFilter unreadFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
SearchFilter folderFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "AllItems"));
FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Root, folderFilter, viewFolders);
if (inboxFolders.Count() == 0)//if we don't have AllItems folder
{
//search all items in Inbox and subfolders
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, unreadFilter, viewEmails);
unreadCount += findResults.Count();
inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders);
foreach (Folder folder in inboxFolders.Folders)
{
findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
unreadCount += findResults.Count();
}
}
else //AllItems is avilable
{
foreach (Folder folder in inboxFolders.Folders)
{
FindItemsResults<Item> findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
unreadCount += findResults.Count();
}
}
callback(unreadCount);
}
Run Code Online (Sandbox Code Playgroud)
基本上它会检查我们是否有AllItems可用的文件夹。
如果YES我们执行一个简单的查询,返回所有未读消息。
如果NO然后我们循环收件箱内的所有文件夹。这比较慢,并且取决于我们有多少个文件夹和级别。
欢迎任何修复和改进:)