Безопасно вставляйте разрывы строк в HTML

У меня есть приложение, позволяющее пользователю копировать и вставлять html в форму. Этот HTML-код отправляется по электронной почте, а ссылка почтовый сервер не позволяет использовать более 1000 символов в строке. Итак, я хотел бы вставить разрывы строк (\r\n) в html после того, как пользователь нажал кнопку "Отправить". Как я могу сделать это, не меняя содержимое?

Моя идея такова:

html.replace('<', '\r\n<');

Но гарантирует ли это, что результат не изменится? '‹' не допускается в атрибутах?

Изменить: на самом деле я думаю, что это не сработает, потому что в html может быть блок скрипта с чем-то вроде if(x ‹ 3). Думаю, мне нужен красивый html-принтер, который работает либо на js, либо на C#.


person Mike Blandford    schedule 21.10.2010    source источник
comment
Является ли источник html чем-то, что вы контролируете   -  person Conrad Frix    schedule 21.10.2010
comment
Да, технически. Однако нам нужно выполнить некоторую постобработку, которая включает в себя вставку html в innerHTML div, что полностью испортит формат разрыва строки.   -  person Mike Blandford    schedule 21.10.2010
comment
Вы не должны отправлять какой-либо скрипт как часть электронной почты в формате HTML. Вы должны удалить его. На самом деле это опция в моем программном обеспечении.   -  person dave wanta    schedule 22.10.2010


Ответы (5)


Если вы кодируете контент в Base64, вы можете разбить его на любое количество строк.

person Collin    schedule 21.10.2010
comment
Итак, идея состоит в том, чтобы отправить электронное письмо в формате html, которое они просто откроют. Если я закодирую его в base64, это все равно будет работать или содержимое будет вложением? Все ли почтовые серверы автоматически знают, как кодировать/декодировать base64? - person Mike Blandford; 25.10.2010
comment
Я предполагал, что вы отправляете форму обратно на сервер, который имеет ограничение в 1000 символов на строку. Извините за недоразумение. Если вы все еще отправляете форму обратно на сервер, вы можете проанализировать разметку, а затем распечатать ее. Если вы отправляете прямо из формы (можете ли вы это сделать?), то, возможно, вы могли бы проанализировать разметку с помощью jQuery и переформатировать ее - хотя я не уверен, что это возможно. - person Collin; 25.10.2010

Стандарт электронной почты MIME использует кодирование передачи для решения этой проблемы. В идеале вы должны использовать почтовую библиотеку, которая позаботится об этом за вас, чтобы вы могли вставлять строки любой длины.

Используя класс System.Net.Mail.MailMessage в C#, вы сможете создать обычное сообщение, и оно передаст-закодирует его для вас. Если это не сработает, вы также можете создать сообщение, состоящее из нескольких частей, с одним System.Net.Mail.AlternativeView и явно установить кодировку передачи.

Вот пример, который я сейчас использую (обратите внимание, что в нем есть ошибка кодировки символов, поэтому ваш основной текст должен быть строкой Unicode):

private void Send(string body, bool isHtml, string subject, string recipientAddress, string recipientName, string fromAddress)
{
    using (var message = new MailMessage(new MailAddress(fromAddress),
                                    new MailAddress(recipientAddress, recipientName)))
    {
        message.Subject = subject;
        var alternateView = AlternateView.CreateAlternateViewFromString(body, message.BodyEncoding,
                                                                        isHtml ? "text/html" : "text/plain");
        alternateView.TransferEncoding = TransferEncoding.QuotedPrintable;
        message.AlternateViews.Add(alternateView);

        var client = new SmtpClient();

        client.Send(message);
    }
}
person roryf    schedule 21.10.2010
comment
Я бы хотел, чтобы мы могли это сделать. К сожалению, наше программное обеспечение развертывается на сервере клиента и подключается к его почтовому серверу, над которым мы не имеем никакого контроля. - person Mike Blandford; 21.10.2010
comment
Подождите, вместо того, чтобы отправлять это сообщение, могу ли я вернуть его в виде строки? - person Mike Blandford; 21.10.2010
comment
Вы можете настроить параметры SMTP в файле web.config, чтобы они указывали на любой почтовый сервер с учетными данными. - person roryf; 22.10.2010

Вы попадаете на опасную территорию попытка парсить HTML с помощью функции замены. Самый простой способ — просто отобразить в форме окно с предупреждением, сообщающее пользователю, что строки не могут быть длиннее 1000 символов, и вернуть сообщение об ошибке, если они попытаются отправить контент со строками, превышающими эту длину.

В противном случае вы можете вставить разрыв строки после X символов и вставить специальную разметку (например, ‹!--AUTO-LINEBREAK--> или аналогичную), которая информирует любого, кто получает электронное письмо. что был вставлен автоматический разрыв строки.

person Brad Westness    schedule 21.10.2010
comment
Ха-ха, я думал, что видел этот ответ раньше о разборе html. К сожалению, нам нужно выполнить некоторую пост-обработку введенного пользователем HTML-кода, который вставляет HTML-код в innerHTML элемента div. innerHTML любит форматировать html со своими собственными настройками разрыва строки. - person Mike Blandford; 21.10.2010

Добавьте обычные разрывы строк там, где, по вашему мнению, они должны быть. Например:

Внезапно найдите все теги <p>, <table>, <tr>, <td>, <br> и <div> и добавьте \r\n прямо перед ними.

Как только это будет сделано, прокрутите все строки еще раз. Если есть такие, которые все еще имеют длину более 1000 символов, я бы вставил \r\n в пробел.

Кроме того, вы должны удалить все теги script из тела электронного письма в формате HTML. Наличие тегов script может вызвать все типы проблем (помечено как спам, помечено как вирус, заблокировано и т. д.).

person dave wanta    schedule 22.10.2010

Я не уверен, как вы доставляете свою электронную почту... если она передается php-скрипту, который затем отправляет ее на почтовый сервер или использует метод mail(), тогда эта ссылка может помочь.

http://php.net/manual/en/function.wordwrap.php

Если нет, то не могли бы вы немного пояснить свой вопрос?

Еще одна простая мысль заключается в том, что вы могли бы использовать: html.replace('','\r\n'); или: html.replace('',''+String.fromCharCode(13));//вставляет возврат каретки

Однако, поскольку в идеале он будет проанализирован в браузере, вставка "\r\n" может оказаться неэффективной и на самом деле может просто отображаться как "\r\n"....

Надеюсь, что-нибудь из этого полезно.

person exoboy    schedule 21.10.2010