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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:20:00