首页 > 解决方案 > 当 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。

标签: c#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 ();
}

推荐阅读