c# - 当 IsHTML=True 从 Outlook 2016 编码的 HTML 中获取来自 BodytPart 的文本
问题描述
从 Outlook 2010 发送的 HTML 邮件到达 message.TextBody 就好了。但是,我发现源自 Outlook 2016 的邮件并非如此。TextBody 为空。消息在 HtmlBody 中。
如何提取消息的文本?我试过使用
System.Web.HttpUtility.HtmlDecode(Regex.Replace(htmlContent, "<(.|\n)*?>", ""))
但它只是清理了一些但不是全部的 Office:Word 样式混乱。
(我似乎无法复制 HTML,所以我希望你知道它的样子。)
我在 VB.net 应用程序中使用 MailKit。
解决方案
MailKit 依赖于在命名空间中有一个 HTML 标记器的 MimeKit MimeKit.Text
。
您可以使用它来删除 html 标记并仅保留字符数据。
using (var writer = new StringWriter ()) {
using (var reader = new StringReader (html)) {
var tokenizer = new HtmlTokenizer (reader) {
DecodeCharacterReferences = true
};
HtmlToken token;
while (tokenizer.ReadNextToken (out token)) {
switch (token.Kind) {
case HtmlTokenKind.Data:
var data = (HtmlDataToken) token;
writer.Write (data.Data);
break;
case HtmlTokenKind.Tag:
var tag = (HtmlTagToken) token;
switch (tag.Id) {
case HtmlTagId.Br:
writer.Write (Environment.NewLine);
break;
case HtmlTagId.P:
if (tag.IsEndTag || tag.IsEmptyElement)
writer.Write (Environment.NewLine);
break;
}
break;
}
}
}
return writer.ToString ();
}
推荐阅读
- python - OOP,属性/功能帮助。硬编码...不知道该怎么做。(第一次尝试)
- reporting-services - 如果当前月份数 > 整数,隐藏 SSRS 报告中的列的表达式是什么?
- python - 会话不可用,因为没有设置密钥 Flask App factory
- sql-server - 尝试在表达式生成器中解析 SSIS 连接字符串
- c# - 在 ASP.NET 中视图元素的 ID 内连接两个 Razor C# @values
- linux - AWK 每隔一列打印一次,从最后一列(和最后一列的旁边)开始,进行 N 次交互(从右到左打印)
- java - Appium 能够看到屏幕上显示的内容之外的内容
- javascript - .map 在功能性 React 组件的返回中不起作用
- html - 为什么我需要指定多个 CSS 类来更改背景颜色?
- view - 在 Drupal 8 的视图块中使用内容 ID 上下文过滤器