如何使用EWS托管API避免在255个字符处截断邮件主题?

时间:2014-05-23 19:43:39

标签: email exchange-server exchangewebservices ews-managed-api

我在Exchange服务器(2010 SP1)上有一个电子邮件消息,主题标题长度为272个字符。 Outlook和OWA都显示它被截断为前两个字符后跟“...”。 EWSEditor以同样的方式显示它。但是,我知道完整的主题存储在某个地方,因为当我查看“消息选项”对话框中的标题或OWA中的“消息详细信息”时,所有272个字符都存在。

我的代码只是获取截断的Subject,我需要一种方法来获取完整的字符串。

我的代码使用SyncFolderItems来获取ChangeCollectionItemChange个对象。我有两个代码分支。一个检索FirstClassProperties,一个检索IdOnly。我有一个名为getItemStringProp()的函数,根据分支,我可以直接使用我从ItemChange获得的项目,或者通过绑定到我获得的Item来调用它。 ItemChange.Item.Id。在这两种情况下,我的getItemStringProp()都使用Item.TryGetProperty()并为主题返回最多255个字符。如果实际主题更长,那么我得到252个字符,然后是“......”。

以下是来自SyncFolderItemsFirstClassProperties的分支机构的代码:

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个字符的主题是合法的。

1 个答案:

答案 0 :(得分:1)

不要依赖于EWS中的Item.Bind(),同步,搜索或任何其他操作来加载您正在寻找的所有属性。您是否尝试过获取该项目,然后执行.load(PropertySet)或ExchangeService.loadPropertiesForItems()?即使您特别要求,某些属性也不会在各种检索操作中出现。有些可能会通过,但会被截断。更有趣的是,我认为没有任何文档可以告诉您哪些操作会返回哪些属性,因此您可以进行猜测和检查。您必须在检索项目后加载属性集,因此通常最好只获取带有ID的项目,然后加载属性集。