Безопасно переносите длинные строки HTML, чтобы избежать smtp_line_length_limit Postfix

Чтобы Postfix не переносил сверхдлинные строки после smtp_line_length_limit (обычно 998 символов), я сейчас использую аккуратная библиотека php для переноса длинных строк в сообщения электронной почты HTML (см. связанные вопрос):

$oTidy = new tidy();
$message = $oTidy->repairString($message,
    array("show-errors" => 0, "show-warnings" => false, "force-output" => true, 
    "alt-text" => "Please display images", "bare" => true, "doctype" => "auto", 
    "drop-empty-paras" => false, "fix-bad-comments" => false, "fix-uri" => true, 
    "join-styles" => false, "merge-divs" => true, "merge-spans" => true, 
    "preserve-entities" => true, "wrap" => 68),
    "utf8"
); 

Tidy действительно хорош в переносе длинных строк, оставляя HTML и CSS действительными.
К сожалению, это больше похоже на попытку исправить недопустимую разметку HTML, изменить HTML-теги, типы документов и т. Д.

Однако мне нужен только перенос строк - другие вещи, которые делает tidy, накладные и иногда скорее раздражают, чем что-либо еще.

Теперь я попытался использовать функцию wrapText() PHPMailer. К сожалению, я обнаружил ошибку, которая делает его бесполезным для меня.
PHPMailer преобразует этот исходный код

<html>
    <body>
        Loremipsumdolorsitametconsetetursadipscing<span style="font-family:'Courier New',sans-serif">lorem</span>
    </body>
</html>

to

<html>
    <body>
        Loremipsumdolorsitametconsete<span style="font-family:'Courier
        New',sans-serif">lorem</span>
    </body>
</html>

нарушение форматирования шрифта (Courier New) для слова lorem в некоторых клиентах.

Теперь мои вопросы:

Как безопасно обернуть строки HTML, не повредив HTML и CSS?

Как это делает Tidy? Стоит ли использовать парсер DOM? Есть ли php-версия исходного кода Tidy (я ее не нашел)?


person Horen    schedule 31.07.2013    source источник
comment
перенос слова()? до тех пор, пока вы не разрешаете разрывы слов, тогда html / css должен пройти нормально. если, конечно, у вас нет смехотворно длинных имен классов css.   -  person Marc B    schedule 31.07.2013


Ответы (2)


Наилучшим вариантом, по-видимому, является quoted-printable кодирование, поскольку оно может разбивать строки на небольшие фрагменты символов, сохраняя при этом удобочитаемость фильтров содержимого без риска разрушения любого форматирования.

Base64 также можно было бы использовать, но это повысит риск классификации спама.

Однако оба варианта увеличивают длину исходного кода (quoted-printable особенно для символов, отличных от ascii).

Примечание:
wrapText() PHPMailer/issues/89#" rel="nofollow"> не будет исправлен, поскольку описанные проблемы могут быть решается с помощью почтовой кодировки, как описано выше.

person Horen    schedule 02.08.2013

  1. закодируйте свой текст в base64, используя base64_encode()
  2. установить соответствующий заголовок MIME
  3. разделите этот blob-объект base64 на блоки шириной 76 символов, используя chunk_split()
  4. Выгода!
person Your Common Sense    schedule 31.07.2013
comment
Насколько дольше будет мой исходный код после его кодирования в base64? - person Horen; 31.07.2013
comment
3. разделите этот blob-объект с размером base64 на щели шириной 80 карат. - person Your Common Sense; 31.07.2013
comment
Я имею в виду размер. Он будет закодирован в base64, поэтому общий размер файла будет больше, верно? Я понимаю, что каждая строка будет содержать не более 80 символов. - person Horen; 31.07.2013
comment
Правильно. Хотя, поскольку эта проблема не беспокоит ни одну почтовую службу или клиентское программное обеспечение (поскольку каждый из них кодирует свои электронные письма в base64), я не вижу причин для этого вопроса. - person Your Common Sense; 31.07.2013
comment
Кодировка Base64 используется не всегда. В основном из-за спама. Принимающий MTA не может сразу выполнить фильтрацию содержимого. quoted-printable может быть решением. Я разберусь с этим. - person Horen; 31.07.2013
comment
Эээ .... спам? Вы действительно верите, что получающий MTA не может сразу фильтровать [спам] по содержимому? В любом случае, вы также можете использовать цитируемую печатную версию - person Your Common Sense; 31.07.2013