首页 文章

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

提问于
浏览
2

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

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

我的代码使用 SyncFolderItems 来获取 ChangeCollectionItemChange 个对象 . 我有两个代码分支 . 一个检索 FirstClassProperties ,一个检索 IdOnly . 我有一个名为 getItemStringProp() 的函数,根据分支,我要么直接使用 ItemChange 中的Item调用它,要么使用 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 回答

  • 1

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

相关问题