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

HTML转PDF后无法通过PHPMailer发送附件问题求助

问题分析与解决方案

Hey 我帮你找到了两个核心问题,这就是PDF无法作为附件发送的原因:

1. addAttachment 方法使用错误

PHPMailer的addAttachment()默认第一个参数是本地文件路径,但你传入的是Dompdf生成的PDF内容字符串,PHPMailer会把这个字符串当成文件路径去查找,自然找不到对应文件,所以无法添加附件。

要直接传入内容作为附件,需要指定完整参数:

  • 第一个参数:PDF内容字符串
  • 第二个参数:邮件中显示的附件文件名
  • 第三个参数:编码方式(固定为base64)
  • 第四个参数:MIME类型(PDF对应application/pdf)

正确写法:

$mail->addAttachment($fileupload, 'contract.pdf', 'base64', 'application/pdf');

2. stream() 调用顺序可能干扰内容获取

你先调用了$document->stream(),这个方法会直接把PDF输出到浏览器,虽然设置了预览模式,但它内部已经调用了output()方法。建议调整顺序:先获取PDF内容,再调用stream(),避免可能的内容丢失或输出干扰。

修改后的完整代码

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/Exception.php';

// 引入Dompdf命名空间
use Dompdf\Dompdf;

// 获取HTML页面内容
ob_start();
require("tractpage2.php");
$page = ob_get_contents();
ob_end_clean();

// 生成PDF
$document = new Dompdf();
$document->set_option('defaultFont', 'Courier');
$document->load_html($page);
$document->set_paper('A4', 'portrait');
$document->render();

// 先获取PDF内容,再输出到浏览器(如果需要预览)
$fileupload = $document->output();
$document->stream("contract.pdf", array("Attachment"=>0)); // 0=预览,1=下载

// 配置邮件
$message = "Am new to programming and loving it";
$mail = new PHPMailer(true); // 传入true启用异常处理,方便排查问题

try {
    // SMTP服务器设置
    $mail->SMTPDebug = 2; // 生产环境建议改为0,避免泄露敏感信息
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'xxxx@gmail.com';
    $mail->Password = 'xxxxxx'; // 若开启2FA,需使用Google应用专用密码
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // 收件人设置
    $mail->setFrom('xxxxx@gmail.com', 'james');
    $mail->addAddress('xxxx@aol.com', 'name of receiver');
    $mail->addAddress('xxxxx@yahoo.com');

    // 添加附件(修正后的写法)
    $mail->addAttachment($fileupload, 'contract.pdf', 'base64', 'application/pdf');

    // 邮件内容设置
    $mail->isHTML(true);
    $mail->Subject = 'Here is the subject';
    $mail->Body = $message;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>

额外注意事项

  • 如果你开启了Google账号的两步验证,不能直接用账号密码登录SMTP,需要生成应用专用密码代替。
  • 生产环境务必关闭SMTPDebug = 2,防止泄露SMTP账号密码等敏感信息。
  • 可以用var_dump($fileupload)检查是否成功获取到PDF内容,确保不是空字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:52