Laravel 11中调试邮件发送并输出SMTP对话的实现方案
Laravel 11 适配SMTP发送测试并打印SMTP对话代码
问题背景
需要一段用于测试Laravel邮件SMTP发送并打印SMTP对话的代码片段,SMTP对话包含的消息ID可用于追踪未送达的邮件。旧版Laravel中使用以下代码:
$to = 'foo@example.com'; Mail::getSwiftMailer()->registerPlugin(new Swift_Plugins_LoggerPlugin(new Swift_Plugins_Loggers_EchoLogger(false))); Mail::raw('Testmail', function ($message) use ($to) { $message->to($to)->subject('Testmail'); });
但在Laravel 11中运行时出现错误:
BadMethodCallException Method Illuminate\Mail\Mailer::getSwiftMailer does not exist.
原因是Laravel 11 采用 Symfony Mailer 替代了原有的 SwiftMailer,原有代码无法兼容,需要进行适配。
适配后的代码实现
基础实现:捕获消息ID与基础SMTP日志
use Symfony\Component\Mailer\EventListener\MessageLoggerListener; use Illuminate\Support\Facades\Mail; $to = 'foo@example.com'; // 获取Laravel封装的Symfony邮件传输实例 $transport = Mail::getSymfonyTransport(); // 初始化消息日志监听器,用于捕获邮件消息及相关元数据 $loggerListener = new MessageLoggerListener(); $transport->getDispatcher()->addSubscriber($loggerListener); // 发送测试邮件 Mail::raw('Testmail', function ($message) use ($to) { $message->to($to)->subject('Testmail'); }); // 输出捕获到的消息ID及基础信息 foreach ($loggerListener->getMessages() as $message) { echo "消息ID(Message-ID): " . $message->getHeaders()->get('Message-ID')->getValue() . "\n"; }
进阶实现:打印完整SMTP对话
若需要打印完整的SMTP交互对话,需为SMTP传输配置日志器,以下是控制台输出的示例:
use Symfony\Component\Mailer\EventListener\MessageLoggerListener; use Illuminate\Support\Facades\Mail; use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport; use Monolog\Logger; use Monolog\Handler\StreamHandler; use Symfony\Component\HttpClient\Logging\Logger as HttpClientLogger; $to = 'foo@example.com'; $transport = Mail::getSymfonyTransport(); // 配置Monolog日志器,将SMTP调试日志输出到控制台 $smtpLogger = new Logger('smtp_debug'); $smtpLogger->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG)); // 为SMTP传输绑定日志器 if ($transport instanceof EsmtpTransport) { $transport->setLogger(new HttpClientLogger($smtpLogger)); } // 添加消息监听器捕获消息ID $loggerListener = new MessageLoggerListener(); $transport->getDispatcher()->addSubscriber($loggerListener); // 发送测试邮件 Mail::raw('Testmail', function ($message) use ($to) { $message->to($to)->subject('Testmail'); }); // 输出消息ID foreach ($loggerListener->getMessages() as $message) { echo "\n消息ID(Message-ID): " . $message->getHeaders()->get('Message-ID')->getValue() . "\n"; }
说明
- Laravel 11 中
Mail::getSymfonyTransport()替代了旧版的getSwiftMailer(),用于获取底层邮件传输实例。 - Symfony Mailer 通过事件监听机制捕获邮件元数据,
MessageLoggerListener可获取邮件的消息ID等关键信息。 - 完整SMTP对话的打印依赖于为SMTP传输配置日志器,示例中使用Monolog将DEBUG级别的日志输出到控制台,也可配置为写入日志文件。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

