如何通过Ajax将html2pdf生成的PDF发送至PHPMailer作为附件
解决方案:将html2pdf生成的PDF通过Ajax发送至PHPMailer作为邮件附件
要实现这个需求,最优方案是将生成的PDF转为Blob对象,通过FormData发送给后端——相比直接传递dataURI字符串,这种方式更高效(dataURI是base64编码,体积会比原Blob大30%左右)。以下是具体实现步骤:
前端代码修改(JavaScript)
替换原有的本地保存逻辑,改为生成PDF后直接通过Ajax发送到后端:
// 获取要转为PDF的DOM元素 let page = document.getElementById('printPage'); // html2pdf配置项 var options = { margin: [5, 0, 0, 0], filename: 'test.pdf', image: { type: 'jpeg', quality: 1 }, pagebreak: { mode: ['legacy'] }, html2canvas: { scale: 3 }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } }; // 点击按钮生成PDF并发送至后端 $(document).on('click', '#saveBtn', function() { html2pdf().from(page).set(options).toPdf().get('pdf').then(function(pdf) { // 将PDF转为Blob对象 pdf.output('blob').then(function(blob) { // 构造FormData,用于传输文件 let formData = new FormData(); formData.append('pdf_file', blob, 'test.pdf'); // 第三个参数为附件显示的文件名 // 发送Ajax请求 $.ajax({ url: 'send_email.php', // 后端处理脚本的路径 type: 'POST', data: formData, processData: false, // 必须设为false,防止jQuery自动处理FormData contentType: false, // 必须设为false,让浏览器自动设置正确的Content-Type success: function(response) { console.log('邮件发送成功:', response); alert('PDF已作为附件发送成功'); }, error: function(xhr, status, error) { console.error('发送失败:', error); alert('发送失败,请重试'); } }); }); }); });
后端代码实现(PHP + PHPMailer)
创建send_email.php脚本,接收前端传递的PDF文件,用PHPMailer添加为附件并发送邮件:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; // 引入PHPMailer的核心文件(请根据你的实际安装路径调整) require 'path/to/PHPMailer/src/Exception.php'; require 'path/to/PHPMailer/src/PHPMailer.php'; require 'path/to/PHPMailer/src/SMTP.php'; // 检查是否接收到有效PDF文件 if (!isset($_FILES['pdf_file']) || $_FILES['pdf_file']['error'] !== UPLOAD_ERR_OK) { echo '未接收到有效PDF文件'; exit; } $mail = new PHPMailer(true); try { // SMTP服务器配置 $mail->SMTPDebug = 0; // 生产环境建议设为0,关闭调试输出 $mail->isSMTP(); $mail->Host = 'smtp.example.com'; // 你的SMTP服务器地址(如smtp.qq.com、smtp.gmail.com) $mail->SMTPAuth = true; $mail->Username = 'your_email@example.com'; // 发件邮箱账号 $mail->Password = 'your_email_password'; // 发件邮箱的密码或授权码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 加密方式,可选SMTPS(465端口)或TLS(587端口) $mail->Port = 465; // 对应加密方式的端口 // 收件人设置 $mail->setFrom('your_email@example.com', '发件人名称'); $mail->addAddress('recipient@example.com', '收件人名称'); // 目标收件邮箱 // 添加PDF附件 $mail->addAttachment($_FILES['pdf_file']['tmp_name'], 'test.pdf'); // 第一个参数是临时文件路径,第二个是附件显示名称 // 邮件内容配置 $mail->isHTML(true); $mail->Subject = '带有PDF附件的邮件'; $mail->Body = '<p>这是一封包含PDF附件的测试邮件。</p>'; $mail->AltBody = '这是纯文本格式的邮件内容,用于不支持HTML的邮件客户端'; $mail->send(); echo '邮件发送成功'; } catch (Exception $e) { echo "邮件发送失败: {$mail->ErrorInfo}"; } ?>
关键注意事项
- 前端必须设置
processData: false和contentType: false,否则jQuery会错误地处理FormData,导致后端无法正常接收文件 - 后端需要确保PHPMailer已正确安装,可通过Composer或手动下载引入
- 调整SMTP服务器配置为你实际使用的邮箱服务商参数(如QQ邮箱、Gmail等)
内容的提问来源于stack exchange,提问作者jamiegfinch
相关产品推荐
相关产品推荐

