
本文介绍如何通过条件过滤,在 php 的 foreach 循环中仅保留指定键名的数据,从而避免向通知邮件中输出冗余字段(如 datavalue、transid 等),提升可读性与安全性。
在处理第三方支付 API(如 Authorize.Net)返回的原始响应数据时,常会遇到字段繁多、结构嵌套的问题。默认全量输出不仅增加邮件体积,还可能暴露敏感或无关信息(如 DataDescriptor、Terms、Card_Holder)。为精准控制邮件内容,应在遍历 $data 时主动过滤——只保留业务必需字段。
推荐做法是在主 foreach 循环中加入白名单校验,并使用 continue 跳过非目标键:
function sent_mail($data = array()) {
$whitelist = ['InvoiceID', 'Amount', 'Item_name', 'FirstName', 'LastName', 'Email', 'Website'];
$out = "";
foreach ($data as $k => $value) {
// 跳过不在白名单中的顶层键
if (!in_array($k, $whitelist)) {
continue;
}
if (is_array($value)) {
// 若值为数组(如多商品项),仍需进一步处理(可选:仅取首项或展开)
foreach ($value as $key => $v) {
// 注意:此处 $key 是子键,若需过滤子键也应加白名单逻辑
$out .= ucwords($key) . ' Name : ' . htmlspecialchars($v) . "
";
}
} else {
$out .= ucwords($k) . ' : ' . htmlspecialchars($value) . "
";
}
}
$msg = "Receipt Of Payment
" . $out;
$to = 'admin@example.com'; // 替换为真实邮箱,避免使用含 cf_email 的混淆写法
$subject = 'New Payment';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=utf-8\r\n"; // 建议升级为 UTF-8
// 生产环境请改用更可靠的邮件库(如 PHPMailer 或 SMTP)
@mail($to, $subject, $msg, $headers);
}✅ 关键优化点说明:
- 使用 in_array() + 静态白名单实现轻量级字段过滤,逻辑清晰、性能高效;
- 对输出内容添加 htmlspecialchars(),防止 XSS 风险(尤其当字段含用户输入时);
- 将邮件编码升级为 utf-8,兼容中文、特殊符号等;
- 注意:若 $data 中存在嵌套数组(如 'Items' => [['Item_name'=>'...', 'Item_Desc'=>...]]),当前逻辑会原样展开所有子键。如需进一步精简,可在内层循环也加入子键白名单(例如只保留 'Item_name');
- ⚠️ @mail() 已被广泛认为不够健壮,建议后续迁移到 PHPMailer 或 Symfony Mailer 等专业方案,以支持错误处理、附件、SMTP 认证等功能。
通过这一改造,邮件将严格只呈现 InvoiceID、Amount、Item_name、FirstName、LastName、Email 和 Website 这 7 个核心字段,既满足财务核对需求,又降低信息泄露风险。









