1

更新:

此问题已在Redemption 5.2中修复:

以前,以 DASL 格式指定的“字符串”命名空间中的命名 MAPI 属性...始终假定为字符串类型(PT_UNICODE 或 PT_STRING8)。

现在可以显式指定属性类型,例如 PT_LONG (=3): http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


我正在使用Redemption 5.1(和 Outlook 2010/64)并且遇到了这个非常烦人的情况:

当尝试将对象byte[]写入属性时,它会将其写入PT_MV_LONG属性,而不是PT_BINARY.

当使用RDOProp.Fields

RDOItem rdoItem = GetRDOItem();
// note this is typed PT_BINARY
string dasl = "http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102";
byte[] data = GetSomeData();
rdoItem.Fields[dasl] = data;

...或使用时RDOUtils.HrSetOneProp

// this also sets MyProp, but does so as PT_MV_LONG, not PT_BINARY
RDOUtils utils = CreateUtils();
var mapiObject = rdoItem.MAPIOBJECT;
var propTag = utils.GetIDsFromNames(mapiObject,
    "{312FD430-D997-418A-8E1F-8D224FE69F5D}",
    "MyProp");
utils.HrSetOneProp(mapiObject, propTag, encoded);

上面的代码没有编译,但是类型是正确的。


更新:

使用上面的字符串属性,Redemption 正在创建属性“MyProp/0x00000102”,而不是“MyProp”。

4

2 回答 2

1

第一个片段对我来说看起来非常好。我对从 OutlookSpy 执行的以下脚本没有任何问题(单击 OutlookSpy 工具栏上的“脚本编辑器”按钮,粘贴脚本,单击运行)。您可能必须取消选择该消息并再次选择它才能看到新添加的属性。第二个片段没有设置属性类型 (PT_BINARY)。

dasl = "http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102"
暗淡数据(2)
数据(0) = 0
数据(1) = 1
data(2) = 2
设置 Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
设置 msg = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
Msg.Fields(dasl) = 数据
Msg.Save

于 2011-11-19T00:35:05.207 回答
0

更新:

此问题已在Redemption 5.2中修复:

以前,以 DASL 格式指定的“字符串”命名空间中的命名 MAPI 属性...始终假定为字符串类型(PT_UNICODE 或 PT_STRING8)。

现在可以显式指定属性类型,例如 PT_LONG (=3): http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/MyIntegerUserProperty/0x00000003


好吧,问我的问题然后回答它,我不会感到愚蠢......无论如何,这似乎是正在发生的事情:

Redemption (5.1.0.0) 似乎不理解形式中的属性,至少在以下情况下RDOItem.Fields

http://schemas.microsoft.com/mapi/string/{312FD430-D997-418A-8E1F-8D224FE69F5D}/MyProp/0x00000102

它将属性命名空间之后的所有内容作为属性名称,或者MyProp/0x00000102在本例中,提示它正在创建一个具有有趣名称的属性。我仍然不确定是否可以使用 Redemption 指定名称(而不是标签)以这种方式输入(指针会很好......)

以下确实有效,尽管它有点麻烦:

RDOUtils utils = CreateUtils();
var mapiObject = rdoItem.MAPIOBJECT;
var propTag = utils.GetIDsFromNames(mapiObject,
    "{312FD430-D997-418A-8E1F-8D224FE69F5D}",
    "MyProp");
propTag = ((propTag >> 16) << 16) | 0x0102; // add proptype
utils.HrSetOneProp(mapiObject, propTag, byteArray);
于 2011-11-19T00:43:05.223 回答