如何使用C#中的Redemption访问自定义outlook邮件项目的用户属性

本文关键字:项目 属性 用户 outlook 自定义 何使用 中的 Redemption 访问 | 更新日期: 2023-09-27 18:27:47

我正在尝试编写一个C#应用程序,该应用程序打开一个outlook自定义邮件项并填充多个用户属性。我可以通过使用Microsoft Outlook Interop来做到这一点。但每次我试图更改一些用户属性时,都会收到令人讨厌的安全警告。我发现救赎是避免这种情况的完美工具。但当我尝试更改用户属性时,Redemption会创建一个新的属性,而不是使用现有的属性。

这是我用来用Outlook Interop更改属性的代码(弹出安全警告):

string customPropertyNamespace = "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/";    
Outlook._Items oItems = oPublicFolder.Folders["Babillards"].Folders["SYSOTI"].Folders["MEP"].Items;
Outlook._MailItem oMep = oItems.Add("ipm.note.mep");
oMep.PropertyAccessor.SetProperty(customPropertyNamespace + "prop1", "SomeText");
oMep.Display(false);

这一切都很好,除了安全警告。。。

这是我尝试使用的兑换代码:

string customPropertyGUID = "{00020329-0000-0000-C000-000000000046}";    
Outlook._Items oItems = oPublicFolder.Folders["Babillards"].Folders["SYSOTI"].Folders["MEP"].Items;
Outlook._MailItem oMep = oItems.Add("ipm.note.mep");
Redemption.SafeMailItem Mep = new Redemption.SafeMailItem();
Mep.Item = oMep;
Mep.set_Fields(Mep.GetIDsFromNames(customPropertyGUID, "prop1"), "SomeText");
oMep.Display(false);

据我所知,这应该可行。但是,我的邮件页面打开时,所有字段都为空。通过使用OutlookSpy,我发现Redemption用这个DASL:创建了一个新的属性

http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/prop1/0x0000001F

而不是:

http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/prop1

有人能帮我吗?我也尝试过使用Redemption.MAPIUtils,但最终得到了完全相同的结果。有没有一种方法可以通过传递DASL而不是GUID和ID来更改用户属性?

如何使用C#中的Redemption访问自定义outlook邮件项目的用户属性

两个属性名称完全相同-最后一部分(0x0000001F)只是属性类型(=PT_UNICODE)。你所说的"我的邮件页面打开时所有字段都为空"到底是什么意思?是否有一个自定义表单,其中控件绑定到用户字段?还要记住,在项目完全取消引用并重新打开之前,Outlook可能看不到MAPI所做的所有最新更改。重新启动Outlook并重新打开现有项目后,是否使用数据?若要避免Outlook缓存问题,请尝试使用Redemption创建邮件,设置属性,然后使用Outlook打开邮件。有点像下面(从我的头顶):

string customPropertyNamespace = "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/";    
Outlook.Forlder oFolder = oPublicFolder.Folders["Babillards"].Folders["SYSOTI"].Folders["MEP"];
Redemption.RDOSession session = new RDOSesssion();
session.MAPUIOBJECT = Application.Session.MAPIOBJECT;
Redemption.RDOFolder rFolder = session.(RDOFolder)session.GetRDOObjectfromOutlookObject(oFolder);
Redemption.RDOMail rMsg = rFolder.Items.Add("ipm.note.mep");
rMsg.Fields[customPropertyNamespace + "prop1"] = "SomeText";
rMsg.Save();
//reopen in Outlook and display. Or you can use rMsg.Display()
Outlook._MailItem oMep = Application.Session.GetItemFromID(rMsg.EntryID);
oMep.Display(false);