【问题标题】:Why does PHP convert some angle brackets to html entities in PHPMailer为什么PHP在PHPMailer中将一些尖括号转换为html实体
【发布时间】:2015-03-04 15:00:20
【问题描述】:

我正在使用 PHPMailer,并在 for 循环中包含这行代码,以将 HTML 表的行添加到电子邮件的正文中。 (完整的 php pastebin 在这里:http://pastebin.com/iujp27hU

$body .= "<tr><td style='". $rush_part_style . "'>" . $row[0]
     . "</td> <td align='center' style='" . $rush_part_style . "'>" . $quantity_to_order
     . "</td> <td>" . $row[2] . "</td></tr>";

电子邮件通常可以正常发送,但每隔一段时间,td 标记的尖括号之一就会被编码为其 HTML 实体。

当我在 Outlook 中查看源代码时,它是这样的:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">h3, p, table td {font-family:arial;}</style>
<table><tr><td><u>SD Part Number</u></td><td><u>Quantity</u></td><td><u>UOM</u>/td></tr>    
              - - some rows removed for brevity - -    
<tr><td style="">P1400642-00048-C</td><td align="center" style="">26</td><td>EA</td></tr>
<tr><td style="">P1400642-00046-C</td>&lt; td align='center' style=''&gt;20</td>    <td>EA</td></tr>

<tr><td style="">P1400642-00106-C</td><td align="center" style="">25</td><td>EA</td></tr>
<tr><td style="">P1400642-00036-C</td><td align="center" style="">67</td><td>EA</td></tr>
...

我不明白为什么它会将其中一个 &lt; &gt; 随机编码为它们的字符实体。 这个问题以前发生过,但我可以发送 100 多封电子邮件而不会发生。零件编号与是否出现无关。

我该如何解决这个问题?

--附加信息编辑--

测试一个非常大的 202 行订单会在发送时产生这些格式错误。 这根本没有属性,只是纯 HTML。 PHPMailer 在Send() 上破坏它。

【问题讨论】:

  • 如果您在另一个电子邮件客户端打开电子邮件,那里也会发生这种情况吗?
  • @Dagon OP 已经观察到这一点,并在问题标题和代码 sn-p 下方说了这么多。
  • 您是否 100% 确定此 html 是由您发布的同一 php 代码行创建的?您是否有可能生成有条件的 html,因此这一行表来自另一个 if {} else {} 分支?
  • 关于故障排除/调试的主题。如果您遇到可能的 PHP 问题。首先确保它是PHP。尝试先回显纯 html,然后添加变量。看看它什么时候坏了,什么时候坏了。还要始终打开error_reporting() 以查看警告等。
  • @sjagr 它在 GMail 网络邮件中显示类似,并且在我的 Galaxy S4 内置电子邮件客户端上也很混乱。在电话上,有问题的 td 标签显示在消息上方。

标签: php html phpmailer


【解决方案1】:

尝试在表格行的末尾输出换行符\r\n

$body    .= "<tr><td style='". $rush_part_style . "'>" . $row[0] . "</td> <td align='center' style='" . $rush_part_style . "'>" . $quantity_to_order . "</td> <td>" . $row[2] . "</td></tr>\r\n";

我遇到了类似的问题,在检查 html 电子邮件的来源时,似乎有人随意插入了换行符。在关闭 &lt;/tr&gt; 后添加换行符是我的解决方法。

【讨论】:

    【解决方案2】:

    输出有&amp;lt; td,而你的PHP有&lt;td。这很奇怪,因为输出突然有一个无中生有的空间。

    要进行故障排除,您可以在运行脚本时将$body$order_mail-&gt;Body 输出到屏幕或文件中。看看在什么时候引入了转义的 HTML。如果这不能为您提供更多信息,请尝试不使用 PHP 变量,然后自己填写一些随机内容。

    其他想法:

    • PHPMailer 可能存在属性为空的问题 (style='') - 您可以尝试重写代码以便省略空属性(或者通过添加一些虚拟文本来使属性永远不会为空,例如样式:text-align:left;)。
    • 尝试在 HTML 中使用双引号(" 而不是 '),PHPMailer 可能会遇到问题。

    关于调试的一般情况:拆分代码并尽可能多地输出调试信息,以确定问题到底出在哪里。是在构建 HTML,还是在您将其加载到$order_mail-&gt;Body 时由 PHPMailer 完成?或者当您调用Send() 时会发生这种情况(在这种情况下,您看不到 PHP 会发生这种情况)?

    【讨论】:

    • 有趣的是,我将 $order_mail->Body 和 $body 输出到屏幕并且无法重现字符编码问题,表创建得很好。但是当那个 Body 通过 PHPMailer Send() 函数时,它有时会被改变,它会随机改变一些 。我可以重现该错误,但每次都不是同一个字符,有时一行会有它有时另一行,有时没有!也许无论什么服务器正在处理它都会不知何故不堪重负。
    • @S.Mason 您是否也尝试过我的其他建议(没有空的 HTML 属性和双引号而不是单引号)?我可以试着找点时间研究一下 Send() 函数,然后再报告。
    • 我添加了测试电子邮件的选定部分的屏幕截图。我正在使用我正在使用 PHPMailer 5.1(无法升级,因为 5.2 由于某种原因无法正常工作) 我认为问题在于 PHPMailer 在某些位置插入了空格。就像输入缓冲区已满,当它启动另一个输入缓冲区时,它会在输入之前添加一个空格。或者想知道问题是否在于 PHPMailer 使用 set_magic_quotes_runtime() 函数,那里的东西不能正常工作。
    • @S.Mason 我建议您使用与以前相同的技巧(沿途输出正文),但现在也在 PHPMailer 类中。对当前类进行备份,然后将var_dump(the-body) 放在 Send() 函数及其调用的函数中的关键位置,以准确找出出错的地方。
    • 如果您在 PHP 中回显/转储 html 时没有这些问题,那么我非常希望看到您发送邮件的代码。
    【解决方案3】:

    不确定这是否会对您的问题有所帮助,但值得一试,您可以通过将变量放在大括号 {$rush_part_style} 中并将其放入 HTML 中来避免将 PHP 连接到 HTML。这样可以避免关闭和重新打开 html。

    【讨论】:

    • 顺便说一句,这里不需要大括号来避免连接。 "" 或 " " 将回显变量,因为使用了双引号。不过,大括号对于数组成员或对象属性很有用,例如 " id}\">"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2014-07-21
    相关资源
    最近更新 更多