You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将localStorage数据传递至PHPMailer实现邮件发送?

如何将localStorage中的商品列表传递给PHPMailer并随邮件发送?

一、前端代码调整

需要先从localStorage取出商品数据,和表单数据一起通过AJAX提交到后端,同时修正原代码中fetch请求的body格式错误:

  1. 获取并处理localStorage商品数据
    假设商品数据以JSON数组形式存在localStorage的cartProducts键下,先取出并转换为JS对象:
const cartProducts = JSON.parse(localStorage.getItem('cartProducts')) || [];
  1. 将商品数据加入FormData
    把商品数组转成JSON字符串,添加到表单数据集合中:
const formData = new FormData(form);
formData.append('cartProducts', JSON.stringify(cartProducts));
  1. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:27:39