为了避免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标记,文档类型等。
我只需要线条包装 - 其他整洁的东西是开销,有时比其他任何东西都烦人。
现在我尝试使用PHPMailer的wrapText()
函数。不幸的是,我发现了一个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源代码(我还没有找到)?
最好的方法似乎是quoted-printable
编码,因为它可以将行分成小块字符,同时保留内容过滤器的可读性,而不会有破坏任何格式的风险。
Base64
也是一种选择,但会增加垃圾邮件分类的风险。
这两个选项都会增加源代码的长度(quoted-printable
尤其适用于非ascii字符)。
边注:
PHPMailer的wrapText()
will not be fixed作为所描述的问题可以通过如上所述的邮件编码来解决。
base64_encode()
将文本编码为base64chunk_split()
将这个base64-ed blob拆分成76个字符宽的块