Расширенные свойства EWS между учетными записями - PullRequest
0 голосов
/ 18 октября 2018

мы столкнулись с проблемой распознавания и установки ExtendedProperties в EWS.Прямо сейчас у нас есть функция для импорта электронной почты, которая может быть сделана вручную пользователем или отдельным сервисом.Кажется, есть несоответствие с тем, как Exchange выполняет поиск по ExtendedProperties и как они установлены.

Для пояснения, у меня есть три почтовых ящика, прикрепленных к приложению Outlook.Один мой и два тестовых аккаунта, которые связаны с моей учетной записью AD.Тестовые учетные записи содержат электронные письма, которые импортируются автоматической службой (когда электронное письмо отправляется одному из них, оно импортируется в наше приложение, и в нем установлено и ExtendedProperty, предоставляя информацию о том, что электронное письмо было импортировано).

Что странно, с моей стороны, в надстройке Outlook, что в одной учетной записи письма помечены правильно, а в другой - не так, как должно, несмотря на то, что механизм тот же.

Это коды нашей надстройки.

  1. Это код получения электронных писем:

    private static IEnumerable<EmailMessage> GetEmails(Microsoft.Exchange.WebServices.Data.Folder folder, int pageSize, DateTime lastImport)
    {
        SearchFilter filter = PrepareFilter(lastImport);
    
        List<Item> foundItems = new List<Item>();
    
        Guid propertySetId = new Guid("F723C954-3F83-46AA-A783-FDEAC90AE512");
        ExtendedPropertyDefinition registered = new ExtendedPropertyDefinition(propertySetId, "Registered", MapiPropertyType.Boolean);
    
        ItemView view = new ItemView(pageSize);
        view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, registered);
        foundItems = service.FindItems(folder.Id, filter, view).Items.ToList();
    
        List<EmailMessage> results = new List<EmailMessage>();
        foreach (EmailMessage message in foundItems)
        {
            results.Add(message);
        }
    
        return results;
    }
    
    private static SearchFilter PrepareFilter(DateTime lastImport)
    {
        Guid propertySetId = new Guid("F723C954-3F83-46AA-A783-FDEAC90AE512");
        ExtendedPropertyDefinition Registered= new ExtendedPropertyDefinition(propertySetId, "Registered", MapiPropertyType.Boolean);
    
        SearchFilter isRegistered = new SearchFilter.IsEqualTo(registered, true);
    
        return isRegistered;
    }
    
  2. И этоэто метод установки флага, написанный моим коллегой:

    public static bool SetExchangeRegistered(List<MailItem> mailsToRegister)
    {
        try
        {
            var service = new Exchange.ExchangeService(Exchange.ExchangeVersion.Exchange2010)
            {
                UseDefaultCredentials = true
            };
    
            var emailAddress = new Application().ActiveExplorer().Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress;
            service.AutodiscoverUrl(emailAddress);
    
            foreach (var mail in mailsToRegister)
            {
                string itemId = ConvertHexEntryIdToEwsId(service, mail.EntryID, emailAddress);
    
                Exchange.EmailMessage message = Exchange.EmailMessage.Bind(service, new Exchange.ItemId(itemId));
    
                bool propertyRegisteredExists =
                    message.ExtendedProperties.FirstOrDefault(x => x.PropertyDefinition.Name == "Registered") != null;
    
                if (!propertyRegisteredExists)
                {
                    Guid propertySetId = new Guid("F723C954-3F83-46AA-A783-FDEAC90AE512");
                    Exchange.ExtendedPropertyDefinition registered =
                        new Exchange.ExtendedPropertyDefinition(propertySetId, "Re", Exchange.MapiPropertyType.Boolean);
    
                    message.SetExtendedProperty(registered, true);
                }
                else
                {
                    message.ExtendedProperties.First(x => x.PropertyDefinition.Name == "Registered").Value = true;
                }
    
                message.Update(Exchange.ConflictResolutionMode.AlwaysOverwrite);
            }
        }
        catch (Exception ex)
        {
            grmtAddInBase.Logger.Trace(string.Format("Registered update failed: {0}", ex.Message));
            return false;
        }
    
        grmtAddInBase.Logger.Trace("Email property 'Registered' updated successfully");
        return true;
    }
    

Как правило, приведенный выше метод в потоке управления кажется идентичным методу, который реализован в отдельной службе, и онкажется, что он действительно устанавливает ExtendedProperty электронной почты правильно.

Еще одна подсказка, которая, если честно, оставляет меня в неведении, заключается в том, что даже когда я пытался получить всеэлектронные письма с жадностью загружают их, а затем разделяют правильные по их ExtendedProperty, который мы установили ... Проблема в том, что для некоторых электронных писем (то есть внутри одного из почтовых ящиков, которые обрабатываются службой автоимпорта), он видит свойства правильно ив остальном (т.е. мой собственный почтовый ящик) он даже не загружается и ExtProps, что означает, что он, вероятно, не видит их вообще.

Я также пытался использовать DefaultExtendedPropertySet.PublicStrings, но потом это невообще не работает.

Я немного озадачен, и никто в непосредственной близости или EWS docs / MS Forums не может дать ответ.Я знаю, что, возможно, не будет никакой помощи, я знаю, что мы просто безнадежно глупы и допустили какую-то ошибку, которую не можем найти.

Через некоторое время электронные письма на почтовых ящиках Exchange становятся просто копиями -это было бы разумной причиной, по которой мы не можем получить доступ к ExtendedProperties полученного нами электронного письма, когда его «флаг» был установлен другим пользователем.Но, может быть, есть способ синхронизировать эти свойства между этими почтовыми ящиками?Потому что уже есть некоторые альтернативы, которые мы обсудим, но было бы неплохо, если бы хотя бы часть текущего решения могла быть повторно использована.

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