求助:无法正常调用Redemption的RDOItems.Find API
解决Redemption中RDOItems.Find的"Unknown property name: sql"异常
Redemption的RDOItems.Find方法不支持Outlook对象模型里的@SQL查询语法,这就是你触发该异常的原因。要正确筛选HiddenItems中指定MessageClass的项,直接使用属性名+比较条件的格式即可。
正确的Find调用方式
要查找MessageClass为IPM.Configuration.ExtensionMasterTable的隐藏项,将Find方法参数改为以下两种格式之一:
- 直接使用属性名:
RDOMail mail = hiddenItems.Find("MessageClass = 'IPM.Configuration.ExtensionMasterTable'");
- 使用DASL属性路径(适合自定义属性场景):
RDOMail mail = hiddenItems.Find("http://schemas.microsoft.com/mapi/proptag/0x001A001E = 'IPM.Configuration.ExtensionMasterTable'");
修改后的完整代码
替换原出错的Find调用,同时可以去掉遍历循环(Find直接返回目标项),优化后的代码如下:
internal class Program { private static RDOSession rdoSession; private static readonly string DASL = "http://schemas.microsoft.com/mapi/proptag/0x7C080102"; static void Main(string[] args) { rdoSession = RedemptionLoader.new_RDOSession(); rdoSession.Logon(); try { RDOFolder inbox = rdoSession.GetDefaultFolder(rdoDefaultFolders.olFolderInbox); RDOItems hiddenItems = inbox.HiddenItems; // 正确调用Find筛选目标项 RDOMail mail = hiddenItems.Find("MessageClass = 'IPM.Configuration.ExtensionMasterTable'"); if (mail != null) { // 直接转换字段值,无需循环赋值 byte[] data = (byte[])mail.Fields[DASL]; string result = System.Text.Encoding.UTF8.GetString(data); // 此处可处理获取到的result } } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e); } finally { rdoSession.Logoff(); } } }
额外说明
- 若需查找多个符合条件的项,可配合
FindNext方法循环获取,直到返回null。 - 代码中把字段值的循环赋值改为直接强制转换,因为
Fields[DASL]返回的object[]本质是字节数组的包装,直接转换更高效。
内容的提问来源于stack exchange,提问作者ezG
相关产品推荐
相关产品推荐

