You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:03:35