Outlook VSTO开发:从回复/转发草稿获取原邮件EntryID
在Outlook VSTO中获取回复/转发草稿对应的原邮件EntryID
方法一:通过Conversation对象追溯原邮件
回复或转发生成的草稿会和原邮件同属一个会话,可通过会话对象直接定位原邮件:
- 调用草稿邮件的
GetConversation()方法获取Outlook.Conversation对象 - 调用
Conversation.GetRootItems()获取会话的根邮件集合(即最初的原邮件) - 遍历集合取出对应的
MailItem,即可获取其EntryID
示例代码(C#):
Outlook.MailItem replyDraft = // 你的回复/转发草稿MailItem对象 if (replyDraft != null) { Outlook.Conversation conv = replyDraft.GetConversation(); if (conv != null) { Outlook.SimpleItems rootItems = conv.GetRootItems(); foreach (object item in rootItems) { if (item is Outlook.MailItem originalMail) { string originalEntryID = originalMail.EntryID; // 这里拿到了原邮件的EntryID break; } } } }
方法二:通过InReplyTo和Namespace搜索原邮件
如果会话方法不适用,可利用草稿的InReplyTo属性(存储原邮件主题)结合命名空间搜索:
- 获取
Outlook.NameSpace对象(通常为Application.Session) - 构建搜索过滤器,匹配
Subject等于InReplyTo,同时限定原邮件所在文件夹(比如收件箱) - 执行搜索后提取匹配邮件的
EntryID
示例代码(C#):
Outlook.MailItem replyDraft = // 你的回复/转发草稿MailItem对象 Outlook.NameSpace ns = Globals.ThisAddIn.Application.Session; if (replyDraft != null && !string.IsNullOrEmpty(replyDraft.InReplyTo)) { // 转义主题中的单引号,避免过滤器语法错误 string escapedSubject = replyDraft.InReplyTo.Replace("'", "''"); string filter = $"[Subject] = '{escapedSubject}'"; Outlook.Items items = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Items.Restrict(filter); foreach (object item in items) { if (item is Outlook.MailItem originalMail) { string originalEntryID = originalMail.EntryID; // 处理逻辑 break; } } }
注意事项
- 会话方式更可靠,不会因主题重复导致匹配错误
- 搜索方式需注意转义主题中的特殊字符,避免过滤器语法报错
- 若原邮件不在默认收件箱,需调整搜索的文件夹范围
内容的提问来源于stack exchange,提问作者teleixi
相关产品推荐
相关产品推荐

