C # Управляемый EWS получает электронную почту по идентификатору из общего почтового ящика - PullRequest
0 голосов
/ 19 сентября 2018

Я использую EWS для управления электронной почтой общего почтового ящика через консольное приложение.

После обработки они перемещаются в другую папку в общей папке входящих сообщений (после сохранения идентификатора сообщения в записи SQL).).

Через отдельный процесс я хочу получить электронное письмо, используя идентификатор.

При использовании кода:

var email = EmailMessage.Bind(serviceInstance, new ItemId(id));

Служба выдает это исключение:

Microsoft.Exchange.WebServices.Data.ServiceResponseException: 'Указанный объект не найден в хранилище. Процесс не смог получить правильные свойства.'

Я знаючто у пользователя службы есть разрешения на входящие и папки, так как эта же служба ранее прочитала входящие и переместила электронное письмо.

1 Ответ

0 голосов
/ 19 сентября 2018

Причина в соответствии с документацией MS :

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

Поэтому вы получаете исключение: The specified object was not found in the store.

Как обойти это?

Перед обработкой почтового сообщения создайте настраиваемое расширенное свойство , установите его в сообщении электронной почты и сохраните сообщение электронной почты, чтобы поделиться новым состоянием с сервером EWS.

Guid myPropertySetId = new Guid("{20B5C09F-7CAD-44c6-BDBF-8FCBEEA08544}"); 
ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "MyExtendedPropertyName", MapiPropertyType.String); 
message.SetExtendedProperty(myExtendedPropertyDefinition, "MyExtendedPropertyValueIdentifingAnEmailMessageToBeMoved");
message.SendAndSaveCopy(); 

Сохраните значение myExtendedPropertyDefinition (в приведенном выше примере: "MyExtendedPropertyValueIdentifingAnEmailMessageToBeMoved") перед перемещением сообщения электронной почты.Затем вы можете переместить сообщение электронной почты в его папку назначения.

После того, как исходное письмо было обработано (перемещено> удалено), вы можете найти сообщение электронной почты в его новом месте назначения путем поиска дляпользовательское свойство и значение, которое вы сохранили для идентификации сообщения электронной почты:

ItemView view = new ItemView(5); 
SearchFilter searchFilter = new SearchFilter.IsEqualTo(myExtendedPropertyDefinition, "MyExtendedPropertyValueIdentifingAnEmailMessageToBeMoved"); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, myExtendedPropertyDefinition); 
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.SentItems, searchFilter, view); 

Используйте для каждого сообщения электронной почты уникальное идентифицирующее значение для получения одного результата поиска.

Обратите внимание, что этоОбходной путь - официально предложенный (MS) подход, описанный в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...