2016-06-01 4 views
1

Здравствуйте, я недавно вступил в разработку вокруг EWS. Одна из проблем пришла ко мне в том, что клиент просит меня импортировать электронные письма в базу данных, и он хочет обнаружить дубликат на основе InternetMessageID таким образом, что ему не нужно импортировать дубликаты писем, и мой код подошел к этому моменту.Как получить MessageId со всех элементов обмена

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 из этих объектов. Поскольку у клиента использовалось другое программное обеспечение, которое извлекало этот идентификатор для них, возможно, свойство не называется internetMessageID, я думаю, что я, вероятно, должен извлечь его из internetMessageHeader. Однако когда я пытаюсь получить его из объекта item, это просто порождает ошибку. Как получить идентификатор интернет-сообщения из этих «специальных» предметов обмена?

PS я отдаю себе отчет в item.id.UniqueID, однако, что это не то, что я хочу, как этот идентификатор изменения, если переместить элементы из папки в другую в обмен

ответ

1

только те объекты, которые были отправлены через службу транспорта будет иметь InternetMessageId, поэтому такие вещи, как «Контакты» и «Задачи», потому что они не являются сообщениями и никогда не были маршрутизированы через транспортную службу, никогда не будут иметь Internet MessageId. Вероятно, вы хотите использовать несколько свойств для этого InternetMessageId, которые могут быть полезны для сообщений. PidTagSearchKey https://msdn.microsoft.com/en-us/library/office/cc815908.aspx - это тот, который можно использовать (если вы хорошо это знаете, есть различные примеры использования этого свойства).

Если вы собираетесь использовать его в коде, не используйте метод, используемый вами для загрузки свойства для каждого элемента, это очень неэффективно, так как он будет делать отдельный вызов для каждого объекта. Потому что они были бы ниже 256 Кб, а затем при использовании FindItems. например

 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/

+0

Единственной причиной, я думал, что это один является то, что клиент ранее имел приложение, извлекая идентификатор, который имел такой же формат как интернет-сообщение ID, поэтому я думал, что он один. Но это мог быть другой идентификатор, подобный тому, который вы упомянули. –

+0

Это потому, что когда я экспортирую электронное письмо, когда оно становится файлом msg, у него есть messageid? –

+0

Протестируйте его самостоятельно, используйте инструмент, такой как EWSEditor или MFCMapi, который точно скажет вам, что есть или не доступно –

Смежные вопросы