Outlook 如何使用EWS或EWS托管API创建用户属性,以便它们显示在字段选择器中

Outlook 如何使用EWS或EWS托管API创建用户属性,以便它们显示在字段选择器中,outlook,dynamics-crm,exchangewebservices,Outlook,Dynamics Crm,Exchangewebservices,我想使用EWS创建用户属性,以便它们显示在Outlook的字段选择器中。我知道使用VBA是可能的,对象模型会公开Item.UserProperties集合。但是,使用EWS,我只能访问Item.ExtendedProperty ExtendedProperty的问题是它没有出现在可选用户属性列表中 根本的问题是,我们的服务器端应用程序试图与Dynamics CRM Outlook客户端很好地协同工作。CRM Outlook客户端使用UserProperty存储自定义属性,我们的应用程序只能与EW

我想使用EWS创建用户属性,以便它们显示在Outlook的字段选择器中。我知道使用VBA是可能的,对象模型会公开Item.UserProperties集合。但是,使用EWS,我只能访问Item.ExtendedProperty

ExtendedProperty的问题是它没有出现在可选用户属性列表中

根本的问题是,我们的服务器端应用程序试图与Dynamics CRM Outlook客户端很好地协同工作。CRM Outlook客户端使用UserProperty存储自定义属性,我们的应用程序只能与EWS一起使用,我们无法找到创建用户属性的方法

一些示例代码:

用户属性(VBA Outlook):

使用事件m_objApp作为Outlook.AppointmentItem进行暗显

私有子应用程序_ItemLoad(ByVal项作为对象)

端接头

专用子m_objApp_打开(取消为布尔值)

端接头

扩展属性(Exchange EWS):

CalendarItemType item=新的CalendarItemType();
item.MeetingTimeZone=新时区类型(){TimeZoneName=\u userTimeZone};
item.StartSpecified=真;
item.Start=GetDateFromXml(node.Value);
item.EndSpecified=true;
item.End=GetDateFromXml(node.Value);
列表属性=新列表();
添加(CreateExtendedProperty(“crmid”,pending.crmid.Value.ToString(),MapPropertyTypeType.String));
添加(CreateExtendedProperty(“crmLinkState”,“2”,MapPropertyTypeType.Double));
item.ExtendedProperty=properties.ToArray();
CreateRequest CreateRequest=新建CreateItemType()
{
Items=新的非空阵列AllitemType
{
Items=新的ItemType[]{item}
},
SavedItemFolderId=新的targetFolderId类型()
{
Item=新的DifferentiedFolderIDType()
{
Id=文件夹,
邮箱=新的EmailAddressType(){EmailAddress=\u user.Mailbox}
}
},
SendMeetingInvestments=CalendarItemCreateOrDeleteOperationType.SendToNone,
SendMeetingInvitationsSpecified=真
};
CreateItemResponseType响应=exchange.CreateItem(createRequest);
私有ExtendedPropertyType CreateExtendedProperty(字符串名称、字符串值、MapPropertyTypeType类型)
{
返回新的ExtendedPropertyType()
{
ExtendedFieldURI=新路径到ExtendedFieldType()
{
PropertyName=名称,
DifferentiedPropertySetId=DifferentiedPropertySetType.PublicString,
DifferentiedPropertySetId=true,
PropertyType=类型
},
项目=价值
};
}
差不多一年前,在微软的一个论坛上也有人问过类似的问题,但至今没有答案

我希望这样会更成功:)

谢谢,
Jeffry

我认为只要您使用PublicString(看起来是这样的),这两种方法是等效的。使用MFCMAPI查看生成内容的差异如何?

我在一些网站上看到了一些可能的答案。我还没有时间测试它。基本上a)EWS必须使用PUBLICSTRINGS guid。b) 您必须在所有相关文件夹中有一个addin循环,并确保userProperty已添加到集合c)然后您可以自定义列视图,等等。
If Item.Class = olAppointment Then
    Set m_objApp = Item
End If
Dim oProp1 As UserProperty
Dim oProp2 As UserProperty

If m_objApp.UserProperties.Count = 0 Then
    Set oProp1 = m_objApp.UserProperties.Add("crmid", olText)
    oProp1.Value = ""
    Set oProp2 = m_objApp.UserProperties.Add("crmLinkState", olText)
    oProp2.Value = "0"
    m_objApp.Save
End If
        CalendarItemType item = new CalendarItemType();
        item.MeetingTimeZone = new TimeZoneType() { TimeZoneName = _userTimeZone };
        item.StartSpecified = true;
        item.Start = GetDateFromXml(node.Value);
        item.EndSpecified = true;
        item.End = GetDateFromXml(node.Value);

        List<ExtendedPropertyType> properties = new List<ExtendedPropertyType>();
        properties.Add(CreateExtendedProperty("crmid", pending.CrmId.Value.ToString(), MapiPropertyTypeType.String));
        properties.Add(CreateExtendedProperty("crmLinkState", "2", MapiPropertyTypeType.Double));
        item.ExtendedProperty = properties.ToArray();

        CreateRequest createRequest = new CreateItemType()
            {
                Items = new NonEmptyArrayOfAllItemsType
                {
                    Items = new ItemType[] { item }
                },
                SavedItemFolderId = new TargetFolderIdType()
                {
                    Item = new DistinguishedFolderIdType()
                    {
                        Id = folder,
                        Mailbox = new EmailAddressType() { EmailAddress = _user.MailBox }
                    }
                },
                SendMeetingInvitations = CalendarItemCreateOrDeleteOperationType.SendToNone,
                SendMeetingInvitationsSpecified = true
            };

       CreateItemResponseType response = exchange.CreateItem(createRequest);

    private ExtendedPropertyType CreateExtendedProperty(string name, string value, MapiPropertyTypeType type)
    {
        return new ExtendedPropertyType()
        {
            ExtendedFieldURI = new PathToExtendedFieldType()
            {
                PropertyName = name,
                DistinguishedPropertySetId = DistinguishedPropertySetType.PublicStrings,
                DistinguishedPropertySetIdSpecified = true,
                PropertyType = type
            },
            Item = value
        };
    }