如何用PHP将JsPDF+Html2canvas生成的PDF发送为邮件附件?
实现将JsPDF生成的PDF通过PHP作为邮件附件发送
当然可以做到!你现在的代码是直接在前端触发PDF下载,咱们只需要把生成的PDF数据传给PHP后端,让后端来处理邮件发送的事情就行。下面是具体的实现步骤,分前端和后端两部分:
第一步:修改前端代码,把PDF数据传给PHP
原来的代码最后用pdf.save()直接下载PDF,咱们把这部分改成获取PDF的base64格式数据,再通过AJAX发送到PHP接口。修改后的前端函数如下:
function screenshot(){ var HTML_Width = $(".page_pdf").width(); var HTML_Height = $(".page_pdf").height(); var top_left_margin = 15; var PDF_Width = HTML_Width+(top_left_margin*2); var PDF_Height = (PDF_Width*1.5)+(top_left_margin*2); var canvas_image_width = HTML_Width; var canvas_image_height = HTML_Height; var totalPDFPages = Math.ceil(HTML_Height/PDF_Height-5); window.scrollTo(0,0); html2canvas($(".page_pdf")[0],{scale: 5}).then(function(canvas) { canvas.getContext('bitmaprenderer'); window.scrollTo(0,0); var imgData = canvas.toDataURL("image/jpeg", 1.0); var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]); pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin,canvas_image_width,canvas_image_height); for (var i = 1; i <= totalPDFPages; i++) { pdf.addPage(PDF_Width, PDF_Height); pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height); } // 替换原来的save逻辑,改为获取PDF数据并发送到PHP var pdfBase64 = pdf.output('datauristring'); // 获取带前缀的base64字符串 // 发送AJAX请求到PHP接口 $.ajax({ url: 'send_pdf_email.php', // 你的PHP文件路径 method: 'POST', data: { pdfData: pdfBase64, recipientEmail: '收件人邮箱@example.com', // 可以改成动态传入的值 emailSubject: '你的PDF文件附件' }, success: function(response) { alert('邮件发送成功!'); console.log(response); }, error: function(xhr, status, error) { alert('邮件发送失败,请检查后端日志'); console.error(error); } }); }); };
第二步:编写PHP后端代码发送邮件(使用PHPMailer)
推荐用PHPMailer处理邮件发送,它比PHP内置的mail()函数更可靠,处理附件也更方便。你可以通过Composer安装PHPMailer,或者直接下载源码引入项目。
下面是send_pdf_email.php的代码示例:
<?php // 引入PHPMailer(Composer安装的情况) require 'vendor/autoload.php'; // 如果是手动下载源码,替换成以下三行: // require 'PHPMailer/src/PHPMailer.php'; // require 'PHPMailer/src/SMTP.php'; // require 'PHPMailer/src/Exception.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; // 接收前端传来的参数 $pdfData = $_POST['pdfData'] ?? ''; $recipientEmail = $_POST['recipientEmail'] ?? ''; $emailSubject = $_POST['emailSubject'] ?? '生成的PDF附件'; if (empty($pdfData) || empty($recipientEmail)) { echo json_encode(['status' => 'error', 'message' => '缺少必要参数']); exit; } // 处理base64数据:去掉前缀"data:application/pdf;base64," $pdfBase64 = str_replace('data:application/pdf;base64,', '', $pdfData); // 解码成二进制数据 $pdfBinary = base64_decode($pdfBase64); // 初始化PHPMailer $mail = new PHPMailer(true); try { // 配置SMTP服务器(根据你的邮箱服务商调整) $mail->SMTPDebug = SMTP::DEBUG_OFF; // 上线时关闭调试,开发时可改为DEBUG_SERVER查看日志 $mail->isSMTP(); $mail->Host = 'smtp.example.com'; // 你的SMTP服务器地址,比如smtp.gmail.com $mail->SMTPAuth = true; $mail->Username = '你的发件邮箱@example.com'; $mail->Password = '你的邮箱密码/授权码'; // 注意:Gmail/QQ邮箱需要用应用授权码,不是登录密码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; // 常用SMTP端口:587(TLS)或465(SSL) // 设置发件人和收件人 $mail->setFrom('你的发件邮箱@example.com', '发送者名称'); $mail->addAddress($recipientEmail); // 添加PDF附件(直接传入二进制数据,无需保存到服务器文件) $mail->addStringAttachment($pdfBinary, 'liquidacion.pdf', PHPMailer::ENCODING_BASE64, 'application/pdf'); // 设置邮件内容 $mail->isHTML(true); $mail->Subject = $emailSubject; $mail->Body = '<p>您好,这是您的PDF文件附件,请查收。</p>'; $mail->AltBody = '您好,这是您的PDF文件附件,请查收。'; // 发送邮件 $mail->send(); echo json_encode(['status' => 'success', 'message' => '邮件发送成功']); } catch (Exception $e) { echo json_encode(['status' => 'error', 'message' => "邮件发送失败: {$mail->ErrorInfo}"]); } ?>
关键注意事项
- PHPMailer安装:如果服务器没有Composer,可直接下载PHPMailer源码,将
src目录文件放入项目,再调整PHP中的引入路径。 - SMTP配置:不同邮箱服务商的SMTP参数不同,比如Gmail需开启应用授权码,QQ邮箱需先开启POP3/SMTP服务。
- 大文件处理:如果PDF体积较大,需调整PHP配置中的
post_max_size和upload_max_filesize,避免请求被截断。 - 临时文件可选:若不想直接用二进制数据,可将解码后的PDF保存到服务器临时目录,再用
addAttachment()添加文件,发送完成后记得删除临时文件。
这样就能实现把前端生成的PDF直接通过PHP作为邮件附件发送,无需下载到本地啦!
内容的提问来源于stack exchange,提问作者Ivan Vidal
相关产品推荐
相关产品推荐

