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

html2pdf下载功能正常但邮件附件PDF为空问题排查求助

核心问题梳理

  1. 请求逻辑完全错位
    你把发邮件的PHP逻辑写在当前页面,页面首次加载(前端表单提交过来)时就会立即执行发邮件代码,但是此时前端的PDF生成逻辑是页面加载完成后延迟3秒才执行、且生成的PDF数据是发送给preview.php的,当前页面的PHP根本拿不到fileDataURI参数,自然附件是空的。
  2. Base64前缀替换错误
    html2pdf输出的标准data URI前缀是data:application/pdf;base64,,你写的带"Konform.pdf"的前缀根本不存在,替换操作完全没生效,base64解码出来的内容是无效的。
  3. PHPMailer附件参数错误
    addStringAttachment的第三个编码参数不能直接写base64,需要用PHPMailer内置的常量,而且缺少PDF的MIME类型声明,也会导致附件识别异常。

修复方案

第一步:调整请求逻辑

把当前页面的发邮件PHP代码全部迁移到preview.php里,当前页面只保留内容展示、PDF生成提交到preview.php的逻辑即可。

第二步:修正Base64替换代码

在preview.php中把替换逻辑改成:

$pdfdoc = $_POST['fileDataURI'];
// 正则匹配去掉所有可能的PDF data URI前缀,兼容不同输出格式
$b64file = preg_replace('/^data:application\/pdf;[^,]*base64,/', '', $pdfdoc);
$b64file = str_replace(' ', '+', $b64file);
$decoded_pdf = base64_decode($b64file, true);
// 增加解码校验,提前拦截无效内容
if (!$decoded_pdf) {
    die('PDF内容解析失败');
}

第三步:修正PHPMailer附件添加代码

$mail->addStringAttachment(
    $decoded_pdf, 
    "Kontrollformular ".$_POST['Consultant-Nummer'].".pdf",
    PHPMailer::ENCODING_BASE64,
    'application/pdf'
);

第四步:可选优化

不用固定延迟3秒生成PDF,可以改成页面DOM渲染完成后立即触发,也可以在用户点击下载PDF按钮的同时触发提交邮件的请求,避免异步请求未完成就跳转导致的数据丢失。

内容的提问来源于stack exchange,提问作者Dimitri Vlaanderen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:05