我正在尝试读取此线程中提到的 DASL 值PR_LONGTERM_ENTRYID_FROM_TABLE 0x66700102 -获取从 Outlook 表中获取的邮件的 Outlook 邮件项
我遇到的问题是下面完整示例中代码中的以下行-
string ltEntryid = (string)nextRow["http://schemas.microsoft.com/mapi/proptag/0x66700102".ToString()];
它抛出异常"无法将类型'byte[]'转换为'字符串'"
我可能以错误的方式解决这个问题,所以我正在寻找一些建议。我可以很好地读取所有其他表行(例如 - "EntryID(短期),MessageClass,Unread,SenderEmailType)。
const string unReadfilter = "[UnRead] = true";
Outlook.Table table = folder.GetTable(unReadfilter, Outlook.OlTableContents.olUserItems);
// Remove the default column set.
table.Columns.RemoveAll();
// Add columns to the table
table.Columns.Add("Unread");
table.Columns.Add("EntryID");
table.Columns.Add("MessageClass");
table.Columns.Add("SenderEmailType");
table.Columns.Add("SenderEmailAddress");
// PR_LONGTERM_ENTRYID_FROM_TABLE
table.Columns.Add("http://schemas.microsoft.com/mapi/proptag/0x66700102".ToString());
// sort table
table.Sort("Unread", true);
while (!table.EndOfTable)
{
Outlook.Row nextRow = table.GetNextRow();
bool unRead = (bool)nextRow["Unread"];
Debug.WriteLine(unRead);
string msgClass = (string)nextRow["MessageClass"];
Debug.WriteLine(msgClass);
string eId = (string)nextRow["EntryID"];
Debug.WriteLine(eId);
string sEaddr = (string)nextRow["SenderEmailAddress"];
Debug.WriteLine(sEaddr);
string sEtype = (string)nextRow["SenderEmailType"];
Debug.WriteLine(sEtype);
// PR_LONGTERM_ENTRYID_FROM_TABLE ***Exception with the following line***
string ltEntryid = (string)nextRow["http://schemas.microsoft.com/mapi/proptag/0x66700102".ToString()];
Debug.WriteLine(ltEntryid);
if (msgClass.Equals("IPM.Note"))
{
//write to string list
dailyMiInboxList.Add(unRead.ToString());
dailyMiInboxList.Add(msgClass);
dailyMiInboxList.Add(eId);
dailyMiInboxList.Add(sEaddr);
dailyMiInboxList.Add(sEtype);
dailyMiInboxList.Add(sEaddr);
dailyMiInboxList.Add(ltEntryid);
}
}
PT_BINARY属性以字节数组的形式返回,但您将其转换为字符串。如果要将其转换为十六进制字符串,请使用 MAPIFolder.PropertyAccessor.BinaryToString()
。
好吧,我在德米特里的帮助下想通了。
首先将此 dasl 属性添加到表中时 -
// PR_LONGTERM_ENTRYID_FROM_TABLE
table.Columns.Add("http://schemas.microsoft.com/mapi/proptag/0x66700102".ToString());
我不应该包含tostring,所以它应该写成如下-
table.Columns.Add(@"http://schemas.microsoft.com/mapi/proptag/0x66700102");
在 While 循环中的下一步,要从字节数组转换 PT_BINARY 属性,请使用此属性来转换行
string PR_LONGTERM_ENTRYID_FROM_TABLE = "http://schemas.microsoft.com/mapi/proptag/0x66700102";
string ltEntryId = (string)nextRow.BinaryToString(PR_LONGTERM_ENTRYID_FROM_TABLE);
Debug.Print(ltEntryId);
这个链接非常有帮助
特别是这些评论——• 为表示二进制 (PT_BINARY) 值的给定列返回的值取决于是使用内置属性名称还是架构名称来指定列。对于显式内置属性名称(如 EntryID),Row(Column) 值以字符串形式返回。对于引用表示PT_BINARY属性的命名空间的属性名称,Row(Column) 值以字节数组的形式返回。使用 Row.BinaryToString 将字节数组转换为字符串。