C# 将MS Outlook HTML内容转换为;“漂亮”;纯HTML

C# 将MS Outlook HTML内容转换为;“漂亮”;纯HTML,c#,outlook,ews-managed-api,C#,Outlook,Ews Managed Api,在我的场景中,用HTML阅读Outlook电子邮件不是很好看,而且基本上是“无用”的。我目前正在构建一个支持系统,用户应该能够在该系统中创建新的票证,并通过。电子邮件 100%确定只使用Outlook 以下是我目前的做法: 订阅和阅读电子邮件 private static void OnEvent(object sender, NotificationEventArgs args) { // Streaming subscription to EWS var subscripti

在我的场景中,用HTML阅读Outlook电子邮件不是很好看,而且基本上是“无用”的。我目前正在构建一个支持系统,用户应该能够在该系统中创建新的票证,并通过。电子邮件

100%确定只使用Outlook

以下是我目前的做法:

订阅和阅读电子邮件

private static void OnEvent(object sender, NotificationEventArgs args)
{
    // Streaming subscription to EWS
    var subscription = args.Subscription;

    // Loop through notifications
    foreach(var notification in args.Events)
    {
        // If this is a news mail
        if(notification.EventType = EventType.NewMail)
        {
            var item = (ItemEvent)notification;

            // Define what properties to load
            var props new PropertySet(BasePropertySet.IdOnly,
                EmailMessageSchema.UniqueBody,
                EmailMessageSchema.From,
                EmailMessageSchema.Subject,
                /* ECT */);

            // We need the body to be in HTML
            props.RequestedBodyType = BodyType.HTML;

            // Bind the message
            var message = EmailMessage.Bind(subscription.Service, item.ItemId, props);

            // Handle the message with custom made handler
            Handlers.ReadEmailAndPerformAction(message);
        }
    }
}
消息处理程序

public static void ReadEmailAndPerformAction(EmailMessage message)
{
    var from = message.From.Address;
    var subject = message.Subject;
    var body = message.UniqueBody.Text;
    // BIND OTHER PROPERTIES

    if(isReply)
        CommentOnTicketFromEmail(/* Needed arguments */);
    else
        CreateNewTicketFromEmail(/* Needed arguments */);
}
问题
当我收到并阅读HTML格式的电子邮件内容时,它看起来很奇怪。这只是Outlook它的全部荣耀,烦扰任何通过它的开发人员,HTML有些无用。我想阅读并将普通的和基本的HTML插入我的数据库,但这不是我收到的

下面是一个来自非常基本电子邮件的HTML内容示例:

<html>
    <body>
        <div>
            <div>
                <span lang="da">
                    <div>
                        <div style="margin:0;">
                            <font face="Calibri,sans-serif" size="2">
                                <span style="font-size:11pt;">Test content</span>
                            </font>
                        </div>
                    </div>
                </span>
            </div>
        </div>
    </body>
</html>

测试内容
对于我的系统来说,这只是胡言乱语。我简直无法理解为什么输入不是一个段落等等。尽管如此,Outlook当然是这样决定为我提供内容的

无论如何,我想把这个例子转换成一个简单的HTML字符串,如下所示:

<p>Test content</p>
测试内容


对我来说,最简单的方法是以纯文本的形式读取内容,但这会弄乱列表、图像等,我希望保存列表和嵌入的图像。

使用正则表达式,我设法将outlook HTML的混乱美化为更具可读性和美观的内容。它仍然不是100%的“普通”HTML(如列表等),但至少更好

C#

公共静态字符串PrepareBody(字符串体)
{
var stripHead=new Regex(@“|”,RegexOptions.IgnoreCase| RegexOptions.Multiline);

var stripScript=new Regex(@"将数据加载为XDocument,我相信它有一个Html输入方法,然后只查询正文内容。您可能无法消除所有额外的内容,因为它可能是必需的,或者在不同的电子邮件之间有所不同,但至少它会给您主Html。您可以在回答中给我一个示例吗?以前没有使用过
XDocument
E
public static string PrepareBody(string body)
{
    var stripHead = new Regex(@"<body.*?>|<\/body>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    var stripScript = new Regex(@"<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    var stripStyle = new Regex(@"<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    var stripFonts = new Regex(@"\sface=""(.*?)""|\ssize=""(.*?)""", RegexOptions.IgnoreCase | RegexOptions.Multiline);
    var stripInlineFontSize = new Regex(@"font-size:(.*?);", RegexOptions.IgnoreCase | RegexOptions.Multiline);

    var regBody = stripHead.Split(body);
    var content = "<div>" + regBody[1].Replace("\n", "\n<br />") + "</div>";
    content = stripScript.Replace(content, "");
    content = stripStyle.Replace(content, "");
    content = stripFonts.Replace(content, "");
    content = stripInlineFontSize.Replace(content, "");
    content = content.Replace("<o:p>", "")
                    .Replace("</o:p>", "")
                    .Replace(" class=\"WordSection1\"", "")
                    .Replace(" class=\"MsoPlainText\"", "")
                    .Replace(" class=\"MsoNormal\"", "")
                    .Replace("mso-fareast-language:DA", "")
                    .Replace("<br>", "<br />");


    return content;
}