Ajax向PHP传递数据失败,导致邮件内容为空的问题求助
联系表单邮件内容为空的问题解决方法
核心问题:PHP变量拼写错误
你的PHP代码中,获取POST请求参数时错误使用了$POST,正确的超全局变量应该是$_POST(缺少下划线)。这导致前端传递的所有参数都无法被正确读取,最终邮件内容为空。
修正后的PHP代码
use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\SMTP; // 开启错误提示,方便调试(上线后建议关闭) error_reporting(E_ALL); ini_set('display_errors', 1); if(isset($_POST['name']) && isset($_POST['email'])){ // 修正$_POST拼写,同时转义输入防止XSS $name = htmlspecialchars($_POST['name']); $email = htmlspecialchars($_POST['email']); $subject = htmlspecialchars($_POST['subject']); $message = htmlspecialchars($_POST['message']); require_once $_SERVER['DOCUMENT_ROOT']."/php/includes/phpmailer/Exception.php"; require_once $_SERVER['DOCUMENT_ROOT']."/php/includes/phpmailer/PHPMailer.php"; require_once $_SERVER['DOCUMENT_ROOT']."/php/includes/phpmailer/SMTP.php"; try { $mail = new PHPMailer(true); // 启用异常模式 // SMTP Settings $mail->isSMTP(); $mail->Host = "secret"; $mail->SMTPAuth = true; $mail->Username = 'secret'; $mail->Password = 'secret'; $mail->Port = secret; $mail->SMTPSecure = "ssl"; // Email settings $mail->isHTML(true); $mail->setFrom($email, $name); $mail->addAddress("secret"); $mail->Subject = "$email ($subject)"; $MailBody = "From: ".$name."<br>"; $MailBody .= "Email: ".$email."<br>"; $MailBody .= "Message: ".$message."<br>"; $mail->Body = $MailBody; $mail->send(); $status = "success"; $response = "Email is sent !"; } catch (Exception $e) { $status = "failed"; $response = "Something is wrong: <br>".$mail->ErrorInfo; } exit(json_encode(array("status" => $status, "response" => $response))); }
额外优化建议
- 补充邮箱格式验证:JS端当前仅做非空校验,可增加邮箱格式检查,避免无效地址提交
- 统一表单字段命名:HTML中
subject输入框的name属性为subjects,但JS和PHP用的是subject,虽然AJAX方式不受影响,但建议统一为subject,避免后续传统表单提交出错 - 强化输入安全:用
htmlspecialchars()转义用户输入,防止HTML注入风险 - 异常捕获优化:启用PHPMailer异常模式,能更精准捕获邮件发送过程中的错误
内容的提问来源于stack exchange,提问作者Sanguinarias
相关产品推荐
相关产品推荐

