html2pdf下载功能正常但邮件附件PDF为空问题排查求助
核心问题梳理
- 请求逻辑完全错位
你把发邮件的PHP逻辑写在当前页面,页面首次加载(前端表单提交过来)时就会立即执行发邮件代码,但是此时前端的PDF生成逻辑是页面加载完成后延迟3秒才执行、且生成的PDF数据是发送给preview.php的,当前页面的PHP根本拿不到fileDataURI参数,自然附件是空的。 - Base64前缀替换错误
html2pdf输出的标准data URI前缀是data:application/pdf;base64,,你写的带"Konform.pdf"的前缀根本不存在,替换操作完全没生效,base64解码出来的内容是无效的。 - 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
相关产品推荐
相关产品推荐

