Как отобразить HTML-письмо в веб-приложении?

Я написал веб-приложение, которое получает электронную почту через IMAP. Теперь мне нужно отобразить эти письма пользователю. Я думал, что это будет просто (я показываю HTML в браузере с поддержкой HTML), пока я не посмотрю на это немного... и обнаружил, что есть много проблем, таких как:

  • Javascript и безопасность
  • Нарушение стиля
  • Конечно, больше

Есть ли хороший безопасный способ отображения HTML-письма? Я бы ошибался за "безопасный", а не "великолепный", хотя я не хочу отображать только текстовую версию письма (что даже не гарантировано там будет...)

Я понимаю, что самый очевидный ответ - "положить все в рамку" - правда ли это? Будет ли это действительно работать?

Я использую серверную часть Node, если это помогает...

Ответ 1

  ... самый очевидный ответ: "положи все в рамку"... это на самом деле будет работать?

Да, например Whiteout Networks GmbH WHITEOUT.IO делает это в /src/tpl/read.html и /src/js/controller/read-sandbox.js. Некоторые из проблем безопасности решаются с помощью DOMPurify

..there are tons of issues..Is there a good, safe way..?

Я знаю формат данных сообщения также под именами EML или MHTML, поэтому поиск хорошего "конвертера XY в HTML" или "средства просмотра документов HTML5 с поддержкой XY" может указать на пригодность для использования результаты (например, GroupDocs.Viewer)

Некоторые почтовые клиенты (например, GMail) не используют iframe, вместо этого они используют анализатор почты (например, andris9/mailparser) и анализатор HTML (например, cheeriojs/cheerio) для извлечения подмножества e-mail-safe-html (см. Qaru: какие есть рекомендации по оформлению электронной почты в формате HTML? и Qaru: стилизация HTML-письма для GMail для некоторых примеров) или используйте HTML-дезинфицирующее средство (например, Google Caja, cure53/DOMPurify) и вставляйте код прямо на страницу.

Но это не всегда легко, нет единого мнения о том, что представляет собой подмножество e-mail-safe-html, и вы, конечно же, не захотите встроить потенциально зараженные вложения или запустить анонимные CORS скрипты внутри защищенный сеанс пользователя.

В любом случае, как всегда, изучение исходного кода различных почтовых клиентов (см. Wikipedia: Сравнение почтовых клиентов) - это способ выяснить это.