如何使用托管的 Exchange Web 服务 API 列出这些文件夹中的所有文件夹和文件?
How to list all folders and files in those folders using Exchange Web Services Managed API?
我刚刚发现了 Exchange Web Services Managed API 并且我一直在使用它来尝试获得理解,因为我相信它可以为我一直在处理的问题提供解决方案.
背景
我已经阅读了很多文档并且对事物有了大致的了解。特别是,我设置了一些与此非常相似的东西 LINK.
但是,我想显示一个文件夹,然后在该文件夹之后显示所有相关的 EmailMessage 项目,依此类推 folders/sub-folders。到目前为止我编写的代码将列出一个文件夹,但它会列出我返回的所有电子邮件,而不仅仅是与该文件夹相关的那些电子邮件。我正在搜索未读项目只是为了暂时保持列表较小。
代码
private static void GetAllItems(ExchangeService service)
{
List<Folder> lstFolderIds = new List<Folder>();
// Fill list with all public folders and sub-folders
GetAllFolders(service, lstFolderIds);
List<EmailMessage> emails = new List<EmailMessage>();
foreach(Folder folder in lstFolderIds)
{
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
ItemView view = new ItemView(int.MaxValue);
view.PropertySet = PropertySet.IdOnly;
FindItemsResults<Item> searchResults = service.FindItems(folder.Id, sf, view);
if (searchResults.Items.Count > 0)
{
foreach (var item in searchResults.Items)
{
try
{
if (item is EmailMessage)
{
emails.Add((EmailMessage)item);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: {0}", ex.Message);
Console.WriteLine("Stack Trace: {0}", ex.StackTrace);
Console.WriteLine("Source: {0}", ex.Source);
Console.WriteLine("HResult: {0}", ex.HResult);
}
}
}
}
PropertySet properties = (BasePropertySet.FirstClassProperties);
service.LoadPropertiesForItems(emails, properties);
foreach (Folder folder in lstFolderIds)
{
object folderName;
object displayName;
object childFolderCount;
object unreadCount;
object totalCount;
folderName = folder.TryGetProperty(FolderSchema.ParentFolderId, out folderName) ? folder.ParentFolderId.FolderName.Value.ToString() : "N/A";
displayName = folder.TryGetProperty(FolderSchema.DisplayName, out displayName) ? folder.DisplayName.ToString() : "N/A";
childFolderCount = folder.TryGetProperty(FolderSchema.ChildFolderCount, out childFolderCount) ? folder.ChildFolderCount.ToString() : "N/A";
unreadCount = folder.TryGetProperty(FolderSchema.UnreadCount, out unreadCount) ? folder.UnreadCount.ToString() : "N/A";
totalCount = folder.TryGetProperty(FolderSchema.TotalCount, out totalCount) ? folder.TotalCount.ToString() : "N/A";
Console.WriteLine("Parent Folder: {0}", folderName);
Console.WriteLine("Folder Display Name: {0}", displayName);
Console.WriteLine("Child Folder Count: {0}", childFolderCount);
Console.WriteLine("Folder Unread Count: {0}", unreadCount);
Console.WriteLine("Folder Total Count: {0}", totalCount);
Console.WriteLine("---------------------------------------------------------");
foreach (EmailMessage email in emails)
{
object parentFolderName;
object subject;
object retentionDate;
parentFolderName = email.TryGetProperty(EmailMessageSchema.ParentFolderId, out parentFolderName) ? email.ParentFolderId.FolderName.Value.ToString() : "N/A";
subject = email.TryGetProperty(EmailMessageSchema.Subject, out subject) ? email.Subject.ToString() : "N/A";
retentionDate = email.TryGetProperty(EmailMessageSchema.RetentionDate, out retentionDate) ? retentionDate.ToString() : "N/A";
Console.WriteLine("\tParent Folder Name: {0}", parentFolderName);
Console.WriteLine("\tSubject: {0}", subject);
Console.WriteLine("\tRetention Date: {0}", retentionDate);
//}
}
Console.WriteLine("");
Console.WriteLine("Press or select Enter...");
Console.Read();
}
}
部分问题是我不知道如何获取文件夹的文件夹名称或 EmailMessage 的父文件夹名称。我可以获得文件夹的文件夹 ID 和 EmailMessage 的父文件夹 ID,但它们对于返回的所有项目都是相同的,所以一定是不对的。
我在这篇 LINK 中读到,我可能需要执行额外的绑定以将文件夹与 EmailMessage 项目相关联,但我不确定该怎么做。
预期输出
Parent Folder:
Folder Display Name: Inbox
Child Folder Count: 1
Folder Unread Count: 2
Folder Total Count: 51
---------------------------------------------------------
Parent Folder Name: Inbox
Subject: New Coversheets for TPS Reports
Retention Date: 10/31/2017 11:59:59 PM
Parent Folder Name: Inbox
Subject: Have you seen my stapler?
Retention Date: 07/31/2017 11:59:59 PM
Parent Folder:
Folder Display Name: Sent Items
Child Folder Count: 0
Folder Unread Count: 0
Folder Total Count: 27
---------------------------------------------------------
No Un-Read Items
问题
- 如何列出包含符合我的搜索条件的相关电子邮件消息的文件夹层次结构?
- 我目前正在获取 MsgFolderRoot 的 ID 的 FolderId/ParentFolderId 还是有什么方法可以告诉我?
- 如何获得 Folder.FolderId.FolderName.Value 和 EmailMessage.ParentFolderId.FolderName.Value?
- 如果#2 需要绑定,有没有人有示例或link他们会分享说明该操作的示例?
更新
- 在问题前添加了预期输出部分。
谢谢。
仔细阅读对象浏览器后,我发现 FolderName
属性 的使用与 FolderId
属性 是互斥的,这解释了为什么我的 parentFolderId.FolderName.Value
代码总是返回 null。
我重新组织了我的代码以构建层次结构,并使用 ParentFolderId
属性 将 EmailMessage
绑定到父文件夹,这使我能够获得父文件夹的 DisplayName
属性.
我刚刚发现了 Exchange Web Services Managed API 并且我一直在使用它来尝试获得理解,因为我相信它可以为我一直在处理的问题提供解决方案.
背景
我已经阅读了很多文档并且对事物有了大致的了解。特别是,我设置了一些与此非常相似的东西 LINK.
但是,我想显示一个文件夹,然后在该文件夹之后显示所有相关的 EmailMessage 项目,依此类推 folders/sub-folders。到目前为止我编写的代码将列出一个文件夹,但它会列出我返回的所有电子邮件,而不仅仅是与该文件夹相关的那些电子邮件。我正在搜索未读项目只是为了暂时保持列表较小。
代码
private static void GetAllItems(ExchangeService service)
{
List<Folder> lstFolderIds = new List<Folder>();
// Fill list with all public folders and sub-folders
GetAllFolders(service, lstFolderIds);
List<EmailMessage> emails = new List<EmailMessage>();
foreach(Folder folder in lstFolderIds)
{
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
ItemView view = new ItemView(int.MaxValue);
view.PropertySet = PropertySet.IdOnly;
FindItemsResults<Item> searchResults = service.FindItems(folder.Id, sf, view);
if (searchResults.Items.Count > 0)
{
foreach (var item in searchResults.Items)
{
try
{
if (item is EmailMessage)
{
emails.Add((EmailMessage)item);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: {0}", ex.Message);
Console.WriteLine("Stack Trace: {0}", ex.StackTrace);
Console.WriteLine("Source: {0}", ex.Source);
Console.WriteLine("HResult: {0}", ex.HResult);
}
}
}
}
PropertySet properties = (BasePropertySet.FirstClassProperties);
service.LoadPropertiesForItems(emails, properties);
foreach (Folder folder in lstFolderIds)
{
object folderName;
object displayName;
object childFolderCount;
object unreadCount;
object totalCount;
folderName = folder.TryGetProperty(FolderSchema.ParentFolderId, out folderName) ? folder.ParentFolderId.FolderName.Value.ToString() : "N/A";
displayName = folder.TryGetProperty(FolderSchema.DisplayName, out displayName) ? folder.DisplayName.ToString() : "N/A";
childFolderCount = folder.TryGetProperty(FolderSchema.ChildFolderCount, out childFolderCount) ? folder.ChildFolderCount.ToString() : "N/A";
unreadCount = folder.TryGetProperty(FolderSchema.UnreadCount, out unreadCount) ? folder.UnreadCount.ToString() : "N/A";
totalCount = folder.TryGetProperty(FolderSchema.TotalCount, out totalCount) ? folder.TotalCount.ToString() : "N/A";
Console.WriteLine("Parent Folder: {0}", folderName);
Console.WriteLine("Folder Display Name: {0}", displayName);
Console.WriteLine("Child Folder Count: {0}", childFolderCount);
Console.WriteLine("Folder Unread Count: {0}", unreadCount);
Console.WriteLine("Folder Total Count: {0}", totalCount);
Console.WriteLine("---------------------------------------------------------");
foreach (EmailMessage email in emails)
{
object parentFolderName;
object subject;
object retentionDate;
parentFolderName = email.TryGetProperty(EmailMessageSchema.ParentFolderId, out parentFolderName) ? email.ParentFolderId.FolderName.Value.ToString() : "N/A";
subject = email.TryGetProperty(EmailMessageSchema.Subject, out subject) ? email.Subject.ToString() : "N/A";
retentionDate = email.TryGetProperty(EmailMessageSchema.RetentionDate, out retentionDate) ? retentionDate.ToString() : "N/A";
Console.WriteLine("\tParent Folder Name: {0}", parentFolderName);
Console.WriteLine("\tSubject: {0}", subject);
Console.WriteLine("\tRetention Date: {0}", retentionDate);
//}
}
Console.WriteLine("");
Console.WriteLine("Press or select Enter...");
Console.Read();
}
}
部分问题是我不知道如何获取文件夹的文件夹名称或 EmailMessage 的父文件夹名称。我可以获得文件夹的文件夹 ID 和 EmailMessage 的父文件夹 ID,但它们对于返回的所有项目都是相同的,所以一定是不对的。
我在这篇 LINK 中读到,我可能需要执行额外的绑定以将文件夹与 EmailMessage 项目相关联,但我不确定该怎么做。
预期输出
Parent Folder:
Folder Display Name: Inbox
Child Folder Count: 1
Folder Unread Count: 2
Folder Total Count: 51
---------------------------------------------------------
Parent Folder Name: Inbox
Subject: New Coversheets for TPS Reports
Retention Date: 10/31/2017 11:59:59 PM
Parent Folder Name: Inbox
Subject: Have you seen my stapler?
Retention Date: 07/31/2017 11:59:59 PM
Parent Folder:
Folder Display Name: Sent Items
Child Folder Count: 0
Folder Unread Count: 0
Folder Total Count: 27
---------------------------------------------------------
No Un-Read Items
问题
- 如何列出包含符合我的搜索条件的相关电子邮件消息的文件夹层次结构?
- 我目前正在获取 MsgFolderRoot 的 ID 的 FolderId/ParentFolderId 还是有什么方法可以告诉我?
- 如何获得 Folder.FolderId.FolderName.Value 和 EmailMessage.ParentFolderId.FolderName.Value?
- 如果#2 需要绑定,有没有人有示例或link他们会分享说明该操作的示例?
更新
- 在问题前添加了预期输出部分。
谢谢。
仔细阅读对象浏览器后,我发现 FolderName
属性 的使用与 FolderId
属性 是互斥的,这解释了为什么我的 parentFolderId.FolderName.Value
代码总是返回 null。
我重新组织了我的代码以构建层次结构,并使用 ParentFolderId
属性 将 EmailMessage
绑定到父文件夹,这使我能够获得父文件夹的 DisplayName
属性.