Exchangewebservices Outlook web加载项如何将信息保存到EWS中的客户属性

Exchangewebservices Outlook web加载项如何将信息保存到EWS中的客户属性,exchangewebservices,office-js,outlook-web-addins,Exchangewebservices,Office Js,Outlook Web Addins,使用Office.js API,我们可以通过customProps.set轻松地将额外信息保存到CustomProperties对象。该信息特定于邮件项目 医生是谁 我可以使用EWSAPI实现同样的功能吗 我试过了,但是无论通过这个方法保存了什么信息,我都无法使用Office.js的customProps.get检索它 用户案例是,我的外接程序将把电子邮件正文及其附件二进制文件保存到外部应用程序。完成后,客户端将使用Office.js的customProps.set将成功信息保存到服务器,如果您

使用Office.js API,我们可以通过
customProps.set
轻松地将额外信息保存到
CustomProperties
对象。该信息特定于邮件项目

医生是谁

我可以使用
EWS
API实现同样的功能吗

我试过了,但是无论通过这个方法保存了什么信息,我都无法使用Office.js的
customProps.get
检索它

用户案例是,我的外接程序将把电子邮件正文及其附件二进制文件保存到外部应用程序。完成后,客户端将使用Office.js的
customProps.set
将成功信息保存到服务器,如果您下次单击同一封电子邮件,应用程序将使用
customProps.get
显示电子邮件已保存。但是,如果在漫长的保存过程中(可能保存一个大附件),用户在执行
customProps.set
之前关闭任务窗格,那么
customProps.set
将不会启动,因为浏览器环境(任务窗格)已关闭。因此,我需要使用EWS的API实现这一点

我的C#代码:

JS代码:

Office.context.mailbox.item.loadCustomPropertiesAsync(function (asyncResult) {
                var customProps = asyncResult.value;
                console.log(customProps);
                console.log(customProps.get('Expiration Date')); //undefined
})

是的,您可以这样做,但是这些类型的属性遵循特定的格式,因为它们是特定于应用程序的。这在中有记录。它们是类型字符串的PS_PUBLIC_STRING propset中的命名属性。属性的属性名称以cecp为前缀,其余属性名称是中定义的邮件应用程序的GUID应用程序的清单Id。查看此项的最佳方式是查看您在MAPI编辑器(如MFCMapi的OutlookSpy)中设置属性的项目,您可以在其中查看属性(易于使用Cecp前缀识别)和值的格式(JSON)

编辑代码示例

        ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "cecp-a8e14732-37cf-4a46-b69f-1111111111", MapiPropertyType.String);
        Email.SetExtendedProperty(extendedPropertyDefinition, "{\"Expiration Date\":\"blah\"}");

最后,我用这段代码将信息保存到扩展的自定义属性中,这些属性可以使用
Office.js
读取

ExchangeService service = new ExchangeService();

service.Credentials = new WebCredentials("{email}", "{password}");

Guid PS_PUBLIC_STRINGS = new Guid("00020329-0000-0000-C000-000000000046"); //PS_PUBLIC_STRINGS' GUID
ExtendedPropertyDefinition extendedPropertyDefinition =
            new ExtendedPropertyDefinition(PS_PUBLIC_STRINGS, "cecp-{add-in manifest id}", MapiPropertyType.String);
Email.SetExtendedProperty(extendedPropertyDefinition, {JSON});

Email.Update(ConflictResolutionMode.AlwaysOverwrite);
它可以工作。请注意,为了能够执行此“写入”操作,我需要将身份验证从
OAUTH
更改为
basic
(电子邮件+密码)。我认为这不是一种可靠的方法,不应推荐用于生产环境。

是否可以提供一些代码示例?既可以使用EWS保存,也可以使用Office.js检索?我觉得文档不是很简单……根据您提供的内容添加了示例,Get应该可以正常工作,但使用MAPI编辑器并仔细检查所有内容。这非常简单,您应该尝试学习一项技能。我发现了命名的属性和使用OutlookSpy的JSON值,但我的原始代码不起作用,因为从Office.js返回的访问令牌不允许我更新电子邮件…Office.js提供的令牌只能用于此处记录的方法:@GlenScales建议的答案有效,但我们不建议直接编辑属性n服务器。您可以提前标记自定义属性并将信息保存在服务器中作为解决方法。如何通过EWS从JS获取customProps。下面的代码不起作用“Office.JS提供的令牌只能用于此处记录的方法:docs.microsoft.com/en-us/outlook/add-ins/web-services。您可以参考此链接查找直接向EWS进行身份验证的方法:。
ExchangeService service = new ExchangeService();

service.Credentials = new WebCredentials("{email}", "{password}");

Guid PS_PUBLIC_STRINGS = new Guid("00020329-0000-0000-C000-000000000046"); //PS_PUBLIC_STRINGS' GUID
ExtendedPropertyDefinition extendedPropertyDefinition =
            new ExtendedPropertyDefinition(PS_PUBLIC_STRINGS, "cecp-{add-in manifest id}", MapiPropertyType.String);
Email.SetExtendedProperty(extendedPropertyDefinition, {JSON});

Email.Update(ConflictResolutionMode.AlwaysOverwrite);