基于VSTO的Outlook插件:如何仅获取回复邮件的新内容?
在VSTO Outlook插件中仅检查回复邮件的新内容
嘿,这个场景我之前做类似插件的时候踩过坑!你现在用字符串截取Body的方式虽然能临时解决问题,但局限性不小——比如HTML格式的邮件、不同语言版本的Outlook,或者转发过的邮件,都可能让你的\r\nFrom:匹配失效。其实Outlook对象模型本身就提供了更可靠的方法,给你两种官方方案参考:
方案1:用Word对象模型精准区分新旧内容
Outlook的邮件编辑窗口本质是嵌入的Word实例,用Word对象模型来操作内容,能完美适配所有邮件格式(HTML、RTF、纯文本):
Outlook.MailItem mailItem = inspector.CurrentItem as Outlook.MailItem; // 获取嵌入的Word编辑器实例 Word.Document doc = mailItem.GetInspector.WordEditor; Word.Range originalMsgStart = null; // 查找Outlook默认的原始消息分隔标记(英文版本是"-----Original Message-----") foreach (Word.Range rng in doc.StoryRanges) { Word.Find find = rng.Find; find.Text = "-----Original Message-----"; if (find.Execute()) { originalMsgStart = find.Parent; break; } } if (originalMsgStart != null) { // 新内容是从文档开头到原始消息分隔线之前的部分 Word.Range newContentRange = doc.Range(0, originalMsgStart.Start); string contentToCheck = newContentRange.Text.Trim(); // 这里执行你的拼写检查逻辑 } else { // 没找到分隔线,说明是全新邮件,检查全部内容 string contentToCheck = mailItem.Body; }
这个方法的好处是完全不用依赖字符串匹配的玄学,因为Word编辑器会帮你处理格式差异,不管是HTML里的嵌套标签还是RTF的格式标记,都能精准定位新输入的内容。
方案2:针对纯文本/RTF的原生属性方案
如果你的插件只需要处理纯文本或RTF格式的邮件,可以用Outlook默认的分隔符来分割,但要注意不同语言版本的分隔符不一样:
Outlook.MailItem mailItem = inspector.CurrentItem as Outlook.MailItem; string bodyContent = mailItem.Body; // 英文版本的默认分隔符,中文版本换成"-----原始消息-----" string originalSeparator = "-----Original Message-----"; int separatorPos = bodyContent.IndexOf(originalSeparator); string contentToCheck; if (separatorPos != -1) { contentToCheck = bodyContent.Substring(0, separatorPos).Trim(); } else { contentToCheck = bodyContent; }
这个方法比你当前的From:匹配靠谱,因为分隔符是Outlook官方统一添加的,不会随便变动。
为啥不推荐你现在的做法?
你用\r\nFrom:作为标记的问题挺明显的:
- 旧对话里可能有多个
From:行(比如转发过好几轮的邮件),会直接截取到错误的位置 - HTML格式的邮件里,
From:可能被包裹在<span>或者<div>标签里,字符串匹配根本找不到 - 不同语言的Outlook,旧对话的开头格式可能完全不一样
总之,优先选方案1,适配性最强,几乎不会出问题。
内容的提问来源于stack exchange,提问作者Sridhar Paiya
相关产品推荐
相关产品推荐

