如何从Microsoft.Office.Interop.Outlook.Folder获取长期EntryID?
获取Outlook Table中的长期EntryID
默认情况下,Outlook的Table对象返回的是短期(会话特定)EntryID,这类ID会在Outlook重启或会话切换后失效。要获取长期有效的EntryID,有两种可行方案:
方案一:直接在Table中添加长期EntryID属性列
长期EntryID对应的MAPI属性是PR_ENTRYID_LONG,其属性标签为0x0FFF0102。你可以直接通过这个属性的Schema URL添加到Table的列中,从而直接读取长期ID:
Table table = folder.GetTable(); // 添加长期EntryID列(使用MAPI属性的Schema URL) table.Columns.Add("http://schemas.microsoft.com/mapi/proptag/0x0FFF0102"); table.Columns.Add("SenderEmailAddress"); while (!table.EndOfTable) { Row row = table.GetNextRow(); // 读取长期EntryID string longEntryId = row["http://schemas.microsoft.com/mapi/proptag/0x0FFF0102"].ToString(); string sender = row["SenderEmailAddress"].ToString(); // 后续业务逻辑处理 }
这种方法的优势是高效,无需额外加载邮件对象,直接从Table结果集中获取数据。
方案二:将短期EntryID转换为长期EntryID
如果已经获取了短期EntryID,可以通过Outlook的Namespace对象将其转换为长期ID。这种方式需要逐个加载对应的邮件项,适合需要同时处理邮件其他属性的场景,但要注意释放COM对象避免内存泄漏:
// 假设已经获取了Outlook Application实例 Outlook.NameSpace ns = application.GetNamespace("MAPI"); ns.Logon(); Table table = folder.GetTable(); table.Columns.Add("SenderEmailAddress"); while (!table.EndOfTable) { Row row = table.GetNextRow(); string shortEntryId = row["EntryID"].ToString(); // 通过短期ID获取邮件对象,进而得到长期EntryID Outlook.MailItem mailItem = ns.GetItemFromID(shortEntryId) as Outlook.MailItem; string longEntryId = mailItem?.EntryID; string sender = row["SenderEmailAddress"].ToString(); // 释放COM对象,避免内存泄漏 if (mailItem != null) { System.Runtime.InteropServices.Marshal.ReleaseComObject(mailItem); } }
注意事项
- 优先选择方案一,因为它的性能更优,尤其是处理大量邮件时;
- 使用方案二时,必须确保及时释放COM对象,否则可能导致Outlook进程无法正常退出。
内容的提问来源于stack exchange,提问作者Trecius Veil
相关产品推荐
相关产品推荐

