我在Exchange服务器(2010 SP1)上有一个电子邮件消息,主题标题长度为272个字符。 Outlook和OWA都显示它被截断为前两个字符后跟“...”。 EWSEditor以同样的方式显示它。但是,我知道完整的主题存储在某个地方,因为当我查看“消息选项”对话框中的标题或OWA中的“消息详细信息”时,所有272个字符都存在。
我的代码只是获取截断的Subject,我需要一种方法来获取完整的字符串。
我的代码使用SyncFolderItems
来获取ChangeCollection
个ItemChange
个对象。我有两个代码分支。一个检索FirstClassProperties
,一个检索IdOnly
。我有一个名为getItemStringProp()
的函数,根据分支,我可以直接使用我从ItemChange
获得的项目,或者通过绑定到我获得的Item
来调用它。 ItemChange.Item.Id
。在这两种情况下,我的getItemStringProp()
都使用Item.TryGetProperty()
并为主题返回最多255个字符。如果实际主题更长,那么我得到252个字符,然后是“......”。
以下是来自SyncFolderItems
与FirstClassProperties
的分支机构的代码:
useIdOnly = false;
icc = exchange.SyncFolderItems(folderId, PropertySet.FirstClassProperties, null, syncFolderItemsBatchSize, SyncFolderItemsScope.NormalItems, result.getSyncState());
并从另一个分支:
useIdOnly = true;
icc = exchange.SyncFolderItems(folderId, PropertySet.IdOnly, null, syncFolderItemsBatchSize, SyncFolderItemsScope.NormalItems, result.getSyncState());
在此之后,我深入了解主题:
foreach (ItemChange ic in icc)
{
if (!useIdOnly)
{
icSubject = getItemStringProp(ic.Item, EmailMessageSchema.Subject,"Subject", folderName,"");
}
else
{
PropertySet itemProps = new PropertySet(BasePropertySet.IdOnly);
itemProps.Add(EmailMessageSchema.Subject);
itemProps.Add(EmailMessageSchema.DateTimeSent);
itemProps.Add(EmailMessageSchema.ItemClass);
Item item = Item.Bind(exchange, ic.Item.Id, itemProps);
icSubject = getItemStringProp(item, EmailMessageSchema.Subject, "Subject", folderName, "");
}
}
这是获得主题的函数:
private String getItemStringProp(Item item, PropertyDefinition propDef, String propName, String fName, String defaultValue)
{
// some debug logging code and error checks omitted
object prop = null;
String value = "";
try
{
if (item.TryGetProperty(propDef, out prop) && prop != null)
{
value = prop.ToString();
}
if (prop == null || value == null)
{
value = defaultValue;
}
}
return value;
}
顺便说一下,我知道Outlook(至少2007版本)和OWA都不允许创建主题超过255个字符的邮件。有问题的邮件通过SMTP进入Exchange,根据RFC,远远超过255个字符的主题是合法的。
答案 0 :(得分:1)
不要依赖于EWS中的Item.Bind(),同步,搜索或任何其他操作来加载您正在寻找的所有属性。您是否尝试过获取该项目,然后执行.load(PropertySet)或ExchangeService.loadPropertiesForItems()?即使您特别要求,某些属性也不会在各种检索操作中出现。有些可能会通过,但会被截断。更有趣的是,我认为没有任何文档可以告诉您哪些操作会返回哪些属性,因此您可以进行猜测和检查。您必须在检索项目后加载属性集,因此通常最好只获取带有ID的项目,然后加载属性集。