Laravel 9日志邮件驱动输出含多余字符致验证链接失效求助
Laravel 9 Log邮件驱动日志内容含多余字符(=、边界标识)的解决办法
问题原因
Laravel 9 升级后,Log 邮件驱动默认采用 Symfony 的 LogTransport,会将邮件序列化为完整的 MIME 格式消息,带来两种干扰:
- Quoted-printable 编码:换行被替换为
=(软换行),导致链接被拆分 - MIME 边界标识:如
--443HnvBP--,用于分隔邮件文本/HTML 模块
而 Laravel 8 中 Log 驱动直接输出纯文本邮件内容,因此不会出现这些问题。
解决方法:自定义 Log 传输类,输出解码后的纯文本内容
步骤1:创建自定义 LogTransport 类
在 app/Mail/Transports/CustomLogTransport.php 中创建文件:
<?php namespace App\Mail\Transports; use Symfony\Component\Mailer\Transport\Log\LogTransport as BaseLogTransport; use Symfony\Component\Mime\MessageConverter; class CustomLogTransport extends BaseLogTransport { protected function logMessage(string $message): void { // 将MIME格式消息转换为Email对象 $email = MessageConverter::toEmail($message); // 获取邮件内容(优先HTML,无则用纯文本) $content = $email->getHtmlBody() ?? $email->getTextBody(); // 解码Quoted-printable编码,移除软换行的=符号 $decodedContent = quoted_printable_decode($content); // 整理日志输出格式,保留主题和清晰内容 $logContent = sprintf( '[Mail Log] Subject: %s%n%nContent:%n%s', $email->getSubject(), $decodedContent ); $this->logger->info($logContent); } }
步骤2:替换默认的 Log 驱动实现
在 app/Providers/AppServiceProvider.php 的 register 方法中添加代码:
use App\Mail\Transports\CustomLogTransport; use Illuminate\Mail\MailManager; public function register() { $this->app->extend(MailManager::class, function (MailManager $manager) { // 替换默认log邮件驱动逻辑 $manager->extend('log', function ($config) { return new CustomLogTransport($this->app['log']->driver()); }); return $manager; }); }
步骤3:测试验证
重新发送邮件后查看 storage/logs/laravel.log,邮件内容会以解码后的纯文本形式输出,链接完整无多余字符,可直接点击跳转。
临时手动修复(紧急场景用)
若暂时无法修改代码,可手动处理日志中的链接:
- 找到被拆分的链接片段,移除片段末尾的
=符号 - 将拆分的片段拼接成完整 URL 后访问
内容的提问来源于stack exchange,提问作者Sachin Kumar
相关产品推荐
相关产品推荐

