
本文详解如何正确获取 bootstrap 联系表单中的用户输入(如姓名、邮箱、电话等),通过 phpmailer 构建完整邮件正文并发送,同时实现前端成功/失败提示的动态响应。
在使用 PHPMailer 处理 HTML 表单提交时,一个常见误区是多次调用 $mail->MsgHTML()(如 MsgHTML($_POST['name'])、MsgHTML($_POST['email']) 等)。这不会拼接内容,而是反复覆盖邮件正文——最终仅保留最后一次调用(通常是 $_POST['message'])的内容,导致关键字段(如姓名、电话、日期范围)全部丢失。
✅ 正确构建邮件正文的方式
推荐使用 PHP HEREDOC 语法 或 字符串拼接 统一组织所有表单字段。以下为优化后的核心 PHP 逻辑(已适配您 HTML 中的全部字段名):
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require "../PHPMailer-master/src/PHPMailer.php";
require "../PHPMailer-master/src/SMTP.php";
require "../PHPMailer-master/src/Exception.php";
$mail = new PHPMailer(true); // 启用异常模式,便于错误处理
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->SMTPOptions = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
];
$mail->Host = "mail.xxxx.com";
$mail->Port = 587;
$mail->Username = "your_username@domain.com"; // 请替换为真实邮箱
$mail->Password = "your_app_password"; // 推荐使用应用专用密码
$mail->setFrom("your_sender@domain.com", "Nouveau message sur le site");
$mail->addAddress("recipient@domain.com"); // 收件人地址
$mail->addReplyTo($_POST['email'] ?? 'no-reply@domain.com', $_POST['name'] ?? 'Expéditeur');
// ✅ 关键修正:一次性构建完整 HTML 邮件正文
$htmlBody = <<
Nouveau message de contact
Nom {$_POST['name'] ?? 'Non fourni'}
Prénom {$_POST['prenom'] ?? 'Non fourni'}
Email {$_POST['email'] ?? 'Non fourni'}
Téléphone {$_POST['subject'] ?? 'Non fourni'}
A partir du {$_POST['input_from'] ?? 'Non fourni'}
Au {$_POST['input_to'] ?? 'Non fourni'}
Message {nl2br(htmlspecialchars($_POST['message'] ?? ''))}
EOT;
$mail->isHTML(true);
$mail->Body = $htmlBody;
$mail->AltBody = "Nom: {$_POST['name'] ?? 'N/A'}\n"
. "Prénom: {$_POST['prenom'] ?? 'N/A'}\n"
. "Email: {$_POST['email'] ?? 'N/A'}\n"
. "Téléphone: {$_POST['subject'] ?? 'N/A'}\n"
. "A partir du: {$_POST['input_from'] ?? 'N/A'}\n"
. "Au: {$_POST['input_to'] ?? 'N/A'}\n"
. "Message: {$_POST['message'] ?? 'N/A'}";
// 发送并返回 JSON 响应(适配前端 AJAX)
try {
$mail->send();
echo json_encode(['status' => 'success', 'message' => 'Votre message a été envoyé. Merci !']);
} catch (Exception $e) {
error_log("PHPMailer Error: " . $e->getMessage());
echo json_encode(['status' => 'error', 'message' => 'Mailer Error: ' . $mail->ErrorInfo]);
} ? 前端提示动态显示(关键补充)
您 HTML 中已定义 .sent-message 和 .error-message 元素,但原表单是传统 method="post" 提交,会整页跳转。要复用这些提示,必须改用 AJAX 提交:
⚠️ 重要注意事项
- 字段名一致性:HTML 中 对应电话字段,但 PHP 中应使用 $_POST['subject'] —— 请确认该命名符合您的业务逻辑(建议改为 name="phone" 更语义化)。
-
安全性加固:
- 所有 $_POST 数据必须经过 htmlspecialchars()(HTML 模式)或 filter_var()(邮箱验证)过滤;
- 添加 CSRF Token(可选但推荐)防止跨站请求伪造;
- 验证邮箱格式:if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) die('Email invalide');
- PHPMailer 版本:确保使用 最新稳定版 PHPMailer,旧版存在已知漏洞;
- SMTP 凭据安全:切勿在代码中硬编码密码,应使用环境变量或配置文件(.env + dotenv 库)。
通过以上重构,您将获得一个健壮、安全、用户体验良好的联系表单系统:后端准确捕获全部字段并生成结构化邮件,前端无缝展示发送状态,无需页面刷新。
立即学习“PHP免费学习笔记(深入)”;











