Outlook Web 插件 如何将信息保存到 EWS 中的客户属性
Outlook web add-in How to save info to customer properties in EWS
使用 Office.js API 我们可以通过 customProps.set
轻松地将额外信息保存到 CustomProperties
对象。该信息特定于邮件项目。
这是文档 Save to custom properties using office.js
我可以使用 EWS
API 实现同样的事情吗?
我试过 Creating custom extended properties by using the EWS Managed API 2.0 但是无论通过这种方法保存的信息是什么,我都无法使用 Office.js 的 customProps.get
.
检索它
用户案例是我的加载项将电子邮件正文及其附件二进制文件保存到外部应用程序。完成后,客户端将使用 Office.js 的 customProps.set
将成功信息保存到服务器,如果您下次单击同一封电子邮件,应用程序将使用 customProps.get
向您显示电子邮件已保存。但是如果在冗长的保存过程中(可能保存一个大附件),用户关闭任务窗格,在执行 customProps.set
之前,customProps.set
将不会触发,因为浏览器环境(任务窗格)是关闭。所以我需要使用 EWS 的 API.
来实现它
我的 C# 代码:
Guid PS_PUBLIC_STRINGS = new Guid("a8e14732-37cf-4a46-b69f-1111111111");//add-in manifest id
ExtendedPropertyDefinition extendedPropertyDefinition =
new ExtendedPropertyDefinition(PS_PUBLIC_STRINGS, "Expiration Date", MapiPropertyType.String);
Email.SetExtendedProperty(extendedPropertyDefinition, DateTime.Now.AddDays(2).ToString());
Email.Update(ConflictResolutionMode.AlwaysOverwrite);//'The requested web method is unavailable to this caller or application.'
JS代码:
Office.context.mailbox.item.loadCustomPropertiesAsync(function (asyncResult) {
var customProps = asyncResult.value;
console.log(customProps);
console.log(customProps.get('Expiration Date')); //undefined
})
是的,您可以这样做,但这些类型的属性遵循特定格式,因为它们是特定于应用程序的。这记录在 https://msdn.microsoft.com/en-us/library/hh968549(v=exchg.80).aspx 中。它们是 PS_PUBLIC_STRING 类型字符串中的命名 属性。 属性 的 属性 名称以 cecp- 为前缀,属性 名称的其余部分是应用程序清单 Id 中定义的邮件应用程序的 GUID。查看此内容的最佳方法是查看您在 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);
有效。请注意,为了能够执行此 "write" 操作,我需要将身份验证从 OAUTH
更改为 basic
(电子邮件+密码)。而且我不认为这是一种可靠的方式,不应该推荐用于生产环境。
Why not recommended?
使用 Office.js API 我们可以通过 customProps.set
轻松地将额外信息保存到 CustomProperties
对象。该信息特定于邮件项目。
这是文档 Save to custom properties using office.js
我可以使用 EWS
API 实现同样的事情吗?
我试过 Creating custom extended properties by using the EWS Managed API 2.0 但是无论通过这种方法保存的信息是什么,我都无法使用 Office.js 的 customProps.get
.
用户案例是我的加载项将电子邮件正文及其附件二进制文件保存到外部应用程序。完成后,客户端将使用 Office.js 的 customProps.set
将成功信息保存到服务器,如果您下次单击同一封电子邮件,应用程序将使用 customProps.get
向您显示电子邮件已保存。但是如果在冗长的保存过程中(可能保存一个大附件),用户关闭任务窗格,在执行 customProps.set
之前,customProps.set
将不会触发,因为浏览器环境(任务窗格)是关闭。所以我需要使用 EWS 的 API.
我的 C# 代码:
Guid PS_PUBLIC_STRINGS = new Guid("a8e14732-37cf-4a46-b69f-1111111111");//add-in manifest id
ExtendedPropertyDefinition extendedPropertyDefinition =
new ExtendedPropertyDefinition(PS_PUBLIC_STRINGS, "Expiration Date", MapiPropertyType.String);
Email.SetExtendedProperty(extendedPropertyDefinition, DateTime.Now.AddDays(2).ToString());
Email.Update(ConflictResolutionMode.AlwaysOverwrite);//'The requested web method is unavailable to this caller or application.'
JS代码:
Office.context.mailbox.item.loadCustomPropertiesAsync(function (asyncResult) {
var customProps = asyncResult.value;
console.log(customProps);
console.log(customProps.get('Expiration Date')); //undefined
})
是的,您可以这样做,但这些类型的属性遵循特定格式,因为它们是特定于应用程序的。这记录在 https://msdn.microsoft.com/en-us/library/hh968549(v=exchg.80).aspx 中。它们是 PS_PUBLIC_STRING 类型字符串中的命名 属性。 属性 的 属性 名称以 cecp- 为前缀,属性 名称的其余部分是应用程序清单 Id 中定义的邮件应用程序的 GUID。查看此内容的最佳方法是查看您在 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);
有效。请注意,为了能够执行此 "write" 操作,我需要将身份验证从 OAUTH
更改为 basic
(电子邮件+密码)。而且我不认为这是一种可靠的方式,不应该推荐用于生产环境。
Why not recommended?