PHP邮件脚本发送URI编码JSON内容时发送失败
问题描述
调试阶段的PHP邮件脚本,发送简单文本内容时运行正常,但发送URI编码后的JSON字符串时,脚本返回成功提示却始终收不到邮件。
调试用PHP脚本
<?php $subject = $_POST["subject"]; $message = $_POST["message"]; $to = "********@gmail.com"; $decodedJson = urldecode($message); $headers = "From: ****@ericd.net "; $headers .= "Reply-To: ****@ericd.net "; $headers .= "Content-Type: text/plain; charset=UTF-8 "; //$headers .= "Content-Type: application/x-www-form-urlencoded "; if (mail($to, $subject, $decodedJson, $headers)) { echo "OK. we sent " . $decodedJson; } else { echo "Failed"; } ?>
正常测试的curl命令
curl --data "subject=Hello%20There&message=Testing" http://******/script.php
发送JSON时的curl请求示例
curl --data "subject=Hello%20There&message=%7B%22Project%22%3A%22Eames%20II%20Purchase%20Journey%22%2C%22Description%22%3A%22Scenario..." http://******/script.php
需求:将JSON作为普通字符串包含在邮件中,示例JSON片段:
{"Project":"EEames II Purchase Journey","Description":"Scenario...
解决方案
- 修复邮件头换行格式:PHP的
mail()函数要求邮件头的分隔必须使用\r\n(CRLF),原脚本使用单纯的\n会导致邮件头解析异常,服务器可能拒收邮件。修改后的headers代码:$headers = "From: ****@ericd.net\r\n"; $headers .= "Reply-To: ****@ericd.net\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; - 移除多余的
urldecode调用:$_POST变量会自动对URL编码的内容解码,再次调用urldecode()会导致二次解码,产生乱码或特殊字符破坏邮件结构。直接使用原始$message即可:// 删除该行:$decodedJson = urldecode($message); if (mail($to, $subject, $message, $headers)) { echo "OK. we sent " . $message; } - 对邮件内容做编码处理(可选):如果JSON包含特殊字符或长文本,用
quoted_printable_encode()编码内容,避免触发邮件服务器反垃圾规则:$encodedMessage = quoted_printable_encode($message); if (mail($to, $subject, $encodedMessage, $headers)) { echo "OK. we sent " . $message; } - 检查垃圾邮件文件夹:JSON格式内容可能被邮件服务商反垃圾系统判定为可疑内容,先查看收件邮箱的垃圾邮件、垃圾箱目录。
内容的提问来源于stack exchange,提问作者Eric Dolecki
相关产品推荐
相关产品推荐

