安全地包装长HTML行以避免Postfix的smtp_line_length_limit

问题描述 投票:1回答:2

为了避免Postfix在smtp_line_length_limit(通常是998个字符)之后包装超长行,我目前正在使用php's tidy library在HTML电子邮件中包装长行(请参阅related question):

$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"
); 

在保持HTML和CSS有效方面,Tidy非常适合包装长行。 不幸的是,它更像是尝试修复无效的HTML标记,更改HTML标记,文档类型等。

我只需要线条包装 - 其他整洁的东西是开销,有时比其他任何东西都烦人。

现在我尝试使用PHPMailerwrapText()函数。不幸的是,我发现了一个bug,这对我来说毫无用处。 PHPMailer转换此源代码

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

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

在某些客户端中打破单词lorem的字体格式(Courier New)。

现在我的问题:

如何在不损坏HTML和CSS的情况下安全地包装HTML行?

Tidy怎么做的?我应该使用DOM解析器吗?是否有PHP版本的Tidy源代码(我还没有找到)?

php html word-wrap postfix-mta tidy
2个回答
2
投票

最好的方法似乎是quoted-printable编码,因为它可以将行分成小块字符,同时保留内容过滤器的可读性,而不会有破坏任何格式的风险。

Base64也是一种选择,但会增加垃圾邮件分类的风险。

这两个选项都会增加源代码的长度(quoted-printable尤其适用于非ascii字符)。

边注: PHPMailer的wrapText() will not be fixed作为所描述的问题可以通过如上所述的邮件编码来解决。


1
投票
  1. 使用base64_encode()将文本编码为base64
  2. 设置适当的MIME标头
  3. 使用chunk_split()将这个base64-ed blob拆分成76个字符宽的块
  4. 利润!
© www.soinside.com 2019 - 2024. All rights reserved.