Преобразование содержимого HTML MS Outlook в простой HTML

Чтение электронной почты Outlook в HTML не очень красиво и в основном «бесполезно» в моем сценарии. В настоящее время я создаю систему поддержки, в которой пользователи должны иметь возможность создавать новые заявки и комментировать заявки через. электронное письмо.

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>

Самым простым для меня было бы просто прочитать содержимое как простой текст, но это испортит списки, изображения и т. Д., И я хочу сохранять списки и встроенные изображения.


person Detilium    schedule 13.03.2017    source источник
comment
Загрузите данные как XDocument, я считаю, что у него есть метод ввода Html, а затем просто запросите содержимое тела. Вы, вероятно, не сможете удалить все лишние вещи, потому что они могут быть необходимы или варьироваться в зависимости от электронной почты, но, по крайней мере, это даст вам основной HTML.   -  person MiltoxBeyond    schedule 13.03.2017
comment
Не могли бы вы показать мне пример в ответе? Не использовал XDocument раньше   -  person Detilium    schedule 13.03.2017


Ответы (1)


Используя регулярные выражения, мне удалось украсить беспорядок HTML в Outlook, сделав его более читабельным и красивым. Это все еще не 100% "простой" HTML (например, списки и т.п.), но, по крайней мере, он лучше.

C #

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;
}

Объяснение

  • stripHead: удаляет теги <head></head> и <body></body>, получая содержимое внутри них.
  • stripScript: удаляет все <script></script> теги, которые могут существовать
  • stripStyle: удаляет все <style></style> теги, которые могут существовать.
  • stripFonts: удаляет любые стили в тегах <font></font> (тег <font> все еще существует, поскольку цвет шрифта отображается следующим образом: <font color="red">Content</font>, поэтому мы не можем полностью удалить теги <font>)
  • stripInlineFontSize: удаляет все свойства font-size css во встроенном CSS (Пример: style="font-size:11pt;").

Обратите внимание, что это не очень красивое решение.

person Detilium    schedule 14.03.2017