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

CodeIgniter中从视图发送动态邮件附件时PDF无法打开如何解决

问题解决方法

第一步:校验获取到的二进制内容合法性

首先排查远程获取的内容是否为有效PDF,在你的代码中加入如下测试代码:

$url = 'http://somewebsite.com/parameter';
// 可选配置:允许请求跟随跳转,避免因接口301/302跳转导致拿不到正确内容
$context = stream_context_create([
    'http' => [
        'follow_location' => true,
        'max_redirects' => 3
    ]
]);
$binary_content = file_get_contents($url, false, $context);
if ($binary_content === false) {
  throw new Exception("Could not fetch remote content from: '$url'");
}
// 新增测试代码,把内容写入本地文件校验
file_put_contents(__DIR__.'/test_output.pdf', $binary_content);

直接打开生成的test_output.pdf:

  • 如果文件无法打开:说明问题出在远程内容获取环节,和PHPMailer无关,继续排查以下问题:
    • 动态生成PDF的接口是否需要鉴权(Cookie、自定义请求头、登录态),file_get_contents默认发送的请求未携带对应参数,导致返回的是错误页面而非PDF内容,建议改用CURL发送请求,补全所需的请求头、Cookie等参数
    • 生成PDF的服务端代码存在多余输出,例如PHP代码开头/结尾的空白字符、BOM头、报错信息等,都会污染PDF二进制内容
  • 如果文件可以正常打开:说明是PHPMailer附件配置问题,继续执行第二步

第二步:修正PHPMailer附件调用参数

你的代码中AddStringAttachment的参数传递写法不规范,PHP 8.0以下版本不支持函数调用时的变量赋值写法,直接修改为如下写法即可:

// 去掉参数中的变量赋值写法,直接传对应值
$mail->AddStringAttachment($binary_content, "test.pdf", 'base64', 'application/pdf');

如果修改后还是无法打开,可先对内容做多余字符清理,避免服务端返回的内容带额外的开头/结尾空白:

// 清理内容开头的BOM、空白字符,和结尾的多余空白
$binary_content = preg_replace('/^\x{FEFF}\s*|\s*$/u', '', $binary_content);
$mail->AddStringAttachment($binary_content, "test.pdf", 'base64', 'application/pdf');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:36:00