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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:22:32