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二进制内容
- 动态生成PDF的接口是否需要鉴权(Cookie、自定义请求头、登录态),
- 如果文件可以正常打开:说明是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
相关产品推荐
相关产品推荐

