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
相关产品推荐
相关产品推荐

