PHP联系表单特殊字符被替换删除 如何让$message正常发送
问题根源
你遇到的特殊字符异常是两个原因导致的:
- 你使用的
FILTER_SANITIZE_STRING过滤器默认行为就是移除HTML标签(所以包含<>的内容会被整体删除)、将单双引号转义为HTML实体(所以'变成'、"变成"),完全匹配你遇到的前三个异常现象。 - 邮件头没有指定UTF-8编码,UTF-8格式的英镑符号被邮件客户端用西欧编码解析,就会显示为
£。
具体修改步骤
1. 调整消息内容的过滤规则
把原代码中$message的过滤行:
$message = filter_var($_POST["msg"], FILTER_SANITIZE_STRING);
修改为直接获取原始内容即可,如果需要基础的去除首尾空白可以加trim:
$message = trim($_POST["msg"]);
如果后续你需要把消息以HTML格式展示,再单独使用htmlspecialchars($message)对内容做转义即可,不要在获取原始内容阶段做过滤。
提示:如果你希望用户名、主题字段也保留特殊字符,也可以对应替换掉这两个字段的FILTER_SANITIZE_STRING过滤规则,邮箱字段的FILTER_SANITIZE_EMAIL可以保留,不会影响正常使用。
2. 给邮件头添加UTF-8编码声明
把原代码中的邮件头配置部分:
$headers = 'From: myemail@mydomain.com' . "\r\n" . 'Reply-To: '.$user_email.'' . "\r\n" . 'Bcc: mysecondemail@hotmail.com' . "\r\n";
补充字符集声明:
$headers = 'From: myemail@mydomain.com' . "\r\n" . 'Reply-To: '.$user_email.'' . "\r\n" . 'Bcc: mysecondemail@hotmail.com' . "\r\n" . 'Content-Type: text/plain; charset=utf-8' . "\r\n";
如果你需要发送HTML格式的邮件,把text/plain改为text/html即可。
内容的提问来源于stack exchange,提问作者Bud
相关产品推荐
相关产品推荐

