
本文详解如何在 PHP 中正确接收 HTML 表单中 multiple 下拉框提交的数组型字段(如 name="first_level[]"),并通过 $_POST 安全获取、格式化,并嵌入邮件正文(支持纯文本与 HTML 模板),最终使用 mail() 或更可靠的替代方案发送。
本文详解如何在 php 中正确接收 html 表单中 `multiple` 下拉框提交的数组型字段(如 `name="first_level[]"`),并通过 `$_post` 安全获取、格式化,并嵌入邮件正文(支持纯文本与 html 模板),最终使用 `mail()` 或更可靠的替代方案发送。
在处理含多选下拉框(
✅ 正确接收多选值
在 email-script.php(即表单 action 指向的脚本)中,使用 $_POST 获取数组并安全转换为可读字符串:
// 安全获取并过滤数组字段(防止空数组或未提交时出错)
$firstLevel = isset($_POST['first_level']) && is_array($_POST['first_level'])
? array_map('trim', $_POST['first_level'])
: [];
$secondLevel = isset($_POST['second_level']) && is_array($_POST['second_level'])
? array_map('trim', $_POST['second_level'])
: [];
$thirdLevel = isset($_POST['third_level']) && is_array($_POST['third_level'])
? array_map('trim', $_POST['third_level'])
: [];
// 将数组转为逗号分隔字符串(适合邮件正文)
$firstLevelStr = !empty($firstLevel) ? implode(', ', $firstLevel) : '未选择';
$secondLevelStr = !empty($secondLevel) ? implode(', ', $secondLevel) : '未选择';
$thirdLevelStr = !empty($thirdLevel) ? implode(', ', $thirdLevel) : '未选择';
// 其他字段(字符串类型)同样需过滤
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: '';
$surname = filter_input(INPUT_POST, 'surname', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: '';
$phone = filter_input(INPUT_POST, 'phone', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: '';
✅ 构建结构化邮件内容(推荐 HTML 模板)
纯文本邮件易读性差,建议使用 HTML 邮件模板提升专业度。创建 email-template.html:
<meta charset="UTF-8"><h2>新联系表单提交</h2>
| 字段 | 内容 |
|---|---|
| 姓名 | |
| 姓氏 | |
| 电话 | |
| 一级分类 | |
| 二级分类 | |
| 三级分类 |
发送时间:
在 email-script.php 中加载并填充模板:
$template = file_get_contents('email-template.html');
$emailBody = str_replace([
'<?php echo htmlspecialchars($name); ?>',
'<?php echo htmlspecialchars($surname); ?>',
'<?php echo htmlspecialchars($phone); ?>',
'<?php echo htmlspecialchars($firstLevelStr); ?>',
'<?php echo htmlspecialchars($secondLevelStr); ?>',
'<?php echo htmlspecialchars($thirdLevelStr); ?>',
'<?php echo date(\'Y-m-d H:i:s\'); ?>'
], [
htmlspecialchars($name),
htmlspecialchars($surname),
htmlspecialchars($phone),
htmlspecialchars($firstLevelStr),
htmlspecialchars($secondLevelStr),
htmlspecialchars($thirdLevelStr),
date('Y-m-d H:i:s')
], $template);
// 设置邮件头(HTML 类型 + 字符编码)
$headers = "From: contact@yoursite.com\r\n";
$headers .= "Reply-To: " . ($email ?? 'contact@yoursite.com') . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
// 发送邮件(注意:mail() 在部分主机上受限,生产环境推荐 PHPMailer)
if (mail('admin@yoursite.com', '网站联系表单提交', $emailBody, $headers)) {
echo "邮件发送成功!";
} else {
error_log("邮件发送失败:" . print_r($_POST, true));
echo "提交失败,请稍后重试。";
}
⚠️ 重要注意事项
- 安全性优先:始终对 $_POST 数据执行 filter_input() 或 htmlspecialchars(),防止 XSS 和注入攻击;
- 文件上传需额外处理:当前表单含 enctype="multipart/form-data" 和附件字段,但示例未处理上传逻辑——若需发附件,必须使用 PHPMailer 或 SwiftMailer,mail() 原生不支持附件;
- mail() 的局限性:本地开发环境常无法发送,Linux 主机需配置 sendmail,Windows 需 SMTP;生产环境强烈推荐 PHPMailer,它支持 SMTP 认证、附件、HTML 邮件和错误诊断;
- 空数组校验:isset($_POST['xxx[]']) 是错误写法,应检查 isset($_POST['xxx']) && is_array(...);
- 前端验证不能替代后端:JavaScript 表单验证(如 validateEmailSendForm())仅作用户体验优化,服务端必须独立校验。
掌握多选字段的数组接收与模板化邮件构建,是构建专业表单系统的基础能力。从安全过滤、结构化呈现到可靠投递,每一步都影响用户体验与系统健壮性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











