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

如何将JS生成的二维码通过PHPMailer发送至邮件

解决二维码生成后通过PHPMailer发送的问题

你当前的问题核心在于前端二维码数据传递逻辑错误和PHPMailer的addAttachment用法不符合要求,以下是分步解决方案:

一、修正前端二维码生成与数据传递代码

你的JS代码存在两处关键错误,先调整:

  1. personID是PHP直接输出的变量,不是DOM元素,无需.value调用
  2. 需从生成的canvas中获取dataURL,而非直接调用容器元素的toDataURL

修正后的前端代码:

<!-- 新增表单与隐藏输入字段,用于传递二维码数据 -->
<form id="qrForm" method="POST" action="你的邮件处理脚本路径.php">
  <input type="hidden" id="qrCodeValue" name="qrCodeValue">
  <button type="button" onclick="generateAndSubmit()">生成二维码并提交</button>
  <div id="QRImage"></div>
</form>

<script>
  var personID = <?php echo $personID; ?>;
  var QRImage = document.getElementById("QRImage");
  var NewImage = new QRCode(QRImage, {
    width: 200,
    height: 200
  });
  
  function generateAndSubmit() {
    // 直接使用personID生成二维码
    NewImage.makeCode(personID.toString());
    
    // 从canvas元素中获取二维码的dataURL
    var qrCanvas = QRImage.querySelector('canvas');
    var qrInput = document.getElementById("qrCodeValue");
    qrInput.value = qrCanvas.toDataURL('image/png');
    
    // 提交表单到后端处理邮件
    document.getElementById('qrForm').submit();
  }
</script>

二、后端接收并转换二维码数据

后端PHP需要将前端传来的dataURL转换为PHPMailer可识别的格式:

// 接收前端传递的二维码dataURL
$qrCodeDataURL = $_POST['qrCodeValue'] ?? '';
$qrBinaryData = '';

if (!empty($qrCodeDataURL)) {
    // 去除dataURL前缀,解码base64数据
    $qrRawData = str_replace('data:image/png;base64,', '', $qrCodeDataURL);
    $qrBinaryData = base64_decode($qrRawData);
}

三、修正PHPMailer发送逻辑

方式1:将二维码作为附件发送

addAttachment需要传入文件路径或二进制数据,结合转换后的二维码数据实现:

$mail->isHTML(true);
$mail->Subject = "Registration confirmation";
$mail->Body = '<p>Thank you for registering!</p>
    <ul>
        <li>First Name: '.$FirstName.'</li>
        <li>Last Name: '.$LastName.'</li>
        <li>Email: '.$Email.'</li>
        <li>Age: '.$Age.'</li>
        <li>Education: '.$Education.'</li>
    </ul>';

// 添加二维码附件(直接传入二进制数据)
if (!empty($qrBinaryData)) {
    $mail->addStringAttachment($qrBinaryData, 'registration_qr.png', 'base64', 'image/png');
}

// 执行发送
if (!$mail->send()) {
    echo '邮件发送失败: ' . $mail->ErrorInfo;
}

方式2:将二维码嵌入邮件正文

如果需要直接在邮件内容中显示二维码,使用addStringEmbeddedImage:

$mail->isHTML(true);
$mail->Subject = "Registration confirmation";

// 生成唯一的cid用于引用嵌入图片
$qrCid = 'registration_qr_' . uniqid();
if (!empty($qrBinaryData)) {
    $mail->addStringEmbeddedImage($qrBinaryData, $qrCid, 'registration_qr.png', 'base64', 'image/png');
}

// 在正文中通过cid引用二维码图片
$mail->Body = '<p>Thank you for registering!</p>
    <ul>
        <li>First Name: '.$FirstName.'</li>
        <li>Last Name: '.$LastName.'</li>
        <li>Email: '.$Email.'</li>
        <li>Age: '.$Age.'</li>
        <li>Education: '.$Education.'</li>
    </ul>
    <p>你的注册二维码:</p>
    <img src="cid:'.$qrCid.'" width="200" height="200" alt="Registration QR Code">';

// 执行发送
if (!$mail->send()) {
    echo '邮件发送失败: ' . $mail->ErrorInfo;
}

额外安全提示

你的SQL查询存在注入风险,建议替换为预处理语句:

$stmt = $db->prepare("SELECT PersonID FROM Users WHERE FirstName=? AND LastName=? AND Email=?");
$stmt->bind_param("sss", $FirstName, $LastName, $Email);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
    $row = $result->fetch_assoc();
    $personID = $row['PersonID'];
}
$stmt->close();

内容的提问来源于stack exchange,提问作者Ervin Borkovski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:52:55