
本文详解如何在 PHP 中正确接收 HTML 表单中 multiple 下拉框提交的数组型字段(如 name="first_level[]"),并通过 $_POST 安全获取、格式化,并嵌入邮件正文(支持纯文本与 HTML 模板),最终使用 mail() 或更可靠的替代方案发送。
本文详解如何在 php 中正确接收 html 表单中 `multiple` 下拉框提交的数组型字段(如 `name="first_level[]"`),并通过 `$_post` 安全获取、格式化,并嵌入邮件正文(支持纯文本与 html 模板),最终使用 `mail()` 或更可靠的替代方案发送。
在处理含多选下拉框(<select multiple>)的联系表单时,关键在于:HTML 中必须为 <select> 设置 name="xxx[]"(带方括号),PHP 才会自动将其解析为数组;否则 $_POST['xxx'] 将仅返回最后一个选中值或 null。
✅ 正确接收多选值
在 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:
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"></head>
<body style="font-family: Arial, sans-serif; line-height: 1.6;">
<h2>新联系表单提交</h2>
<table border="1" cellspacing="0" cellpadding="8" style="border-collapse: collapse;">
<tr><th width="180">字段</th><th>内容</th></tr>
<tr><td><strong>姓名</strong></td><td><?php echo htmlspecialchars($name); ?></td></tr>
<tr><td><strong>姓氏</strong></td><td><?php echo htmlspecialchars($surname); ?></td></tr>
<tr><td><strong>电话</strong></td><td><?php echo htmlspecialchars($phone); ?></td></tr>
<tr><td><strong>一级分类</strong></td><td><?php echo htmlspecialchars($firstLevelStr); ?></td></tr>
<tr><td><strong>二级分类</strong></td><td><?php echo htmlspecialchars($secondLevelStr); ?></td></tr>
<tr><td><strong>三级分类</strong></td><td><?php echo htmlspecialchars($thirdLevelStr); ?></td></tr>
</table>
<p><em>发送时间:<?php echo date('Y-m-d H:i:s'); ?></em></p>
</body>
</html>在 email-script.php 中加载并填充模板:
立即学习“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())仅作用户体验优化,服务端必须独立校验。
掌握多选字段的数组接收与模板化邮件构建,是构建专业表单系统的基础能力。从安全过滤、结构化呈现到可靠投递,每一步都影响用户体验与系统健壮性。



















