如何从所有交换项中获取MessageId

时间:2016-06-01 14:38:44

标签: c# .net exchange-server exchangewebservices

您好我最近围绕EWS进行了开发。我遇到的一个问题是,客户端要求我将电子邮件导入数据库,他希望根据InternetMessageID检测重复项,这样他就不必导入重复的电子邮件,我的代码就来了点。

 private static string GetInternetMessageID(Microsoft.Exchange.WebServices.Data.Item email)
{
EmailMessage emailMsg = email as EmailMessage;
string returnId = string.Empty;
if ((emailMsg != null)) {
    try {
        emailMsg.Load();
        //loads additional info, without calling this ToRecipients (and more) is empty
    } catch (ArgumentException ex) {
        //retry
        email.Load();
    }
    returnId = emailMsg.InternetMessageId;
} else {
    //what to do?
}
return returnId;

}

我可以处理常规电子邮件,但是对于特殊的交换对象,例如联系人,日历,帖子等,它不起作用,因为它无法将其强制转换为EmailMessage对象。

我知道你可以从这些对象中提取internetMessageId。因为客户端曾经有另一个软件为他们提取这个ID,也许该属性不被称为internetMessageID,我想我可能不得不从internetMessageHeader中提取它。但是,当我尝试从item对象中获取它时,它只会抛出一个错误。如何从这些"特殊"获取互联网消息ID?交换项目?

PS我知道item.id.UniqueID然而这不是我想要的,因为如果我将项目从文件夹移动到另一个文件夹进行交换

1 个答案:

答案 0 :(得分:1)

只有通过传输服务发送的对象才具有InternetMessageId,因此它们不是联系人和任务,因为它们不是消息,并且从未通过传输服务路由,所以永远不会有Internet MessageId。您可能希望查看使用一些属性来执行此操作InternetMessageId对消息有用PidTagSearchKey https://msdn.microsoft.com/en-us/library/office/cc815908.aspx是可以使用的(如果您对此有好处,则有各种使用此属性的示例)。

如果您要在Code中使用它,请不要使用您使用的方法在每个项目上加载属性,这是非常低效的,因为它将为每个对象单独调用。因为当我使用FindItems时,我们只需要检索256 Kb。例如

        ExtendedPropertyDefinition PidTagSearchKey = new ExtendedPropertyDefinition(0x300B, MapiPropertyType.Binary);
        ExtendedPropertyDefinition PidTagInternetMessageId = new ExtendedPropertyDefinition(0x1035, MapiPropertyType.String);
        PropertySet psPropSet = new PropertySet(BasePropertySet.IdOnly);
        psPropSet.Add(PidTagSearchKey);
        psPropSet.Add(PidTagInternetMessageId);
        ItemView ItemVeiwSet = new ItemView(1000);
        ItemVeiwSet.PropertySet = psPropSet;
        FindItemsResults<Item> fiRess = null;
        do
        {
            fiRess = service.FindItems(WellKnownFolderName.Inbox, ItemVeiwSet);
            foreach (Item itItem in fiRess)
            {
                Object SearchKeyVal = null;
                if (itItem.TryGetProperty(PidTagSearchKey, out SearchKeyVal))                                   
                {
                    Console.WriteLine(BitConverter.ToString((Byte[])SearchKeyVal));
                }
                Object InternetMessageIdVal = null;
                if (itItem.TryGetProperty(PidTagInternetMessageId, out InternetMessageIdVal))                                   
                {
                    Console.WriteLine(InternetMessageIdVal);
                }
            }
            ItemVeiwSet.Offset += fiRess.Items.Count;
        } while (fiRess.MoreAvailable);

如果你需要更大的属性,比如使用LoadPropertiesForItems方法的https://blogs.msdn.microsoft.com/exchangedev/2010/03/16/loading-properties-for-multiple-items-with-one-call-to-exchange-web-services/