我们正在使用EWS在我们的某些邮箱上生成一些分析。
部分内容是获取对话的计数/名称/开始/结束。对话类似于Outlook 2010在按对话分组时显示的方式。
我希望能够使用ConversationId对项目进行分组,但这似乎只是Exchange 2010的功能。
我可以按文件夹中的主题进行分组以获得线程的简单概念...但是这不会处理拆分对话,因为Outlook 2010会这样做 - 具体而言,它不处理引入已发送的回复项目(这些对我们很重要 - 我们无法在不查看回复的情况下获得良好的指标)。
我目前获取线程信息的代码如下所示:
private IEnumerable<EmailThread> GetThreads(Folder folder)
{
var view = new ItemView(int.MaxValue) {PropertySet = new PropertySet(BasePropertySet.IdOnly)};
// view.PropertySet.Add(ItemSchema.ConversationId); - Can't use this as we're stuck on Exchange 2007 !!!
view.PropertySet.Add(ItemSchema.Subject);
view.PropertySet.Add(ItemSchema.DateTimeReceived);
var grouping = new Grouping(ItemSchema.Subject, SortDirection.Descending, ItemSchema.DateTimeReceived, AggregateType.Maximum);
var groupResults = folder.FindItems(view, grouping);
return groupResults.Select(x => new EmailThread
{
Name = x.Items.First().Subject,
Items = x.Items.Count,
StartDate = x.Items.Last().DateTimeReceived, // Assume last in thread is first email
EndDate = x.Items.First().DateTimeReceived // Assume first in thread is most recent
});
}
我希望有人知道如何有效地获取构成对话回复的回复信息?
答案 0 :(得分:3)
您可以通过扩展属性获取ConversationId和ConversationIndex:
private static readonly ExtendedPropertyDefinition ConversationIdProperty = new ExtendedPropertyDefinition(0x3013, MapiPropertyType.Binary);
private static readonly ExtendedPropertyDefinition ConversationIndexProperty = new ExtendedPropertyDefinition(0x0071, MapiPropertyType.Binary);
var items = service.FindItems(WellKnownFolderName.Inbox, new ItemView(512) { PropertySet = new PropertySet(BasePropertySet.FirstClassProperties,
ConversationIdProperty, ConversationIndexProperty)});
两者都是二进制属性。他们的内容在这里有详细描述:
[MS-OXOMSG]: E-Mail Object Protocol Specification,第2.2.1.2和2.2.1.3节。
属性本身在[MS-OXPROPS]: Exchange Server Protocols Master Property List中定义。