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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:53:15