【发布时间】:2015-07-09 08:31:40
【问题描述】:
我正在使用 PHP 生成一封输出 HTML 表格的电子邮件。表格的大部分内容都很好,但一些< 和> 字符被随机编码为< 和>。它并不总是在同一个地方进行。有时它只发生在一个地方,有时根本不发生,有时在多个地方发生。
这是我的电子邮件客户端看到的表格中间的代码 sn-p。注意不应该存在的插入的< /tr>:
<tr>
<td>SERVER_SOFTWARE</td>
<td>Apache/2.2.29 (Red Hat)</td>
</tr>
<tr>
<td>SERVER_PROTOCOL</td>
<td>HTTP/1.1</td>
< /tr>
</tr>
<tr>
<td>REQUEST_METHOD</td>
<td>POST</td>
</tr>
电子邮件明文部分中的同一段:(再次注意,</tr> 以某种方式被插入。)
SERVER_SOFTWARE Apache/2.2.29 (Red Hat)
SERVER_PROTOCOL HTTP/1.1 < /tr>
REQUEST_METHOD POST
我在发送前在标头中将其设置为 UTF-8:
$headers = "MIME-Version: 1.0\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: quoted-printable";
(附注:我之前使用charset=ISO-8859-1时遇到了完全相同的问题。)
但尽管如此,它还是以某种方式显示在US-ASCII:
Content-type: text/html;
charset="US-ASCII"
Content-transfer-encoding: quoted-printable
生成电子邮件的 PHP 脚本如下所示:
//generate $table
$indicesServer = array('PHP_SELF', 'argv', 'argc', 'GATEWAY_INTERFACE', 'SERVER_ADDR', 'SERVER_NAME', 'SERVER_SOFTWARE', 'SERVER_PROTOCOL', 'REQUEST_METHOD', 'REQUEST_TIME', 'REQUEST_TIME_FLOAT', 'QUERY_STRING', 'DOCUMENT_ROOT', 'HTTP_ACCEPT', 'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING', 'HTTP_ACCEPT_LANGUAGE', 'HTTP_CONNECTION', 'HTTP_HOST', 'HTTP_REFERER', 'HTTP_USER_AGENT', 'HTTPS', 'REMOTE_ADDR', 'REMOTE_HOST', 'REMOTE_PORT', 'REMOTE_USER', 'REDIRECT_REMOTE_USER', 'SCRIPT_FILENAME', 'SERVER_ADMIN', 'SERVER_PORT', 'SERVER_SIGNATURE', 'PATH_TRANSLATED', 'SCRIPT_NAME', 'REQUEST_URI', 'PHP_AUTH_DIGEST', 'PHP_AUTH_USER', 'PHP_AUTH_PW', 'AUTH_TYPE', 'PATH_INFO', 'ORIG_PATH_INFO') ;
$table = '<table cellpadding="3" cellspacing="0" border="1" bordercolor="#bbb">';
foreach ($indicesServer as $arg) {
if (isset($_SERVER[$arg])) {
$table .= '<tr><td>'.$arg.'</td><td>' . $_SERVER[$arg] . '</td></tr>' ;
} else {
$table .= '<tr><td>'.$arg.'</td><td>-</td></tr>' ;
}
}
$table .= '</table>' ;
//set up email
$to = [redacted];
$subject = [redacted];
$email_body = "Heres data:" . $table;
$headers = "MIME-Version: 1.0\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: quoted-printable";
//send email
mail($to, $subject, $email_body, $headers);
编辑:
我注意到 HTML 属性变得混乱了。它与等号的quoted-printable 编码有关。 = 按预期编码为 =3D,但有时下一个字符会被删除!因此发生了以下情况:
<a href="http://example.com">
变成
<a href=3D"ttp://example.com">
<table cellpadding=3 cellspacing=0 border=1>
变成
<table cellpadding<ellspacingorder=3D"&lt;tr">
【问题讨论】:
-
你试过
charset=ISO-8859-1吗? -
@PedroLobito,是的。已经在原始问题中提到了这一点。
-
你说得对,请原谅。
标签: php utf-8 ascii html-email quoted-printable