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

PHP POST变量未定义数组键:表单数据未收集但邮件可发送

问题排查与修复方案

你的代码存在三个关键问题,导致表单信息无法收集、出现警告且邮件内容为空:

1. 表单字段名与PHP读取键名不匹配

表单里的textarea字段name是messagem,但PHP中你尝试读取$_POST['mensagem'],拼写错误(messagem vs mensagem),这直接触发"Undefined array key 'mensagem'"警告,且无法获取消息内容。

2. 单引号字符串无法解析变量

邮件内容的Body使用单引号包裹,PHP不会解析单引号内的变量,所以邮件里只会显示$nome、$telefone等字符串,而非实际表单值。

3. 未判断请求类型就读取POST数据

页面初始加载时是GET请求,此时$_POST数组为空,直接读取会触发"Undefined array key"警告,需要先判断是否为POST提交再处理。


修复后的完整代码:

<form class="form" action="phpmailer.php" method="post">
  <input class="font-v1" type="text" name="nome" placeholder="Nome..."><br><br>
  <input class="font-v1" type="text" name="telefone" placeholder="Telefone..."><br><br>
  <input class="font-v1" type="email" name="email" placeholder="Email..."><br><br>
  <textarea class="font-v1" name="mensagem" rows="10" cols="30" placeholder="Escreva sua mensagem aqui..."></textarea><br><br>
  <button class="font-v1 inner-border inner-outline" type="submit" name="enviar" value="Submit">
    <div class="line-button">Enviar</div>
  </button>
</form>

<?php
// 仅在POST提交时处理逻辑
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 用isset检查字段是否存在,避免警告
    $nome = isset($_POST['nome']) ? utf8_encode($_POST['nome']) : '';
    $telefone = isset($_POST['telefone']) ? utf8_encode($_POST['telefone']) : '';
    $email = isset($_POST['email']) ? utf8_encode($_POST['email']) : '';
    $mensagem = isset($_POST['mensagem']) ? utf8_encode($_POST['mensagem']) : '';
        
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    
    require 'PHPMailer/src/Exception.php';
    require 'PHPMailer/src/PHPMailer.php';
    require 'PHPMailer/src/SMTP.php';
    
    $mail = new PHPMailer(true);
    
    try {
        $mail->isSMTP();
        $mail->Host       = ''; // 填写你的SMTP服务器地址
        $mail->SMTPAuth   = true;
        $mail->Username   = ''; // 填写SMTP用户名(通常是完整邮箱)
        $mail->Password   = ''; // 填写SMTP密码
        $mail->SMTPSecure = 'tls';
        $mail->Port       = 587;                           
    
        $mail->setFrom(''); // 填写发件邮箱
        $mail->addAddress(''); // 填写收件邮箱
    
        $mail->isHTML(true);
        $mail->Subject = 'Contato pelo Site';
        // 用双引号包裹字符串,让变量被解析
        $mail->Body = "
        Você recebeu uma mensagém do site, enviado por:<br>
        Nome: $nome<br>
        Telefone: $telefone<br>
        E-mail: $email<br><br>
        Mensagem:<br>$mensagem
        ";
        
        $mail->AltBody = 'Mensagem em texto simples:
        Nome: ' . $nome . '
        Telefone: ' . $telefone . '
        E-mail: ' . $email . '
        Mensagem: ' . $mensagem;
    
        $mail->send();
        echo 'E-mail enviado com sucesso';
    
    } catch (Exception $e) {
        echo "O e-mail não pode ser enviado: {$mail->ErrorInfo}";
    }
}
?>

额外说明:

  • 合并了按钮重复的class属性;
  • 确保PHPMailer的文件路径正确,否则会导致类加载失败;
  • 文本格式的AltBody使用字符串拼接,保证变量能正常替换。

内容的提问来源于stack exchange,提问作者AndreBoeng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30