PHPMailer发送邮件失败,提示Undefined array key 'Note'
预约表单提交报错及修复方案
部署的预约表单在用户完成reCAPTCHA验证提交后,无法通过PHPMailer发送邮件,开启错误显示后提示index.php第71行存在E_WARNING: Undefined array key 'Note',更换邮件服务商后问题仍存在。
1. 修复index.php的Undefined数组键错误
页面首次加载时是GET请求,$_POST数组为空,直接访问$_POST['Note']等字段会触发警告。需为每个POST变量添加存在性检查:
修改index.php中变量赋值部分:
<?php $Azienda = $_POST['Azienda'] ?? ''; ?> <?php $Tipo = $_POST['Tipo'] ?? ''; ?> <?php $Citta = $_POST['Citta'] ?? ''; ?> <?php $Riferimento = $_POST['Riferimento'] ?? ''; ?> <?php $Email = $_POST['Email'] ?? ''; ?> <?php $Telefono = $_POST['Telefono'] ?? ''; ?> <?php $Note = $_POST['Note'] ?? ''; ?>
注:
??是PHP7+支持的null合并运算符,若键不存在则返回空字符串;PHP5.x可改用isset($_POST['Note']) ? $_POST['Note'] : ''
2. 确保表单提交到正确的处理脚本
当前表单未指定action属性,提交时会默认发送到当前页面(index.php),但邮件发送逻辑在submit.php中,需修改form标签:
<form id="target" method="post" action="submit.php">
3. 完善submit.php的参数校验与逻辑
- 添加POST参数存在性检查,避免发送邮件时访问未定义的数组键
- 修复CAPTCHA验证后的逻辑漏洞,当前验证失败后仍会执行邮件发送代码,需终止后续执行
修改submit.php关键部分:
// 检查必要POST参数是否存在 $requiredFields = ['Azienda', 'Citta', 'Riferimento', 'Telefono', 'Email', 'Note', 'g-recaptcha-response']; foreach ($requiredFields as $field) { if (!isset($_POST[$field]) || empty(trim($_POST[$field]))) { echo "请填写完整所有必填字段。"; exit(); } } // CAPTCHA验证 $recaptcha = new \ReCaptcha\ReCaptcha(CONTACTFORM_RECAPTCHA_SECRET_KEY); $resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_REQUEST['REMOTE_ADDR']); if (!$resp->isSuccess()) { $errors = $resp->getErrorCodes(); $error = $errors[0]; $recaptchaErrorMapping = [ 'missing-input-secret' => '未提交reCAPTCHA密钥。', 'invalid-input-secret' => '提交的reCAPTCHA密钥无效。', 'missing-input-response' => '未提交reCAPTCHA验证响应。', 'invalid-input-response' => '提交的reCAPTCHA验证响应无效。', 'bad-request' => '验证响应时发生未知错误。', 'timeout-or-duplicate' => '请求已失效,请重试。', ]; $errorMessage = $recaptchaErrorMapping[$error] ?? 'CAPTCHA验证失败,请重试。'; echo "请重新完成CAPTCHA验证:".$errorMessage; exit(); // 终止后续代码执行 } // 验证通过后再执行邮件发送逻辑 $mail = new \PHPMailer\PHPMailer\PHPMailer(true); try { // ... 原邮件配置代码 ... // Content $mail->Subject = "Appuntamento presso ".$_POST['Azienda']; $mail->Body = <<<EOT Appuntamento presso: {$_POST['Azienda']}, {$_POST['Citta']} il giorno {$_POST['Richiamare'] ?? ''} Riferimento: {$_POST['Riferimento']} Telefono: {$_POST['Telefono']} Email: {$_POST['Email']} Note: {$_POST['Note']} EOT; $mail->send(); echo "邮件发送成功。"; } catch (Exception $e) { echo "发送邮件时出错:". $mail->ErrorInfo; }
注:代码中
$_POST['Richiamare']在表单中未找到对应字段,需确认是否为DataAppuntamento或DataChiamata的笔误,若为笔误请替换为正确的字段名。
内容的提问来源于stack exchange,提问作者Stefano Zugni
相关产品推荐
相关产品推荐

