1

为了避免 Postfix 在之后smtp_line_length_limit(通常是 998 个字符)包装超长行,我目前正在使用php 的 tidy 库在 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"
); 

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

然而,我只需要换行 - tidy 所做的其他事情是开销,有时比其他任何事情都烦人。

现在我尝试使用PHPMailerwrapText()功能。不幸的是,我发现了一个对我来说毫无用处的错误
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 源代码(我还没有找到)?

4

2 回答 2

2
  1. 使用将您的文本编码为base64base64_encode()
  2. 设置适当的 MIME 标头
  3. 使用将这个 base64-ed blob 拆分为 76 个字符宽的块chunk_split()
  4. 利润!
于 2013-07-31T15:07:58.060 回答
2

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

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

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

旁注:
PHPMailerwrapText() 不会被修复,因为上述问题可以通过上述邮件编码来解决。

于 2013-08-02T10:19:19.863 回答