【问题标题】:How to access a user property of a custom outlook mail item with Redemption in C#如何在 C# 中使用 Redemption 访问自定义 Outlook 邮件项的用户属性
【发布时间】:2014-10-24 03:43:20
【问题描述】:

我正在尝试编写一个打开 Outlook 自定义邮件项并填写多个用户属性的 C# 应用程序。我可以通过使用 Microsoft Outlook 互操作来做到这一点。但是每次尝试更改某些用户属性时,我都会收到烦人的安全警告。我发现 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 来更改用户属性?

【问题讨论】:

    标签: c# outlook outlook-redemption


    【解决方案1】:

    这两个属性名称完全相同 - 最后一部分 (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);
    

    【讨论】:

    • 是的,我有一个自定义表单,其中包含绑定到用户字段的控件。运行该行时: session.GetRDOObjectFromOutlookObject(oFolder);我收到错误 System.Runtime.InteropServices.SEHException 外部组件已引发异常
    • 那行应该是 Redemption.RDOFolder rFolder = (RDOFolder)session.GetRDOObjectfromOutlookObject(oFolder)
    • 感谢您的帮助,非常感谢。但这正是我正在使用的线路。在我之前的消息中,我只复制了引发错误的部分。
    • 实际的异常描述是什么?有内部异常吗?
    • 没有描述或 InnerException。我唯一拥有的是: {System.Runtime.InteropServices.SEHException (0x80004005): External component has throw an exception。在 Redemption.IRDOSession.GetRDOObjectFromOutlookObject(Object OutlookObject, Object Unwrap) 错误代码是:-2147467259
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2022-05-24
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多