如何将localStorage数据传递至PHPMailer实现邮件发送?
如何将localStorage中的商品列表传递给PHPMailer并随邮件发送?
一、前端代码调整
需要先从localStorage取出商品数据,和表单数据一起通过AJAX提交到后端,同时修正原代码中fetch请求的body格式错误:
- 获取并处理localStorage商品数据
假设商品数据以JSON数组形式存在localStorage的cartProducts键下,先取出并转换为JS对象:
const cartProducts = JSON.parse(localStorage.getItem('cartProducts')) || [];
- 将商品数据加入FormData
把商品数组转成JSON字符串,添加到表单数据集合中:
const formData = new FormData(form); formData.append('cartProducts', JSON.stringify(cartProducts));
- 修正AJAX请求逻辑
原代码的body写法错误,直接传递FormData即可,同时强制使用POST方法确保数据能正确传递:
if (ajax) { e.preventDefault(); const formAction = form.getAttribute('action') ? form.getAttribute('action').trim() : '#'; const formMethod = 'POST'; const formData = new FormData(form); // 从localStorage取商品数据并加入FormData const cartProducts = JSON.parse(localStorage.getItem('cartProducts')) || []; formData.append('cartProducts', JSON.stringify(cartProducts)); form.classList.add('_sending'); try { const response = await fetch(formAction, { method: formMethod, body: formData }); if (response.ok) { let responseResult = await response.json(); form.classList.remove('_sending'); formSent(form); } else { throw new Error('请求失败'); } } catch (err) { alert("Error"); form.classList.remove('_sending'); } }
二、后端PHPMailer代码修改
后端需要接收商品数据,解析后渲染到邮件内容中,同时添加数据过滤防止XSS攻击:
<?php // 初始化PHPMailer(请根据实际路径引入文件) 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); // 数据过滤函数,防止XSS function sanitize($data) { return htmlspecialchars(trim($data), ENT_QUOTES, 'UTF-8'); } $body = '<h1>Новий заказ!</h1>'; // 处理表单基础数据 $name = '<strong>' . sanitize($_POST['name']) . '</strong>'; $surname = '<strong>' . sanitize($_POST['surname']) . '</strong>'; $phone = '<strong>' . sanitize($_POST['phone']) . '</strong>'; $body .= 'Name: ' . $name . '<br>' . 'Surname: ' . $surname . '<br>' . 'Phone: ' . $phone . '<br><br>'; // 处理商品列表数据 if (!empty($_POST['cartProducts'])) { $cartProducts = json_decode($_POST['cartProducts'], true); if (is_array($cartProducts)) { $body .= '<h3>Заказані товари:</h3><ul>'; foreach ($cartProducts as $product) { // 过滤每个商品字段 $id = sanitize($product['id'] ?? ''); $name = sanitize($product['name'] ?? ''); $price = sanitize($product['price'] ?? ''); $weigh = sanitize($product['weigh'] ?? ''); $body .= "<li>ID: {$id}, Назва: {$name}, Ціна: {$price}, Вага: {$weigh}</li>"; } $body .= '</ul>'; } } try { // 配置SMTP参数(请填写你的实际配置) // $mail->isSMTP(); // $mail->Host = 'smtp.example.com'; // $mail->SMTPAuth = true; // $mail->Username = 'your-email@example.com'; // $mail->Password = 'your-password'; // $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // $mail->Port = 465; // 设置收件人、发件人等信息 // $mail->setFrom('from@example.com', 'Mailer'); // $mail->addAddress('recipient@example.com', 'Recipient'); $mail->isHTML(true); $mail->Subject = 'Новий заказ з сайту'; $mail->Body = $body; $mail->send(); $message = 'Success!'; } catch (Exception $e) { $message = 'Error: ' . $mail->ErrorInfo; } $response = ['message' => $message]; header('Content-type: application/json'); echo json_encode($response); ?>
关键注意事项
- 前端必须将商品数组转为JSON字符串再传递,因为FormData仅支持字符串类型
- 后端要验证
cartProducts是否为有效数组,避免JSON解析错误 - 所有用户输入数据都要经过
htmlspecialchars过滤,防止XSS注入
内容的提问来源于stack exchange,提问作者Default
相关产品推荐
相关产品推荐

