如何将JS生成的二维码通过PHPMailer发送至邮件
解决二维码生成后通过PHPMailer发送的问题
你当前的问题核心在于前端二维码数据传递逻辑错误和PHPMailer的addAttachment用法不符合要求,以下是分步解决方案:
一、修正前端二维码生成与数据传递代码
你的JS代码存在两处关键错误,先调整:
personID是PHP直接输出的变量,不是DOM元素,无需.value调用- 需从生成的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
相关产品推荐
相关产品推荐

