帐户之间的EWS扩展属性

时间:2018-10-18 14:20:15

标签: c# .net exchangewebservices outlook-addin

我们在EWS识别和设置ExtendedProperty时遇到问题。目前,我们具有导入电子邮件的功能,可以由用户手动完成,也可以由单独的服务完成。 Exchange与扩展属性的搜索方式以及设置方式似乎不一致。

为澄清起见,我将三个邮箱附加到Outlook应用程序。一个是我的,两个是测试帐户,这些帐户已链接到我的AD帐户。测试帐户包含由自动服务导入的电子邮件(将邮件发送给其中的一个时,会将其导入到我们的应用程序中,并在电子邮件上设置并设置ExtendedProperty,以提供已导入电子邮件的信息)。 / p>

在我这一边,在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论坛提供答案。我知道可能没有任何帮助,我知道我们只是无可救药地愚蠢并且犯了一些我们找不到的错误。

过一会儿,Exchange邮箱上的电子邮件只是副本-这是合理的原因,当另一个用户设置了“标志”时,我们无法访问收到的电子邮件的扩展属性。但是,也许有一种方法可以在这些邮箱之间同步这些属性?因为我们已经讨论了一些替代方法,但是如果至少可以重用当前解决方案的一部分,那就太好了。

0 个答案:

没有答案