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

时间:2018-10-30 01:24:33

标签: exchangewebservices office-js outlook-web-addins

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

这是文档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
})

2 个答案:

答案 0 :(得分:1)

是的,您可以这样做,但是这些类型的属性遵循特定的格式,因为它们是特定于应用程序的。 https://msdn.microsoft.com/en-us/library/hh968549(v=exchg.80).aspx中对此进行了说明。它们是String类型的PS_PUBLIC_STRING属性集中的命名属性。该属性的属性名称以cecp-为前缀,其余的属性是您的Mail Apps的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\"}");

答案 1 :(得分:0)

我最终得到了这段代码,将信息保存到扩展的自定义属性中,可以使用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(电子邮件+密码)。而且我不认为这是一种可靠的方法,因此不建议在生产环境中使用。 Why not recommended?