使用jsPDF生成PDF通过PHPMailer发送无需本地保存附件损坏如何解决
解决方案
你遇到的PDF损坏问题由后端数据处理逻辑错误导致,按以下步骤修改即可:
错误原因
explode()拆分data URI后返回的是数组,你直接将数组$base传入附件方法,实际需要取拆分后的有效base64片段- 提取到的base64编码没有做解码处理,也未告知PHPMailer编码规则,导致附件内容为乱码
- POST传输时base64内的
+、空格等特殊字符会被自动url转义,未做解码会导致base64校验失败 - 代码中
$body变量未定义,会触发PHP警告,可能影响邮件正常生成
修正后的mail_send.php核心代码
require 'plugin/PHPMailer/class.phpmailer.php'; require 'plugin/PHPMailer/class.smtp.php'; require 'plugin/PHPMailer/PHPMailerAutoload.php'; if(!empty($_POST['data'])) { $mail = new PHPMailer(true); try { //Server settings $mail->SMTPDebug = false; $mail->isSMTP(); $mail->Host = 'smtp.test.com'; $mail->SMTPAuth = true; $mail->Username = 'smtpid@dot.com'; $mail->Password = 'password'; $mail->Port = 465; $mail->SMTPKeepAlive = true; $mail->SMTPSecure = 'ssl'; $mail->setFrom('setmail@mail.com', 'Mailer'); $mail->addAddress('user@mail.com', 'Joe User'); $mail->CharSet = "utf-8"; // 修正后的附件处理逻辑 $pdfData = urldecode($_POST['data']); $base = explode('data:application/pdf;base64,', $pdfData); $pdfContent = base64_decode(trim($base[1] ?? '')); if (!$pdfContent) { throw new Exception('无效的PDF数据'); } $mail->addStringAttachment($pdfContent, 'pdfName.pdf'); // 补充定义$body变量,根据你的需求修改正文内容 $body = '<p>您好,附件是您需要的PDF文件</p>'; $mail->isHTML(true); $mail->Body = $body; $mail->Subject = '这里是邮件主题'; $mail->AltBody = '这是纯文本邮件正文,供不支持HTML的邮件客户端展示'; $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } }
修改后即可直接通过base64数据生成附件,无需将PDF保存到服务器本地。
内容的提问来源于stack exchange,提问作者Jayee
相关产品推荐
相关产品推荐

