VSTO中MailItem未移动文件夹,EntryID为何发生变化?
Outlook EntryID 格式差异问题解析
你遇到的问题本质是Outlook Table对象返回的EntryID和MailItem对象的EntryID是两种不同格式,和邮件是否移动无关,具体原因和解决方法如下:
核心原因
- Table返回短格式(压缩EntryID):Outlook的Table组件为了性能优化,默认返回的EntryID是精简压缩后的短格式,仅包含当前存储内唯一标识邮件的信息,长度较短。
- MailItem是完整格式EntryID:通过
ItemLoad事件或GetItemFromID获取的MailItem的EntryID是完整格式,额外包含了邮件所在存储的标识信息(Store ID),长度更长,是全局唯一的ID,跨存储也能定位邮件。
当你用Table里的短EntryID调用GetItemFromID时,Outlook会自动在当前默认存储中匹配邮件,但返回的MailItem依然会输出完整格式的EntryID,所以看起来和传入的短ID差异极大。
解决方法
要让Table获取的EntryID和MailItem的一致,有两种方式:
1. 转换短EntryID为完整格式
使用Outlook NameSpace的ConvertEntryID方法,将Table返回的短ID转换为完整格式:
// 假设ns是已初始化的Outlook.NameSpace对象 string shortEntryId = tableRow["EntryID"].ToString(); // 第三个参数true表示转换为完整格式的EntryID string fullEntryId = ns.ConvertEntryID(shortEntryId, Type.Missing, true);
转换后的fullEntryId就和MailItem.EntryID完全一致了。
2. 直接从Table获取完整EntryID
通过MAPI属性PR_ENTRYID(属性标签为0x0FFF0102)从Table中直接读取完整格式的EntryID:
// 先给Table添加PR_ENTRYID列 table.Columns.Add("http://schemas.microsoft.com/mapi/proptag/0x0FFF0102"); // 读取完整EntryID string fullEntryId = tableRow["http://schemas.microsoft.com/mapi/proptag/0x0FFF0102"].ToString();
内容的提问来源于stack exchange,提问作者Trecius Veil
相关产品推荐
相关产品推荐

