Laravel中使用CURL发送PDF附件失败求助
Laravel调用Mailgun API发送PDF附件报错的解决办法
先处理libpng警告(虽非直接报错,但可能间接影响回调逻辑)
- 这个警告是因为PDF内嵌入的图片带有不正确的sRGB色彩配置文件。直接用ImageMagick的
convert命令修复PDF:convert 原PDF路径 -strip 修复后PDF路径-strip参数会移除图片的ICC配置文件和多余元数据。如果是用dompdf/mpdf生成的PDF,直接在生成代码里添加配置禁用ICC嵌入:- dompdf:设置
$pdf->set_option('isRemoteEnabled', true);,同时确保生成时不保留图片冗余元数据 - mpdf:开启
$mpdf->stripImages = true;
- dompdf:设置
重点解决「Error: operation aborted by callback」
这个报错是CURL回调函数被中断导致的,按以下步骤排查:
- 检查CURL回调函数实现:
查看你设置的CURLOPT_WRITEFUNCTION或CURLOPT_PROGRESSFUNCTION有没有提前返回非0值,或者抛出未捕获的异常——这些情况都会直接终止CURL操作。 - 调大CURL超时参数:
当前项目环境可能网络延迟较高,给CURL添加超时设置:curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 整体请求超时60秒 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时10秒 - 验证multipart请求的boundary:
发送带附件的multipart/form-data请求时,boundary必须唯一且格式正确。用uniqid('', true)生成随机boundary,确保请求头和请求体中的boundary完全一致,不要出现拼写错误。 - 提高PHP内存限制:
如果PDF文件较大,当前项目的内存限制不足可能触发中断。临时调整内存限制:
也可以直接修改php.ini中的ini_set('memory_limit', '256M');memory_limit参数后重启服务。 - 替换为Mailgun官方SDK:
原生CURL在当前项目存在兼容性问题的话,直接使用官方包更稳定:- 安装依赖:
composer require mailgun/mailgun-php guzzlehttp/guzzle - 配置.env文件:添加
MAILGUN_DOMAIN=你的域名和MAILGUN_SECRET=你的API密钥 - 发送带附件的邮件代码:
use Mailgun\Mailgun; $mg = Mailgun::create(env('MAILGUN_SECRET')); $mg->messages()->send(env('MAILGUN_DOMAIN'), [ 'from' => '发件人 <sender@your-domain.com>', 'to' => '收件人 <recipient@example.com>', 'subject' => '带PDF附件的测试邮件', 'text' => '请查收附件的PDF文件。', 'attachment' => [ [ 'filePath' => storage_path('你生成的PDF路径'), 'filename' => '文档名称.pdf' ] ] ]); - 安装依赖:
额外验证步骤
- 用Postman直接调用Mailgun API发送该PDF附件,确认API本身是否能正常接收,排除项目环境外的问题
- 对比当前项目和正常项目的PHP版本、CURL扩展版本,某些CURL版本的回调逻辑存在兼容性bug,可尝试降级或升级PHP的CURL扩展(注意是PHP扩展,不是命令行CURL)
内容的提问来源于stack exchange,提问作者Erbi Silva
相关产品推荐
相关产品推荐

