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

时间:2014-10-23 18:39:36

标签: c# outlook outlook-redemption

我正在尝试编写一个C#应用程序,用于打开Outlook自定义邮件项并填写多个用户属性。我能够通过使用Microsoft Outlook Interop这样做。但每次我尝试更改某些用户属性时,我都会收到烦人的安全警告。我发现Redemption是避免这种情况的完美工具。但是当我尝试更改用户属性时,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来更改用户属性?

1 个答案:

答案 0 :(得分:0)

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

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);