Фильтр поиска EWS ExtendedPropertyDefinition больше не фильтруетC#

Место общения программистов C#
Ответить
Anonymous
 Фильтр поиска EWS ExtendedPropertyDefinition больше не фильтрует

Сообщение Anonymous »

Буквально более десяти лет у нас есть код C#, который взаимодействует с Exchange через EWS. Практически все наши клиенты перешли на Office 365, и до недавнего времени наш код прекрасно работал на O365 через EWS.
Наше программное обеспечение обрабатывает электронные письма, поступающие в почтовый ящик Exchange. Этот почтовый ящик используется как людьми, так и нашим программным обеспечением, поэтому мы использовали ExtendedProperty, чтобы отслеживать, какие электронные письма мы обработали. Код такой:

Код: Выделить всё

// Build our extended property definition
Guid readByEmailComponentGUID = new Guid("{FCF74ABF-684E-4cc7-8A83-B36D3A209219}"); //GUID for our property
ExtendedPropertyDefinition X_READBYCOMPONENT = new ExtendedPropertyDefinition(readByEmailComponentGUID, "X_READBYCOMPONENT", MapiPropertyType.Boolean);   //Settings and name for our property

// Create a search filter for querying EWS
SearchFilter.SearchFilterCollection srchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.Or);
srchFilter.Add(new SearchFilter.Not(new SearchFilter.Exists(X_READBYCOMPONENT)));  //Show messages that do not have our new property (thus have never been received)
srchFilter.Add(new SearchFilter.IsEqualTo(X_READBYCOMPONENT, false));              //Show messages that have our new property, but it's set to false (to re-receive)

ItemView view = new ItemView(250, 0, OffsetBasePoint.Beginning);

// Query EWS with our search filter and our view
FindItemsResults findResults = EWSService.FindItems("Inbox", srchFilter, view);

// Process the results of our search
foreach (Item item in findResults){
// Check to see if this email has our internal read flag on it, and if it does, do not process it again.
ExtendedProperty ReadByComponentFlag = item.ExtendedProperties.FirstOrDefault(itm => itm.PropertyDefinition == X_READBYCOMPONENT);
if (!(ReadByComponentFlag is null) && (bool)ReadByComponentFlag.Value == true)
{
continue;
}

if (item is EmailMessage){
EmailMessage em = item as EmailMessage;     //Load the email message

// process the mail message and when that's done mark it as read

em.SetExtendedProperty(X_READBYCOMPONENT, true);   //Sets our new property to TRUE to exclude this email from future receive actions
em.Update(ConflictResolutionMode.NeverOverwrite);

}
}
С 2011 года этот код работал блестяще, но примерно месяц назад у наших клиентов Office 365 перестали работать фильтры поиска, и EWS возвращал каждое сообщение электронной почты. Проверяя сообщения электронной почты по мере их поступления и вручную просматривая их расширенные свойства, я вижу, что наше пользовательское свойство присутствует и что для него по-прежнему установлено значение true.
Изменилось ли что-нибудь в том, как EWS на O365 обрабатывает эти фильтры? Кто-нибудь еще сталкивался с подобными проблемами?
Прямо сейчас мы добавили обходной путь (который вы можете увидеть в коде выше), позволяющий вручную проверять расширенные свойства и пропускать электронные письма, но это это не жизнеспособное долгосрочное решение, поскольку в некоторых из этих почтовых ящиков находится 14 000 электронных писем, которые мы извлекаем и получаем при каждом запуске.

Подробнее здесь: https://stackoverflow.com/questions/767 ... -filtering
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»