EWS:日历共享邀请和扩展属性
好吧,到目前为止,我已经获得有关此主题的最佳信息是在此主题上: EWS-API-Create-Calendar-and-Share-with-reviewer-permissions。我试图在该主题上提出这个问题,但我实际上已将其作为回答发布,因此被管理员删除(我的糟糕!)EWS:日历共享邀请和扩展属性
免责声明:我是一个由贸易和月光开发的系统管理员......请原谅任何滥用术语或混乱的行为。
另外,我正在C#这里工作。
我已经阅读了微软的消息协议规范,并理解某些扩展属性需要在消息项目上创建,以正确创建共享邀请对象我从上面提到的帖子了解到,我可以创建一个消息对象与扩展属性(准确地说是SetExtendedProperty(extprop,value)
)。我知道我必须使用new ExtendedProperty()
手动创建我设置的扩展属性,并在每个属性上填充正确的父GUID,HexID和数据类型。从我所能收集的信息来看,这或多或少是一种“解决方法”,因为API中没有固有的共享对象管理功能...
但是我碰到了一个问题,需要一些澄清...
我想手动创建共享邀请(通过客户端,“用户”方式),然后附加到发送邀请的用户的已发送邮件框中的邮件。我想枚举与我需要用来构建类似对象相关的所有可能属性,以便将其用作模板,并将我的对象属性与原始邀请进行比较。我可以很好地得到消息并找到许多属性,但不是任何“特殊”属性。我能找到的唯一区分邮件项目的事实是它的IPM.Sharing
项目类别,并且它具有sharing_metadata.xml
的附件。
但是,我是否正确地认为我们现在可以通过API使用扩展属性创建共享邀请,这并不意味着我们可以通过API读取这些属性?
我试图枚举扩展属性的一切似乎都不起作用,并且始终返回任何内容而不是扩展属性的数组。也许我做得不对,但我想在花费更多时间尝试实现一些不可能的事情之前提出这个问题。
所以,如果我不能正确列举扩展属性,是否有可能使用像ExFolders
或MFCMAPI
或MFCMAPI
或东西来获得这些属性?
任何想法/建议/批评?
谢谢!
UPDATE:
继承人我摆弄,试图创建一个共享邀请的用户日历文件夹功能...我已经作了评论我坚持,什么我不完全包裹我的头:
public void CreateCalendarSharingRequest(string folderID, string owner, string sharedToUser)
{
// LOAD OUR CUSTOM PROPERTIES
Guid PropertySetSharing = new Guid("{00062040-0000-0000-C000-000000000046}");
Guid PropertySetInternetHeaders = new Guid("{00020386-0000-0000-C000-000000000046}");
// Sharing Properties
ExtendedPropertyDefinition PidLidSharingProviderGuid = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A01, MapiPropertyType.CLSID);
ExtendedPropertyDefinition PidLidSharingProvidorName = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A02, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingFlavor = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A18, MapiPropertyType.Integer);
ExtendedPropertyDefinition PidLidSharingRemoteStoreUid = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A48, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingRemoteUid = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A06, MapiPropertyType.String);
ExtendedPropertyDefinition PidTagMessageClass = new ExtendedPropertyDefinition(0x001A, MapiPropertyType.String);
ExtendedPropertyDefinition PidTagNormalizedSubject = new ExtendedPropertyDefinition(0x0E1D, MapiPropertyType.String);
ExtendedPropertyDefinition PidTagSubjectPrefix = new ExtendedPropertyDefinition(0x003D, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingCapabilities = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A17, MapiPropertyType.Integer);
ExtendedPropertyDefinition PidLidSharingInitiatorEntryId = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A09, MapiPropertyType.Binary);
ExtendedPropertyDefinition PidLidSharingConfigurationUrl = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A24, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingInitiatorName = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A07, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingInitiatorSMTP = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A08, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingLocalType = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A14, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingRemoteType = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A1D, MapiPropertyType.String);
ExtendedPropertyDefinition PidLidSharingRemoteName = new ExtendedPropertyDefinition(PropertySetSharing, 0x8A05, MapiPropertyType.String);
// Internet Header Properties
ExtendedPropertyDefinition PidNameContentClass = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "Content-Class", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingCapabilities = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Capabilities", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingConfigUrl = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Config-Url", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingFlavor = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Flavor", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingLocalType = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Local-Type", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingRemoteName = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Remote-Name", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingRemoteStoreUid = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Remote-Store-Uid", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingRemoteType = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Remote-Type", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingRemoteUid = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Remote-Uid", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingProviderGuid = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Provider-Guid", MapiPropertyType.String);
ExtendedPropertyDefinition PidNameXSharingProviderName = new ExtendedPropertyDefinition(PropertySetInternetHeaders, "X-Sharing-Provider-Name", MapiPropertyType.String);
// Bind to the web services and currently selected folder
// Get the current list of delegates for this folder
ExchangeService service = GetExchangeService();
// Create a new message
EmailMessage invitationRequest = new EmailMessage(service);
invitationRequest.Subject = "I'd like to share my calendar with you";
invitationRequest.Body = "Send by Exchange Administrator on behalf of user";
invitationRequest.From = GetSMTPAddress(owner);
invitationRequest.ItemClass = "IPM.Sharing";
invitationRequest.SetExtendedProperty(PidNameContentClass, "Sharing");
invitationRequest.SetExtendedProperty(PidTagMessageClass, "IPM.Sharing");
invitationRequest.SetExtendedProperty(PidLidSharingFlavor,0x20310); /* Indicates Invitation for a special folder */
invitationRequest.SetExtendedProperty(PidNameXSharingFlavor, "20310"); /* Text representation of SharingFlavor value */
invitationRequest.SetExtendedProperty(PidLidSharingProviderGuid, PropertySetSharing.ToString());
invitationRequest.SetExtendedProperty(PidNameXSharingProviderGuid, PropertySetSharing.ToString());
invitationRequest.SetExtendedProperty(PidLidSharingCapabilities, 0x40290); /* value for Special Folders */
invitationRequest.SetExtendedProperty(PidNameXSharingCapabilities, "40290"); /* Test representation of SharingCapabilities value */
// THIS IS WHERE IM STUCK - I understand how to set some of the properties like above, but then
// it starts needing the entryID properties for the folder being shared, etc...and I'm not entirely
// sure which properties I have to set and how many can/will be autopopulated by the transport provider
// All i wanna do is send an invite message for sharing the calendar folder from one user to another!
// Add recipient info
//invitationRequest.ToRecipients.Add(sharedToUser);
//invitationRequest.SendAndSaveCopy();
}
更新:我一直在玩MFCMAPI,所以这看起来是一种去理解的方式邀请消息对象的属性如何显示。我认为我能够“构建”共享邀请消息的正确途径,但最初的问题依然存在:是否我们只能创建对象,但不能通过EWS读取“共享邀请特定”属性? – WillCodeForFood 2012-03-31 21:03:25
更新2:我正在更新,因为我在这方面取得进展,以便将来用户搜索如何执行此操作的答案)使用MFCMAPI,浏览创建邀请的用户的已发送项目的消息存储库(当然,这意味着您可以模仿)。您可以找到消息并将消息的所有属性导出到xml文件。我正在打印此文件,以便在闲暇时进行筛选,并在更多发现时进行更新... – WillCodeForFood 2012-03-31 21:12:57
更新3:好吧,现在我找到了一个名为EWSEditor的工具,由微软团队推出。这使我可以更好地查看邮件及其属性。我发现我可以用它来浏览邮件和附件,并提供更好的细节。希望我能稍后发布一些信息......但我相信你必须创建共享邀请信息,创建共享附件并发送这些信息。因此,需要熟悉的add'l规范是[MS-OXSHRMSG]文档在此[链接]说明(http://msdn.microsoft.com/en-us/library/cc425499(v = exchg.80))。 ASPX) – WillCodeForFood 2012-04-03 16:41:15