我们在EWS识别和设置ExtendedProperty时遇到问题。目前,我们具有导入电子邮件的功能,可以由用户手动完成,也可以由单独的服务完成。 Exchange与扩展属性的搜索方式以及设置方式似乎不一致。
为澄清起见,我将三个邮箱附加到Outlook应用程序。一个是我的,两个是测试帐户,这些帐户已链接到我的AD帐户。测试帐户包含由自动服务导入的电子邮件(将邮件发送给其中的一个时,会将其导入到我们的应用程序中,并在电子邮件上设置并设置ExtendedProperty,以提供已导入电子邮件的信息)。 / p>
在我这一边,在Outlook加载项中,奇怪的是,尽管机制相同,但一方面在电子邮件上正确地标记了电子邮件,而另一方面却没有按应有的方式发生。
这些是我们加载项的代码。
这是检索电子邮件的代码:
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;
}
这是我同事写的标志设置方法:
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邮箱上的电子邮件只是副本-这是合理的原因,当另一个用户设置了“标志”时,我们无法访问收到的电子邮件的扩展属性。但是,也许有一种方法可以在这些邮箱之间同步这些属性?因为我们已经讨论了一些替代方法,但是如果至少可以重用当前解决方案的一部分,那就太好了。